- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个勾勒出按钮边框的 CSS 关键帧动画。但是,当我尝试在鼠标关闭时反转动画时,它会删除插入框阴影而不是渐变边框。
如下所示,我尝试在 mouseLeaveAnimationClass
中再次设置边框和背景。那也不能解决问题。这个问题有没有优雅的解决方案?
var els = document.querySelectorAll('.get-started');
for (var i = 0; i < els.length; i++) {
els[i].addEventListener('mouseleave', function(e) {
e.target.classList.add('mouseleaveAnimationClass');
});
els[i].addEventListener('mouseenter', function(e) {
e.target.classList.remove('mouseleaveAnimationClass');
});
}
body {
background-color: black;
}
#button {
display: flex;
font-size: 2.5rem;
color: white;
align-items: center;
justify-content: center;
width: 250px;
height: 75px;
position: relative;
top: -30%;
left: calc(50% - 125px);
}
.get-started {
--borderWidth: 5px;
position: relative;
border-radius: var(--borderWidth);
background-color: #8551FF;
box-shadow: inset 0 0 0 5px white;
z-index: 1;
}
.get-started:after {
content: '';
position: absolute;
}
.get-started:hover:after {
background: linear-gradient(60deg, #f79533, #f37055, #ef4e7b, #a166ab, #5073b8, #1098ad, #07b39b, #6fba82);
top: 0;
left: 0;
right: 0;
bottom: 0;
border-radius: 2px;
background-size: 300% 300%;
animation: frame-enter 1s forwards ease-in-out reverse, gradient-animation 4s ease-in-out infinite;
}
.get-started.mouseleaveAnimationClass {
background: linear-gradient(60deg, #f79533, #f37055, #ef4e7b, #a166ab, #5073b8, #1098ad, #07b39b, #6fba82);
top: 0;
left: 0;
right: 0;
bottom: 0;
border-radius: 2px;
background-size: 300% 300%;
animation: frame-enter 1s forwards ease-in-out;
}
/* motion */
@keyframes gradient-animation {
0% {
background-position: 15% 0%;
}
50% {
background-position: 85% 100%;
}
100% {
background-position: 15% 0%;
}
}
@keyframes frame-enter {
0% {
clip-path: polygon(0% 100%, 5px 100%, 5px 5px, calc(100% - 5px) 5px, calc(100% - 5px) calc(100% - 5px), 5px calc(100% - 5px), 5px 100%, 100% 100%, 100% 0%, 0% 0%);
}
25% {
clip-path: polygon(0% 100%, 5px 100%, 5px 5px, calc(100% - 5px) 5px, calc(100% - 5px) calc(100% - 5px), calc(100% - 5px) calc(100% - 5px), calc(100% - 5px) 100%, 100% 100%, 100% 0%, 0% 0%);
}
50% {
clip-path: polygon(0% 100%, 5px 100%, 5px 5px, calc(100% - 5px) 5px, calc(100% - 5px) 5px, calc(100% - 5px) 5px, calc(100% - 5px) 5px, calc(100% - 5px) 5px, 100% 0%, 0% 0%);
}
75% {
-webkit-clip-path: polygon(0% 100%, 5px 100%, 5px 5px, 5px 5px, 5px 5px, 5px 5px, 5px 5px, 5px 5px, 5px 0%, 0% 0%);
}
100% {
-webkit-clip-path: polygon(0% 100%, 5px 100%, 5px 100%, 5px 100%, 5px 100%, 5px 100%, 5px 100%, 5px 100%, 5px 100%, 0% 100%);
}
}
<div class="get-started" id="button">Get Started</div>
最佳答案
在您原来的问题中,.get-started.mouseleaveAnimationClass {
规则应用于元素本身,而不应用于 ::after
伪元素,并且这就是元素被剪裁的原因。但是,这不会解决您的主要问题 - 反向动画。
我已经用不是 super DRY 的解决方案更新了您的代码,您可能可以改进它。
仅在第一次悬停时,.ready
类被添加到按钮。这会启用 frame-leave
动画,而不运行它。每当您 :hover
元素时,就会应用 frame-enter
动画,一旦您离开该元素,就会调用 frame-leave
再次。
注意事项:
frame-enter
和frame-leave
是同一个动画。使用不同的名称可以让我们替换它们。var els = document.querySelectorAll('.get-started');
for (var i = 0; i < els.length; i++) {
els[i].addEventListener('mouseenter', function(e) {
e.target.classList.add('ready');
}, { once: true });
}
#button {
display: flex;
font-size: 2.5rem;
color: white;
align-items: center;
justify-content: center;
width: 250px;
height: 75px;
position: relative;
top: -30%;
left: calc(50% - 125px);
}
.get-started {
--borderWidth: 5px;
position: relative;
border-radius: var(--borderWidth);
background-color: #8551FF;
box-shadow: inset 0 0 0 5px white;
z-index: 1;
}
.get-started::after {
content: '';
position: absolute;
background: linear-gradient(60deg, #f79533, #f37055, #ef4e7b, #a166ab, #5073b8, #1098ad, #07b39b, #6fba82);
top: 0;
left: 0;
right: 0;
bottom: 0;
border-radius: 2px;
background-size: 300% 300%;
clip-path: polygon(0% 100%, 5px 100%, 5px 100%, 5px 100%, 5px 100%, 5px 100%, 5px 100%, 5px 100%, 5px 100%, 0% 100%);
}
.get-started.ready::after {
animation: frame-leave 1s forwards ease-in-out, gradient-animation 4s ease-in-out infinite;
}
.get-started.ready:hover::after {
animation: frame-enter 1s forwards ease-in-out reverse, gradient-animation 4s ease-in-out infinite;
}
/* motion */
@keyframes gradient-animation {
0% {
background-position: 15% 0%;
}
50% {
background-position: 85% 100%;
}
100% {
background-position: 15% 0%;
}
}
@keyframes frame-enter {
0% {
clip-path: polygon(0% 100%, 5px 100%, 5px 5px, calc(100% - 5px) 5px, calc(100% - 5px) calc(100% - 5px), 5px calc(100% - 5px), 5px 100%, 100% 100%, 100% 0%, 0% 0%);
}
25% {
clip-path: polygon(0% 100%, 5px 100%, 5px 5px, calc(100% - 5px) 5px, calc(100% - 5px) calc(100% - 5px), calc(100% - 5px) calc(100% - 5px), calc(100% - 5px) 100%, 100% 100%, 100% 0%, 0% 0%);
}
50% {
clip-path: polygon(0% 100%, 5px 100%, 5px 5px, calc(100% - 5px) 5px, calc(100% - 5px) 5px, calc(100% - 5px) 5px, calc(100% - 5px) 5px, calc(100% - 5px) 5px, 100% 0%, 0% 0%);
}
75% {
clip-path: polygon(0% 100%, 5px 100%, 5px 5px, 5px 5px, 5px 5px, 5px 5px, 5px 5px, 5px 5px, 5px 0%, 0% 0%);
}
100% {
clip-path: polygon(0% 100%, 5px 100%, 5px 100%, 5px 100%, 5px 100%, 5px 100%, 5px 100%, 5px 100%, 5px 100%, 0% 100%);
}
}
@keyframes frame-leave {
0% {
clip-path: polygon(0% 100%, 5px 100%, 5px 5px, calc(100% - 5px) 5px, calc(100% - 5px) calc(100% - 5px), 5px calc(100% - 5px), 5px 100%, 100% 100%, 100% 0%, 0% 0%);
}
25% {
clip-path: polygon(0% 100%, 5px 100%, 5px 5px, calc(100% - 5px) 5px, calc(100% - 5px) calc(100% - 5px), calc(100% - 5px) calc(100% - 5px), calc(100% - 5px) 100%, 100% 100%, 100% 0%, 0% 0%);
}
50% {
clip-path: polygon(0% 100%, 5px 100%, 5px 5px, calc(100% - 5px) 5px, calc(100% - 5px) 5px, calc(100% - 5px) 5px, calc(100% - 5px) 5px, calc(100% - 5px) 5px, 100% 0%, 0% 0%);
}
75% {
clip-path: polygon(0% 100%, 5px 100%, 5px 5px, 5px 5px, 5px 5px, 5px 5px, 5px 5px, 5px 5px, 5px 0%, 0% 0%);
}
100% {
clip-path: polygon(0% 100%, 5px 100%, 5px 100%, 5px 100%, 5px 100%, 5px 100%, 5px 100%, 5px 100%, 5px 100%, 0% 100%);
}
}
<div class="get-started" id="button">Get Started</div>
关于javascript - CSS @keyframe 动画移除整个按钮而不仅仅是边框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58473871/
这是在 Chrome 中不是由 orbit 动画的圆圈。 http://jsfiddle.net/ztkav838/ //CSS @-webkit-keyframes orbit { from
我一直在查看示例,但我在这里遗漏了一些东西。我无法启动这个简单的 css 动画,改变某些文本的颜色。当我运行下面的示例时,文本保持黑色。 我有一个名为“changeColor”的动画,应用于 h1 元
我一直在浏览示例,但我会在这里遗漏一些东西。我无法触发这个简单的 css 动画,改变一些文本的颜色。当我运行下面的示例时,文本保持黑色。 我有一个名为“changeColor”的动画,应用于 h1 元
我想在第二次点击按钮时重复@keyframne 动画,但它只生效一次。 $(document).ready(function(){ $('#btn_c
我在@keyframes 动画中缩放文本,当文本增加时,它变得模糊,我该如何防止? JS Bin Example 谢谢! 最佳答案 解决问题的最简单方法是将最大状态比例设置为 1,将较小状态比例设置为
我正在尝试创建一个关键帧,它会在查看几秒钟后更改 div 容器的内容,但它不起作用。 这是我的代码: @-webkit-keyframes k_home_projectSlider { 0%
当我创建 @keyframes 动画并将其分配给悬停时的图像时,它会随机闪烁。正如您在 GIF 中看到的那样,它只能随机地正常工作几次。 我已经尝试了以下所有方法并为每个供应商添加了前缀: 背面可见性
我有一个 css3 @keyframe 动画,我在控制时遇到了一些麻烦。 这是一个分为两部分的动画,有一个平放的高矩形,在第一部分中它假设旋转 90 度并将 z 轴向上平移向您同时也向左平移,然后完成
是否可以减少代码以生成一组可以处理各种浏览器前缀的混合宏? 尝试减少代码长度以使用更多mixin 所以代替 @-moz-keyframes orbit { 0% { opaci
我正在尝试使用 @keyframes 制作动画。但是,该示例不起作用。 .main{ width:100%; height:500px; border: 1px solid black; } @
所以我正在制作一个简单的元素,它会显示一个计时器并仅使用 HTML 和 CSS 计数到 99。 但是有人能告诉我为什么我需要延迟我的 100 秒动画以使其与 10 秒动画同步吗? .second::b
我有四个动画 div 元素,它们在 section 元素内旋转。 div 元素需要放在文本下方(假设它有背景),这样就不会出现冲突线,所以我尝试做的是添加 background-color: #aea
不确定我在这里面对的是什么,但我正在尝试应用 CSS 动画。 经过一些研究,我认为添加 webkit 前缀将有助于解决问题,但看起来我仍然面临读取无效属性值的问题。 这是我当前的代码: .progre
我试图让动画在悬停后缓和到元素的原始值。动画本身工作正常,但是当我将鼠标悬停在该元素上时,它会立即恢复到原始状态,而我希望有 0.2 秒的缓和。有什么帮助吗? 这是我的代码: img.footer {
.car1 仅在使用 @keyframes 的 from 和 to 时移动,但在使用时不移动%。谁能解释为什么会这样? .car1 { animation: car1 2s 2 forwards;
似乎无法让我的图像 slider 工作,我打算将其用作我的页面的标题,但图像不会滑动。我已经尝试过 chrome 的前缀,但它们没有任何区别。 这是C
我正在尝试做的事情:我在黑盒子里有链接。我试图在悬停时使框的背景从黑色变为蓝色。我不知道该怎么做。这是我的 CSS(我将它设置为 5s 但我真的希望它在悬停时生效) @keyframes navBox
我试图用 CSS3 使我的 div 上下移动,但它没有 @-webkit-keyframes mover { 0%, 100% { top: 0%;} 50% { top: 5%;
我正在尝试编写此文本动画效果 ( please see video ),但我离解决方案还很远!! 你能帮帮我吗?也许使用 js 更好? h1.fadeinone { animation: fadein
这个问题在这里已经有了答案: Using percentage values with background-position on a linear-gradient (2 个答案) 关闭 3
我是一名优秀的程序员,十分优秀!