- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试构建一个下拉菜单,首先下拉菜单会向下滑动,然后从底部逐一显示菜单项。悬停时,它看起来不错,但我不知道如何在悬停时顺利播放。我要做的是先隐藏第二个子菜单项,然后是第一个子菜单项,然后下拉菜单向上滑动。
我尝试的是在默认情况下将具有延迟的隐藏动画关键帧添加到下拉列表中,并在悬停时添加具有 0 延迟的显示动画。但是你可以看到它不能正常工作。(它也会在页面加载时动画,这对我不利)
ul li ul {
-webkit-animation: hideDropdown 1s;
-webkit-animation-delay: 0.5s;
}
ul li:hover ul {
-webkit-animation: showDropdown 1s forwards;
-webkit-animation-delay: 0s;
}
Fiddle Demo (使用 SCSS)
最佳答案
正如我在对问题的评论中指出的那样,制作动画的反向效果总是很复杂。这并非不可能,只是需要额外的编码(如额外的关键帧)和调整所有相关属性才能达到完美的效果。
如果还需要实现反向效果,则使用 transition
是最佳选择。完全有可能在使用过渡之后产生效果,这与使用动画的方式非常相似。在 :hover
选择器中,应用 transition
设置,使得 :first-child
的延迟低于第二个(以及后续的子级),因此它首先出现并在默认选择器中应用 transition
设置,这样 :first-child
的延迟比其他的要高。
使用过渡还可以避免在页面加载时显示动画。这是因为只有在状态从一个状态更改到另一个状态时才会发生转换。
body {
background: #f1f1f1;
}
ul {
height: 100px;
position: relative;
background: #fff;
}
ul li {
display: block;
float: left;
margin: 0;
list-style-type: none;
padding: 0;
}
ul li a {
display: block;
height: 100px;
line-height: 100px;
padding: 0 20px;
}
ul li ul {
position: absolute;
left: 0px;
right: 0px;
top: 100px;
height: 0px;
opacity: 0;
visibility: hidden;
transition: all 1s 0.5s;
}
ul li ul li {
position: absolute;
left: 50px;
bottom: 0px;
width: 200px;
overflow: hidden;
height: 100px;
}
ul li ul li a {
display: block;
height: 100px;
background: red;
padding: 0 20px;
position: absolute;
opacity: 0;
transform: translate(0px, 100px);
transition: all 1s 0.2s;
}
ul li ul li:first-child a {
transition-delay: 0.4s;
}
ul li ul li:last-child {
left: 250px;
}
ul li ul li:last-child a {
transition-delay: 0.2s;
}
ul li:hover ul {
height: 100px;
opacity: 1;
visibility: visible;
transition: all 1s 0s;
}
ul li:hover ul li a {
opacity: 1;
transform: translate(0px, 0px);
transition: all 1s 0.2s;
}
ul li:hover ul li:last-child a {
transition-delay: 0.4s;
}
<ul>
<li>
<a href="#">Dropdown</a>
<ul>
<li><a href="">First</a></li>
<li><a href="">second</a></li>
</ul>
</li>
<li><a href="">Not dropdown</a></li>
</ul>
注意:在上面的代码片段中,我使用了编译后的 CSS 并删除了所有 -webkit-
前缀,使其在所有浏览器上都可以查看。如果你想要带前缀的 SCSS 代码,你可以找到它 here .
说了这么多,我仍然想解释是什么造成了您的 animation
演示的问题。你做了很多正确的工作,你几乎接近实现你想要的。
动画的工作方式是,一旦应用动画的选择器不再适用,动画就会被移除(丢失),并且元素会立即恢复到其默认或原始状态。即使在悬停时应用了另一个动画,在反向动画的关键帧设置中指定的属性也不会被应用直到它们的延迟时间过去。这意味着 ul
和 a
恢复为不可见(通过 opacity
或 visibility
设置),变为动画开始时再次可见(通过 from
关键帧),然后动画到结束状态(通过 to
关键帧再次不可见)。
解决这个问题的方法是将animation-fill-mode:backwards
设置为ul
和a
(未悬停状态)。此设置意味着该元素即使在延迟期间也会采用 from
关键帧中指定的属性。
body {
background: #f1f1f1;
}
ul {
height: 100px;
position: relative;
background: #fff;
}
ul li {
display: block;
float: left;
margin: 0;
list-style-type: none;
padding: 0;
}
ul li a {
display: block;
height: 100px;
line-height: 100px;
padding: 0 20px;
}
ul li ul {
position: absolute;
left: 0px;
right: 0px;
top: 100px;
height: 0px;
visibility: hidden;
animation: hideDropdown 1s;
animation-delay: 0.5s;
animation-fill-mode: backwards;
}
ul li ul li {
position: absolute;
left: 50px;
bottom: 0px;
width: 200px;
overflow: hidden;
height: 100px;
}
ul li ul li a {
display: block;
height: 100px;
background: red;
padding: 0 20px;
position: absolute;
opacity: 0;
transform: translate(0px, 100px);
animation: hideDropdownItem 1s 0.2s;
animation-fill-mode: backwards;
}
ul li ul li:first-child a {
animation-delay: 0.4s;
}
ul li ul li:last-child {
left: 250px;
}
ul li ul li:last-child a {
animation-delay: 0.2s;
}
ul li:hover ul {
animation: showDropdown 1s forwards;
animation-delay: 0s;
}
ul li:hover ul li a {
animation: showDropdownItem 1s forwards 0.2s;
}
ul li:hover ul li:last-child a {
animation-delay: 0.4s;
}
@keyframes showDropdown {
from {
opacity: 0;
height: 0;
visibility: hidden;
}
to {
height: 100px;
opacity: 1;
visibility: visible;
}
}
@keyframes hideDropdown {
from {
height: 100px;
opacity: 1;
visibility: visible;
}
to {
opacity: 0;
height: 0;
visibility: hidden;
}
}
@keyframes showDropdownItem {
from {
opacity: 0;
transform: translate(0px, 100px);
}
to {
opacity: 1;
transform: translate(0px, 0px);
}
}
@keyframes hideDropdownItem {
from {
opacity: 1;
transform: translate(0px, 0px);
}
to {
opacity: 0;
transform: translate(0px, 100px);
}
}
<ul>
<li>
<a href="#">Dropdown</a>
<ul>
<li><a href="">First</a>
</li>
<li><a href="">second</a>
</li>
</ul>
</li>
<li><a href="">Not dropdown</a>
</li>
</ul>
注意: 与第一个片段相同,上面的片段也使用没有前缀的纯 CSS。带前缀的 SCSS 版本可用 here .
但如前所述,这不会阻止动画在页面加载时可见。阻止这种情况的唯一方法是使用 JavaScript。
关于css - 如何播放反向关键帧动画以悬停?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35196848/
是否有一个 FFMPEG 命令,如果我们传递一个视频文件,在每个场景更改时它都应该为它生成一个关键帧。我理解的关键帧是视频的一系列文件(图像或视频)文件,可用于在视频悬停时播放。请让我们知道我们是否可
我正在切换我通过带有 JQuery 的 toggleClass 触发的一系列动画/过渡。 其中一个动画正在使用以下内容: .header { transition: all .3s ease-
我有一些图片可以在关键帧中很好地滚动 @-webkit-keyframes headImage /* Safari and Chrome */ { 0% {background:url(../imag
尝试用 jQuery 制作一个简单的重复关键帧动画 $(document).ready(function() { $('body').mouseover(function() {
我在 richard bradshaw 找到了一个关于 css3 transitions 的很好的教程,可以在 http://css3.bradshawenterprises.com/cfimg/ 我
我正在尝试使用@keyframes 为背景交换设置动画。背景是径向渐变。背景发生变化,但不是动画。 #mydiv { background: radial-gradient(circle at 90%
如果单击按钮 2,您将看到动画运行。但是,当我使用另一个功能对按钮进行更改(选中复选框以显示。隐藏按钮)时,动画会再次运行,就像再次按下一样。 如何防止每次单独的函数对按钮进行更改时触发动画?即在切换
所以我创建了图像生成器(生成 RGB 的非常简单的一个)我希望能够将一定数量的图像转换为 H264 关键帧+相关帧(lats 说 100)所以在生成的每 100 帧上我需要将它们编码为 H264 .怎
我一直在尝试自学一些带有关键帧的 css 动画,我正在尝试创建一些东西,其中有一个小方 block 落下,然后从那个方 block 中,一个矩形从左边突出,然后显示一些大约 8 秒后发短信,然后 re
我意识到我不能简单地通过用逗号分隔@keyframes mymove、@-moz-keyframes mymove 等来完成下面相同的代码。。为了让它们工作,我需要如下分别声明它们。 有什么方法可以将
恐怕有类似的问题,但我没有找到具体的解决方案,所以我创建了一个 fiddle : http://jsfiddle.net/Garavani/yrnjaf69/2/ TEXT
我有一个包含多个坐标的图像映射。但是,当我在上面放置一个关键帧 div (clouds) 时,这个不起作用,因为动画覆盖了 map 。最后一个 div 是一个动画,有一些云从图像上掠过。 html代码
所以我正在尝试为元素创建 Wifi 闪烁效果。首先圆圈应该是可见的,然后是上面的圆圈,依此类推。在所有符号都可见后,它应该等待 2 秒,然后重新开始。你可以在这里看到我的当前状态: http://js
我试图在单击按钮时显示一条消息。我想要“GO!”淡入/淡出表示游戏开始,但只有在单击开始按钮时才会出现。我现在正在尝试使用 jquery 和另一个来自老师的库的 javascript,它结合了鼠标点击
我正在尝试使用以下代码让对象在背景中从左向右浮动。不幸的是,当它离开屏幕时,尽管向类添加了 overflow-y: hidden 属性,但仍会出现垂直滚动条。我尝试了百分比(100% 与过渡)但它没有
我正在为将鼠标悬停在图形图像上时的弹跳效果创建关键帧。我的一切都正常工作,但是一旦动画完成..图标就会消失。 我知道它与电子邮件中设置的 translateY 属性有关,并在类里面链接。 在悬停时,我
你好我正在尝试模拟翻转倒数计时器但是当我编写代码时我发现两者之间存在差异: @keyframes zindex { 0% { z-index: 2; } 5% { z-index: 4
如果我有: @keyframes animateleft{from{left:-300px;opacity:0} to{left:0;opacity:1}} 是否可以: @keyframes anim
我有一个弹出窗口,它在单击按钮时打开,然后在您单击另一个按钮或弹出窗口之外时关闭。我希望弹出窗口在打开时淡入并在关闭时淡出。如何使用 javascript 在两个关键帧之间切换? 我尝试通过使用 ja
我正在尝试使用 jquery Keyframes用于动态创建的关键帧动画。我的页面上有六个图标(可能更多),它们都需要设置为以下范围内的随机 x 和 y 值的动画: x = 1-5y = 13-20
我是一名优秀的程序员,十分优秀!