html - 如何将过渡应用于伪元素?
问题描述
我正在构建一个反应应用程序,但在伪元素上应用 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 元素上的样式或类时,转换才有效。
但是,如何在同一个伪元素上更改样式或类?
解决方案
.collapsed
在将class换成 时.expanded
,您忘记向.expanded
class 的伪元素添加转换。
.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>
推荐阅读
- git - 两个人可以在没有维护者权限的情况下将代码提交到同一个 PR 吗?
- python - Pandas 错误“只能比较标记相同的 DataFrame 对象”
- node.js - Node.JS + Apache - 无法获取
- r - 选择一个样本来匹配另一个数据集中的变量分布
- docker - 从 docker 连接到 office365 SMTP 时出现异常
- javascript - 如果我在每个 css 和 js 文件上使用 .min 方法来保护我的代码,这是否正常?
- typescript - 对函数返回值进行更严格的对象文字赋值检查?
- c# - Win2D 的 DrawText() 和 DrawTextLayout() 方法有什么区别?
- r - rbind 数据框后出现两个同名列表
- sql - SQL 根据一组值过滤重复项