Имеет ли opacity: 0 тот же эффект, что и visibility: hidden


119

Если да, то действительно ли это обесценивает visibilityсобственность?

(Я понимаю, что Internet Explorer еще не поддерживает это свойство CSS2.)
Сравнение механизмов компоновки

См. Также: В чем разница между visibility: hidden и display: none


4
А как насчет taborder? Если visible = false, элемент управления не получает фокуса, но если непрозрачность равна 0, возможно, клавиша табуляции все еще повторяется между элементами управления?
Стефан

Было бы интересно увидеть, как прозрачный элемент управления может получить фокус.
Крис Ной,

3
Я пробовал это, (FF3). Элемент ввода с непрозрачностью: 0 получает фокус в соответствии с порядком табуляции, хотя визуальной индикации нет. Курсор просто исчезает. Все, что вы вводите, вводится в значение элемента ввода. При повторном нажатии табуляции происходит переход к следующему полю. Интересный.
Крис Ной,

Ответы:


256

Вот подборка проверенной информации из различных ответов.

Каждое из этих свойств CSS уникально. Помимо того, что элемент не отображается, они имеют следующие дополнительные эффекты:

  1. Сворачивает пространство, которое элемент обычно занимает
  2. Реагирует на события (например, щелчок, нажатие клавиши)
  3. Участвует в табуляторе
                     свернуть события taborder
непрозрачность: 0 Нет Да Да
видимость: скрыта Нет Нет Нет
видимость: свернуть Да * Нет Нет
дисплей: нет да нет нет

* Да внутри элемента таблицы, в противном случае - Нет.


Итак, SO намеренно не поддерживает <table>. Итак, я сделал это ascii.
Крис Ной,

3
Кроме того, с "opacity: 0" Flash-объекты визуализируются и конструктор спрайта запускается, но с "visibility: hidden" нет.
pepkin88

Если ваше радио / флажки не работают visibility:hidden, вам нужно будет использовать opacity: 0вместо этого для обнаружения щелчка мыши.
dayuloli

7
@ChrisNoe: спасибо за резюме. Одна вещь, которую вы, возможно, захотите добавить: я только что исследовал, как сделать родительский узел невидимым, но дочерние узлы все еще видимыми, результат: нет шансов для видимых дочерних узлов :opacity:0 или display:none, но если вы используете, visibility: hidden вы можете сделать детей видимыми с помощьюvisibility: visible
Мартин

14

Нет.

Элементы с непрозрачностью создают новый контекст наложения.

Кроме того, спецификация CSS не определяет этого, но элементы с opacity:0кликабельными, а элементы с visibility:hiddenнет.


12

Нет. Существует большая разница. Они похожи, потому что вы можете видеть сквозь элемент, если видимость скрыта или непрозрачность равна 0, однако

непрозрачность: 0 : вы не можете нажимать на элементы за ним.

видимость: скрытый : вы можете нажимать на элементы позади него.


1
"Нет"? Означает ли это ответ на вопрос или ответ на один из существующих ответов? Если это позднее, то его следует добавить в качестве комментария под ответом, к которому он обращается.
Крис Ной

9
Это ответ на вопрос: «Имеет ли opacity: 0 тот же эффект, что и visibility: hidden?»… Но разве это не очевидно?
Nishant

5

Есть много различий между visibilityи opacity. В большинстве ответов упоминаются некоторые различия, но вот полный список.

  1. непрозрачность не наследуется, а видимость -

  2. прозрачность можно анимировать, а видимость - нет.
    (Ну, технически это так, но просто не определено поведение, скажем, для «37% свернутых и 63% скрытых», поэтому вы можете считать это неанимируемым.)

  3. Используя непрозрачность, вы не можете сделать дочерний элемент более непрозрачным, чем его родительский. Например, если у вас есть ap с цветом: черный и непрозрачностью: 0,5, вы не можете сделать ни один из его дочерних элементов полностью черным. Допустимые значения непрозрачности от 0 до 1, а в этом примере потребуется 2!
    Следовательно, согласно комментарию Мартина , у вас может быть видимый дочерний элемент (с видимостью: видимый) в невидимом родителе (с видимостью: скрытый). Это невозможно с непрозрачностью; если у родителя непрозрачность: 0; его дети всегда невидимы.

  4. В ответе Корнеля упоминается, что значения непрозрачности меньше 1 создают свой собственный контекст наложения; никакой ценности для видимости не имеет.
    (Хотел бы я придумать способ продемонстрировать это, но я не могу придумать никаких средств, чтобы показать контекст наложения элемента visibility: hidden.)

  5. Согласно ответу Филнаша , элементы с opacity: 0 по-прежнему читаются программами чтения с экрана, а элементы visible: hidden - нет.

  6. Согласно ответу Криса Ноу , у видимости есть больше опций (например, сворачивание), а элементы, которые не видны, больше не реагируют на щелчки и не могут быть добавлены вкладками.

(Сделать это вики сообщества, поскольку в противном случае заимствование из существующих ответов было бы нечестным.)


4

Я не совсем уверен в этом, но я думаю, что программы чтения с экрана не читают вещи, для которых задана скрытая видимость, но они могут читать вещи независимо от их прозрачности.

Это единственная разница, о которой я могу думать.


Как тогда это повлияет на результат? Может быть, с точки зрения того, что входит в DOM? Мои тестовые примеры показывают, что Mozilla не отказывается от видимости: скрытых элементов.
Крис Ной,

Элементы будут в DOM независимо от стиля CSS, я имею в виду, что слепые пользователи, использующие программу чтения с экрана, могут читать текст в элементе opacity: 0, тогда как они бы этого не сделали, если бы тот же элемент имел visibility: hidden. На самом деле это проблема доступности, потому что результат другой.
philnash

Полезный момент, это один из результатов установки скрытой видимости, но это лишь верхушка айсберга. В частности, visibility: hidden заставляет его (по-видимому) исчезнуть из dom, сохраняя при этом свой макет на странице.
Nishant

4

Я не совсем уверен, но вот как я делаю кроссбраузерную прозрачность:

opacity: 0.6;
-moz-opacity: 0.6;
filter: alpha(opacity=60);

объекты с Видимостью: скрытые по-прежнему имеют форму, они просто не видны. Элементы с нулевой непрозрачностью по-прежнему можно нажимать и реагировать на другие события.


Что значит иметь форму и быть невидимым?
Крис Ной,

@chris, это означает, что они все еще занимают место на странице
Митчел Селлерс

2
непрозрачность используется, чтобы решить, как элемент будет отображаться поверх фона. Если opactiy установлено в 0, элемент, естественно, занимает место, но ничего не отображается, потому что 0% цвета элемента смешивается со 100% фона, в результате чего ничего нового не появляется. скрытые и похожие друзья означают, что элемент пропускается при рисовании.
М.П.

2

Создавая стиль пользователя, который влияет на элементы в a contenteditable, я заметил, что если вы что-то устанавливаете visibility: hidden, то курсор ввода на самом деле не хочет с ним взаимодействовать. Например, если у вас есть

<div contenteditable><span style='visibility: hidden;'></span></div>

... тогда кажется, что если вы сфокусируете этот div / span, вы не сможете его ввести. В то время opacity: 0как, кажется, можно. Я не тестировал это подробно, но решил, что стоит упомянуть об этом здесь, поскольку никто на этой странице не говорил о влиянии на ввод текста. Возможно, это связано с упомянутыми выше событиями .



0

Свойства имеют разное семантическое значение. Хотя семантический CSS может показаться глупым, как отмечали другие пользователи, он влияет на такие устройства, как программы чтения с экрана, где семантика влияет на доступность страницы.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.