我试图在我的网页上设置一个按钮动画,这个按钮基本上是一个定时动画,从按钮顶部开始,然后最终填满按钮的整个边框。我附上一张图片很难描述我的意思。
我确信这可以通过关键帧完成,但我不知道如何。我尝试过这样的事情开始:
@keyframes borderblueanim {
0% {border-color: #fff; }
100% {border-color: blue; }
}
@-webkit-keyframes borderblueanim {
0% {border-color: #fff; }
100% {border-color: blue; }
}
animation: borderblueanim 5s infinite;
-webkit-animation: borderblueanim 2s infinite;
但它不正确。将不胜感激任何想法和帮助。
答案 0 :(得分:2)
您可以这样做的一种方法是为路径的stroke-offset
设置动画。我使用circle
路径包含了示例代码。根据元素的大小,您需要更改dasharray
和dashoffset
值。
svg {
fill: #eee;
overflow: visible;
transform-origin:50% 50%;
transform: rotate(-90deg);
}
.path {
stroke: blue;
stroke-width: 4;
stroke-dasharray: 800;
stroke-dashoffset: 800;
animation: borderblueanim 2s infinite;
}
@keyframes borderblueanim {
from {
stroke-dashoffset: 800;
}
to {
stroke-dashoffset: 0;
}
}

<svg width="200" height="200" viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg">
<circle class="path" cx="100" cy="100" r="100"/>
</svg>
&#13;
答案 1 :(得分:0)
这样的事可能有用。这使用SCSS
//Colors
$background: #fefefe;
$text: #4b507a;
$cyan: #60daaa;
$yellow: #fbca67;
$orange: #ff8a30;
$red: #f45e61;
$purple: #6477b9;
$blue: #0eb7da;
// Basic styles
button {
background: none;
border: 0;
box-sizing: border-box;
margin: 1em;
padding: 1em 2em;
// Using inset box-shadow instead of border for sizing simplicity
box-shadow: inset 0 0 0 2px $red;
color: $red;
font-size: inherit;
font-weight: 700;
// Required, since we're setting absolute on pseudo-elements
position: relative;
vertical-align: middle;
&::before,
&::after {
box-sizing: inherit;
content: '';
position: absolute;
width: 100%;
height: 100%;
}
}
// Border spins around element
// ::before holds three borders that appear separately, one at a time
// ::after holds one border that spins around to cover ::before's borders, making their appearance seem smooth
.spin {
width: 5em;
height: 5em;
padding: 0;
&:hover {
color: $blue;
}
&::before,
&::after {
top: 0;
left: 0;
}
&::before {
border: 2px solid transparent; // We're animating border-color again
}
&:hover::before {
border-top-color: $blue; // Show borders
border-right-color: $blue;
border-bottom-color: $blue;
transition:
border-top-color 0.15s linear, // Stagger border appearances
border-right-color 0.15s linear 0.10s,
border-bottom-color 0.15s linear 0.20s;
}
&::after {
border: 0 solid transparent; // Makes border thinner at the edges? I forgot what I was doing
}
&:hover::after {
border-top: 2px solid $blue; // Shows border
border-left-width: 2px; // Solid edges, invisible borders
border-right-width: 2px; // Solid edges, invisible borders
transform: rotate(270deg); // Rotate around circle
transition:
transform 0.4s linear 0s,
border-left-width 0s linear 0.35s; // Solid edge post-rotation
}
}
.circle {
border-radius: 100%;
box-shadow: none;
&::before,
&::after {
border-radius: 100%;
}
}
html {
background: $background;
}
body {
background: $background;
color: $text;
font: 300 24px/1.5 Lato, sans-serif;
margin: 1em auto;
max-width: 36em;
padding: 1em 1em 2em;
text-align: center;
}
.buttons {
isolation: isolate;
}
h1 {
font-weight: 300;
font-size: 2.5em;
}
&#13;
<button class="spin circle">Spin Circle</button>
&#13;