【问题标题】:How do I apply transitions to pseudo elements?如何将过渡应用于伪元素?
【发布时间】:2021-04-26 14:11:47
【问题描述】:

我正在构建一个反应应用程序,但在对伪元素应用 CSS 过渡时遇到问题。

这是伪元素的类:

.collapsed::before {
    content: '';
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background-image: linear-gradient(transparent, transparent, white, white);
    z-index: 100;
    opacity: 1;
  transition: opacity 2s;
}

这会在“折叠”的 div 顶部创建一个叠加层,具有以下效果:

当用户单击“阅读更多”按钮时,我希望白色渐变消失。所以我有这个类:

.expanded::before {
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-image: linear-gradient(transparent, transparent, white, white);
  z-index: 100;
  opacity: 0;
}

当用户单击 READ MORE 按钮时,我换出 .collapsed 类并应用 .expanded 类。这个想法是 .collapsed::before 伪元素的不透明度为 1,不透明度过渡为 2 秒。 .expanded::before 伪元素的不透明度为 0。所以我希望不透明度在 2 秒内从 1 过渡到 0。

但它不起作用。我的猜测是,这是因为折叠的伪元素与展开的伪元素是不同的元素。仅当您更改 SAME 元素上的样式或类时,转换才有效。

那么如何改变同一个伪元素的样式或类呢?

【问题讨论】:

    标签: html css css-transitions pseudo-element


    【解决方案1】:

    在将.collapsed 类换成.expanded 时,您忘记向.expanded 类的伪元素添加过渡。

    .expanded::before {
      content: '';
      position: absolute;
      top: 0;
      left: 0;
      width: 100%;
      height: 100%;
      background-image: linear-gradient(transparent, transparent, white, white);
      z-index: 100;
      opacity: 0;
      transition: opacity 2s; // added transition. 
    }
    

    这里是演示。

    var readmore = document.getElementsByClassName('read-more');
    var card = document.getElementsByClassName('card');
    
    function toggle() {
      for (var i = 0; i < card.length; i++) {
          if (card[i].classList.contains('collapsed')) {
            card[i].classList.remove('collapsed')
             card[i].classList.add('expanded');
          } 
          else {
            card[i].classList.add('collapsed');
            card[i].classList.remove('expanded');
          }
        }
    }
    .card {
      position: relative;  
    }
    
    .collapsed::before {
        content: '';
        position: absolute;
        top: 0;
        left: 0;
        width: 100%;
        height: 100%;
        background-image: linear-gradient(transparent, transparent, white, white);
        z-index: 100;
        opacity: 1;
      transition: opacity 2s;
    }
    
    .expanded::before {
      content: '';
      position: absolute;
      top: 0;
      left: 0;
      width: 100%;
      height: 100%;
      background-image: linear-gradient(transparent, transparent, white, white);
      z-index: 100;
      opacity: 0;
      transition: opacity 2s;
    }
    <div class="wrapper">
      <div  class="card collapsed">
      <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quas repudiandae iusto nihil veritatis officia, veniam. Fugit saepe, culpa nihil modi repellendus quos velit assumenda, ipsa, pariatur expedita voluptas quaerat debitis! Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quas repudiandae iusto nihil veritatis officia, veniam. Fugit saepe, culpa nihil modi repellendus quos velit assumenda, ipsa, pariatur expedita voluptas quaerat debitis!</p>
      </div>
      <a id="read_more" class="read-more" href="javascript: void(0)" onClick="toggle()">Read more</a>
    </div>

    【讨论】:

    • 啊,谢谢 Jinu。那行得通。事实上,我什至不需要折叠类中的过渡。所以我猜想转换是在目标类中进行的。只是好奇......如果折叠类和展开类都定义了自己的伪元素,那些伪元素不是不同的元素吗?
    猜你喜欢
    • 1970-01-01
    • 2016-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-28
    • 2015-12-28
    • 1970-01-01
    • 2017-01-22
    相关资源
    最近更新 更多