В то время как принятый ответ работает просто отлично, художник во мне не может взять перекрытие линий в центре из-за масштабирования.Вот несколько альтернативных опций:
Опция 1 - clip-path
Используя clip-path, анимируйте середины прямоугольника, чтобы преобразовать многоугольник в шеврон.Это работает, маскируя цвет фона элемента вне анимированной фигуры.
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
.line {
display: inline-block;
width: 200px;
height: 50px;
background-color: black;
clip-path: polygon(0 0, 100% 0, 100% 2px, 0 2px);
animation: 2s infinite linear;
}
.line.down {
animation-name: chevron-down;
}
.line.up {
animation-name: chevron-up;
}
@keyframes chevron-down {
from {
clip-path: polygon(0 0, 50% 0, 100% 0, 100% 2px, 50% 2px, 0 2px);
}
to {
clip-path: polygon(0 0, 50% 48px, 100% 0, 100% 2px, 50% 50px, 0 2px);
}
}
@keyframes chevron-up {
from {
clip-path: polygon(0 48px, 50% 48px, 100% 48px, 100% 50px, 50% 50px, 0 50px);
}
to {
clip-path: polygon(0 0, 50% 48px, 100% 0, 100% 2px, 50% 50px, 0 2px);
}
}
<div class="line down"></div>
<div class="line up"></div>
Поддержка clip-path
, однако, пятнистая.
Вариант 2 - псевдоэлементы
Если вы не можете использовать clip-path
или предпочитаете использовать псевдоэлементы, измените их расположение и источник преобразования, чтобы они исходили из центра (а не из верхних углов):
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
.line {
position: relative;
width: 200px;
height: 50px;
overflow: hidden;
}
.line::before,
.line::after {
position: absolute;
content: '';
display: block;
bottom: 0;
height: 2px;
width: 50%;
background-color: black;
animation: 2s linear infinite;
}
.line::before {
transform-origin: bottom right;
left: 0;
animation-name: before;
}
.line::after {
transform-origin: bottom left;
right: 0;
animation-name: after;
}
@keyframes before {
to { transform: rotateZ(30deg); }
}
@keyframes after {
to { transform: rotateZ(-30deg); }
}
<div class="line"></div>