参考链接

opacity: 0、visibility: hidden、display: none三者区别

display: none、visibility: hidden与opacity: 0的区别

第 57 题:分析比较 opacity: 0、visibility: hidden、display: none 优劣和适用场景 #100

display: nonevisibility: hiddenopacity: 0 的区别

结构:

display: none; 让元素完全从渲染树中消失,渲染的时候不占据任何空间

visibility: hidden; 不会让元素从渲染树消失,渲染元素继续占据空间,只是内容不可见。

opacity: 0; 不会让元素从渲染树消失,渲染元素继续占据空间,只是内容不可见。

继承:

display: none;opacity: 0;非继承属性,通过修改子孙节点属性无法显示

visibility: hidden;继承属性,通过设置 visibility: visible; 可以让子孙节点显示

性能:

display: none; 触发回流(重排),消耗性能较大

visibility: hidden; 触发重绘,消耗性能较少

opacity: 0; 一般情况会造成重绘,使用 anmimation 动画则不触发重绘,重建图层,性能较高

  • 在一般情况下,opacity 会触发重绘,即 Recalculate style => Update Layer Tree。不管你是否开启GPU提升为合成层与否
  • 如果利用 animation 动画,对 opacity 做变化(animation会默认触发GPU加速),则只会触发 GPU 层面的 composite,不会触发重绘。

事件监听:

display: none;visibility: hidden; 无法进行 DOM 事件监听。

opacity: 0; 可继续监听 DOM 事件。

transition:

前端新手村Transition

CSS animated properties

(测试案例见补充)

  • display 不被 transition 支持。
  • visibility 会立即显示,隐藏时会延时。
  • opacity 可以延时显示和隐藏。

补充

transition

HTML

  1. <input id="c1" type="checkbox">
  2. <div class="box"></div>

CSS

  1. #c1:checked ~ .box {
  2. display: block;
  3. /*visibility: visible;*/
  4. /*opacity: 1;*/
  5. }
  6. .box {
  7. height: 100px;
  8. width: 100px;
  9. background-color: #0a0;
  10. margin-left: 50px;
  11. transition: 1s -.3s linear;
  12. display: none;
  13. /*visibility: hidden;*/
  14. /*opacity: 0;*/
  15. }

display

CSS displaynone和visibilityhidden、opacity 0的区别 - 图1

visibility

CSS displaynone和visibilityhidden、opacity 0的区别 - 图2

opacity

CSS displaynone和visibilityhidden、opacity 0的区别 - 图3

ol + li

使用 ol+li 计数时,display: noneli 是不参与计数的,而 visibility: hiddenopacity: 0; 参与计数。

HTML

  1. <p>这是ol + li</p>
  2. <ol>
  3. <li class="one">1</li>
  4. <li>2</li>
  5. <li>3</li>
  6. </ol>

CSS

  1. .one { display: none; }

CSS displaynone和visibilityhidden、opacity 0的区别 - 图4

  1. .one { visibility: hidden; }

CSS displaynone和visibilityhidden、opacity 0的区别 - 图5

  1. .one { opacity: 0; }

CSS displaynone和visibilityhidden、opacity 0的区别 - 图6

搜索引擎会过滤掉display: none 中的内容。