css - 关键帧淡入,但如何让它在点击时淡出?
问题描述
我正在使用关键帧,因此在单击时淡入项目,但我希望它们在我再次单击时淡出。我如何使用关键帧来做到这一点?也许这是你不能用关键帧做的事情?
<div class="icon-wrap" onclick="bunAnimate(this)">
click me
</div>
<div class="primary__nav">
<ul id="primary" class="menu">
<li><a href="#">Link</a></li>
<li><a href="#">Link</a></li>
<li><a href="#">Link</a></li>
<li><a href="#">Link</a></li>
<li><a href="#">Link</a></li>
</ul>
</div>
.primary__nav {
display: none;
&.open {
display: block;
}
}
.icon-wrap {
cursor: pointer;
}
ul {
position: relative;
list-style-type: none;
display: flex;
margin-bottom: 0;
li {
opacity: 0;
-webkit-animation: fadeInRight 0.5s linear forwards;
animation: fadeInRight 0.5s linear forwards;
-webkit-animation-delay: 0.35s;
animation-delay: 0.35s;
}
li:nth-of-type(2) {
-webkit-animation-delay: 0.4s;
animation-delay: 0.4s;
}
li:nth-of-type(3) {
-webkit-animation-delay: 0.45s;
animation-delay: 0.45s;
}
li:nth-of-type(4) {
-webkit-animation-delay: 0.5s;
animation-delay: 0.5s;
}
li:nth-of-type(5) {
-webkit-animation-delay: 0.55s;
animation-delay: 0.55s;
}
}
@-webkit-keyframes fadeInRight {
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}
@keyframes fadeInRight {
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}
function bunAnimate(x) {
$(".icon-wrap").toggleClass("open");
$(".primary__nav").toggleClass("open");
}
解决方案
您可以通过或多或少地反转该过程使列表在单击时逐项淡出。
不过有一个小问题,不可能完全在 CSS 中完成,因为动画不会设置 display 属性,所以display: none
当淡出全部完成时,我们无法在主要 nav 元素上设置关键帧声明。我们通过引入另一个类来解决这个问题display
,我们通过 Javascript 调用它。这是用 a 相当粗略地完成的setTimeout
,通过监听动画的结束可能会更复杂,但它基本上是同一件事。
function bunAnimate(x) {
document.querySelector(".icon-wrap").classList.toggle("open");
if (!document.querySelector(".primary__nav").matches('.open')) {
document.querySelector(".primary__nav").classList.add("open");
document.querySelector(".primary__nav").classList.add('display'); //display immediately it's open
}
else {
document.querySelector(".primary__nav").classList.remove("open");
setTimeout(function () {
document.querySelector(".primary__nav").classList.remove("display");
},550);//unpleasant but animations don't allow setting of display
}
}
.primary__nav {
display: none;
}
.primary__nav.display{
display: block;
}
.icon-wrap {
cursor: pointer;
}
ul {
position: relative;
list-style-type: none;
display: flex;
margin-bottom: 0;
}
li {
animation-name: fadeOutLeft;
animation-timing-function: linear;
animation-fill-mode: forwards;
}
li:nth-of-type(1) {
animation-delay: 0.55s;
}
li:nth-of-type(2) {
animation-delay: 0.5s;
}
li:nth-of-type(3) {
animation-delay: 0.45s;
}
li:nth-of-type(4) {
animation-delay: 0.4s;
}
li:nth-of-type(5) {
animation-delay: 0.35s;
}
.open li {
display: block;
opacity: 0;
animation-name: fadeInRight;
}
.open li:nth-of-type(1) {
animation-delay: 0.35s;
}
.open li:nth-of-type(2) {
animation-delay: 0.4s;
}
.open li:nth-of-type(3) {
animation-delay: 0.45s;
}
.open li:nth-of-type(4) {
animation-delay: 0.5s;
}
.open li:nth-of-type(5) {
animation-delay: 0.55s;
}
@keyframes fadeInRight {
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}
@keyframes fadeOutLeft {
0% {
}
100% {
opacity: 0;
}
}
<div class="icon-wrap" onclick="bunAnimate(this)">
click me
</div>
<div class="primary__nav">
<ul id="primary" class="menu">
<li><a href="#">Link</a></li>
<li><a href="#">Link</a></li>
<li><a href="#">Link</a></li>
<li><a href="#">Link</a></li>
<li><a href="#">Link</a></li>
</ul>
</div>
注意:我使用纯 CSS,因为我不熟悉 SCSS。
推荐阅读
- node.js - 填充选项卡式表
- rust - 如何声明一个接受三种不同泛型类型并返回两个较大数的平方和的函数?
- python - 通过避免嵌套 for-for-if 循环中不必要的重复计算来加速脚本
- visual-studio - 如何在 Visual Studio 2019/2017 中查看内置成员函数
- kubernetes - cAdvisor Prometheus container_cpu_load_average_10s has two values
- python - 给定 XYZ 网格点,计算球体内部的体积
- entity-framework-core - oData - aspnetcore - 自定义控制器路由
- python - 遇到问题:“int”对象不可调用
- arrays - 如何在 Powershell 中引用对象内的数组
- azure - 在 Cloud shell 中运行 az cli 命令失败,并出现 UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8e in position 0: invalid start byte