为元素设置动画,使其从 display:none 变为 CSS
Animating an Element so it changes from display:none with CSS
我有一个菜单系统,当单击“菜单”按钮时,一些简单的 javascript 允许移动菜单显示为下拉菜单。
我想要它,以便此菜单转换/动画化,但显示:none 属性 似乎无法使用 CSS 动画进行动画处理。我真的不想只使用不透明度:0,因为移动菜单将在文档流中,而在桌面设备上我不希望出现这种情况。
有什么CSS解决办法吗?当我使用 Greensock 动画库时,它允许您设置动画或更改“显示”属性。我似乎无法让它与 CSS 动画一起使用?
我创建了一个简单的笔,我只使用了一个 div 动画(为了简单起见,我没有包含任何 JS 点击事件等)。
如您所见,我在 id#bluebox 的 CSS 和 @keyframes 动画上注释掉了显示:none。如果您取消注释这些,您会看到产生的问题。
https://codepen.io/emilychews/pen/xPWddZ
CSS
#bluebox {
margin-left: 0px;
margin-top: 0px;
width: 100px;
height: 100px;
background: blue;
animation: appear 1s ease-in forwards;
opacity: 0;
/* display: none; */
}
@keyframes appear {
0% {/*display: none;*/ opacity: 0}
1% {display: block; opacity: 0.1;}
100% {opacity: 1;}
}
HTML
<div id="bluebox"></div>
在这种情况下,由于您正在尝试为元素设置动画,我想说您可能应该使用宽度和高度来代替您的优势。
像这样的东西可以代替显示 none。 (Codepen)
#bluebox {
width: 0px;
height: 0px;
}
@keyframes appear {
0% {
width: 0px;
height: 0px;
}
100% {
width: 100px;
height: 100px;
}
}
宽度或高度也可以替换为您的末端 width/height 以允许更自然的动画,具体取决于您的目标。如果您愿意,我可以更新 Codepen 以包含我的意思的示例。
如果这就是您的目标,请告诉我!
编辑:修复了 Codepen link
我通过向元素添加一个 transform: scaleY(0) 来解决这个问题,然后在动画的前 1% 中使用不透明度为 0 的元素对其进行动画处理,因此您看不到元素 'scale up' 可以这么说。我使用比例而不是宽度和高度,因为宽度和高度属性在实现 60fps 平滑度方面不能很好地设置动画。
CSS
#bluebox {
margin-left: 0px;
margin-top: 0px;
width: 100px;
height: 100px;
background: blue;
animation: appear 1s ease-in forwards;
opacity: 0;
transform: scaleY(0);
}
@keyframes appear {
0% {opacity: 0;}
1% {opacity: 0; transform: scaleY(1)}
100% {opacity: 1; transform: scaleY(1)}
}
我有一个菜单系统,当单击“菜单”按钮时,一些简单的 javascript 允许移动菜单显示为下拉菜单。
我想要它,以便此菜单转换/动画化,但显示:none 属性 似乎无法使用 CSS 动画进行动画处理。我真的不想只使用不透明度:0,因为移动菜单将在文档流中,而在桌面设备上我不希望出现这种情况。
有什么CSS解决办法吗?当我使用 Greensock 动画库时,它允许您设置动画或更改“显示”属性。我似乎无法让它与 CSS 动画一起使用?
我创建了一个简单的笔,我只使用了一个 div 动画(为了简单起见,我没有包含任何 JS 点击事件等)。
如您所见,我在 id#bluebox 的 CSS 和 @keyframes 动画上注释掉了显示:none。如果您取消注释这些,您会看到产生的问题。
https://codepen.io/emilychews/pen/xPWddZ
CSS
#bluebox {
margin-left: 0px;
margin-top: 0px;
width: 100px;
height: 100px;
background: blue;
animation: appear 1s ease-in forwards;
opacity: 0;
/* display: none; */
}
@keyframes appear {
0% {/*display: none;*/ opacity: 0}
1% {display: block; opacity: 0.1;}
100% {opacity: 1;}
}
HTML
<div id="bluebox"></div>
在这种情况下,由于您正在尝试为元素设置动画,我想说您可能应该使用宽度和高度来代替您的优势。
像这样的东西可以代替显示 none。 (Codepen)
#bluebox {
width: 0px;
height: 0px;
}
@keyframes appear {
0% {
width: 0px;
height: 0px;
}
100% {
width: 100px;
height: 100px;
}
}
宽度或高度也可以替换为您的末端 width/height 以允许更自然的动画,具体取决于您的目标。如果您愿意,我可以更新 Codepen 以包含我的意思的示例。
如果这就是您的目标,请告诉我!
编辑:修复了 Codepen link
我通过向元素添加一个 transform: scaleY(0) 来解决这个问题,然后在动画的前 1% 中使用不透明度为 0 的元素对其进行动画处理,因此您看不到元素 'scale up' 可以这么说。我使用比例而不是宽度和高度,因为宽度和高度属性在实现 60fps 平滑度方面不能很好地设置动画。
CSS
#bluebox {
margin-left: 0px;
margin-top: 0px;
width: 100px;
height: 100px;
background: blue;
animation: appear 1s ease-in forwards;
opacity: 0;
transform: scaleY(0);
}
@keyframes appear {
0% {opacity: 0;}
1% {opacity: 0; transform: scaleY(1)}
100% {opacity: 1; transform: scaleY(1)}
}