【问题标题】:CSS transition disabled by `display:none``display:none` 禁用了 CSS 过渡
【发布时间】:2021-10-17 00:15:45
【问题描述】:

我遇到了一个问题,似乎阻止 CSS 过渡在同时从 display:none 更改的元素上播放。

在以下示例中,div 具有相同的 CSS,只是将鼠标悬停在第一个上会隐藏其他两个。第二个div用visibility:hidden隐藏,第三个用display:none隐藏。

当您将鼠标悬停在第一个 div 上时,行为与预期一致:第一个 div 转换和其他两个被隐藏。当您将鼠标移开时,行为与我的预期不同:第一个 div 转换回正常状态,第二个 div 未隐藏然后转换回正常状态,但第三个 div 未隐藏并仍处于正常状态。

我期待第三个 div 与第二个 div 的行为相匹配,并且也被取消隐藏,然后恢复正常。

div{
  width:100px;
  height:50px;
  background:red;
  
  border-radius:50%;
  
  transition: border-radius 1s;
}

#hover:hover, #hover:hover ~ div{
  border-radius:0%;
}

#hover:hover ~ #hide1{
  visibility:hidden;
}

#hover:hover ~ #hide2{
  display:none;
}
<div id="hover">hover me for transition</div>
<div id="hide1">I transition back</div>
<div id="hide2">but I don't</div>

由于第二个 div 按预期工作,使用 visibility:hidden 和一些定位 CSS 很容易提出替代解决方案,但是否可以使用 display:none 仅在 CSS 中完成此操作?如果不是,为什么display:none 会以这种方式影响其他转换?

注意:这似乎很容易找到,但我的搜索只发现了有关尝试转换 display 属性本身的问题,而不是它对其他转换的副作用。

【问题讨论】:

  • 您不能在显示属性上应用过渡。为此,您可以使用 jQuery fadeIn/fadeOut。
  • @rmarif 我不想转换 display 属性。

标签: css


【解决方案1】:

simple explanation of display: none:

关闭元素的显示(对布局没有影响);全部 后代元素的显示也会关闭。 文件 呈现为好像该元素不存在

(强调我的)

过渡未触发,因为它从未启动。 div 在悬停时被完全删除,并以 border-radius: 50% 的初始状态返回。

解决方法

使用 display: none 仅使用 CSS 实现此效果的唯一可能方法是使用每次出现 display: none div 时都会触发的动画。

div {
  width: 100px;
  height: 50px;
  background: red;
  border-radius: 50%;
  transition: border-radius 1s;
  animation: display 1s;
}
#hover:hover,
#hover:hover ~ div {
  border-radius: 0%;
}
#hover:hover ~ #hide1 {
  visibility: hidden;
}
#hover:hover ~ #hide2 {
  display: none;
}
@keyframes display {
  0% {
    border-radius: 0;
  }
  100% {
    border-radius: 50%;
  }
}
<div id="hover">hover me for transition</div>
<div id="hide1">I transition back</div>
<div id="hide2">but I don't (unless I have an animation)</div>

【讨论】:

    【解决方案2】:

    不,你不能使用display:none;

    原因:

    当使用display:none; - 元素将被隐藏,页面将显示为好像该元素不存在一样。因此,当您将鼠标悬停在它上面时 - 元素被完全删除......并且 border-radius:0%; 永远不会被应用。当您将鼠标悬停时 - 元素立即显示为 css 告诉它 - 使用border-radius:50%;

    visibility:hidden; 隐藏一个元素,但该元素仍将占用与以前相同的空间。该元素将被隐藏,但仍会影响布局。

    【讨论】:

      【解决方案3】:

      你可以在 CSS 中使用 transition 作为数值属性,所以你应该使用 opacitytransition: all 1s 来做到这一点:

      div{
        width:100px;
        height:50px;
        background:red;
        
        border-radius:50%;
        
        transition: all 1s;
      }
      
      #hover:hover, #hover:hover ~ div{
        border-radius:0%;
      }
      
      #hover:hover ~ #hide1{
        visibility:hidden;
      }
      
      #hover:hover ~ #hide2{
        opacity: 0;
      }
      <div id="hover">hover me for transition</div>
      <div id="hide1">I transition back</div>
      <div id="hide2">but I don't</div>

      【讨论】:

      • 感谢您的回答,但我认为您误读了问题;这不是关于如何将 div 从可见过渡到不可见,而是关于如何在更改 display 的同时应用过渡。
      • @SeanLeBlanc 所以使用 jQuery,.fadeIn()fadeOut()fadeToggle()
      • 我正在寻找一个纯 CSS 解决方案,同样,我不是试图转换可见性(即淡入/淡出),我正在尝试转换其他属性(在这种情况下 @ 987654330@) 而display 属性正在瞬间改变。
      【解决方案4】:

      div{
        width:100px;
        height:50px;
        background:red;
        border-radius:50%;
        transition: border-radius 1s;
      }
      
      #hover:hover, #hover:hover ~ div{
        border-radius:0%;
      }
      
      #hover:hover ~ #hide1{
        visibility:hidden;
      }
      
      #hover:hover ~ #hide2{
        visibility: hidden;
      }
      <div id="hover">hover me for transition</div>
      <div id="hide1">I transition back</div>
      <div id="hide2">but I don't</div>

      这会奏效。鼠标移出第三个 div 也有过渡。

      【讨论】:

      • display:None的情况下是不可能的
      • 如果不可能,你有解释原因吗?
      • display:none; 在页面中将不可用并且不占用任何空间。 visibility:hidden 隐藏了一个元素,但它仍会占用与以前相同的空间。该元素将被隐藏,但仍会影响布局。
      • 是的,我已经知道这一点,并在问题中提到,使用visibility:hidden 很容易通过一些额外的定位 CSS 来实现相同的效果。我试图找出如何使用display:none 产生相同的行为,或者解释为什么它不可能。
      • 'visibility' 属性指定元素生成的框是否被渲染。 visibility:hidden; :生成的盒子是不可见的(完全透明,什么都没有画出来),但仍然影响布局。但是在display:None 的情况下,一个元素不会出现在格式化结构中(即,在视觉媒体中,该元素不会生成框并且对布局没有影响)。后代元素也不生成任何框;元素及其内容完全从格式化结构中删除。“无”的显示不会创建不可见的框;它根本不会创建任何盒子。
      猜你喜欢
      • 2018-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-16
      • 1970-01-01
      • 2019-01-30
      • 2020-10-14
      相关资源
      最近更新 更多