Я пытаюсь анимировать свойство высоты элемента с помощью CSS, но мне нужно, чтобы оно располагалось в центре. Ниже мой код, но он меняет высоту снизу.
.toggle {
position: absolute;
width: 400px;
height: 200px;
background: #ccc;
}
.left-border {
position: absolute;
top: 50px;
left: 10px;
width: 20px;
height: 60px;
border-radius: 200px;
background-color: #ff0000;
animation: height 2s;
}
@-webkit-keyframes height {
from {
height: 60px;
}
to {
height: 10px;
}
}<div class = "toggle">
<div class = "left-border"></div>
</div>Вот JSFIDDLE






Ну вот. Я использую анимацию top вместо height. Красный переключатель теперь также нуждается в «контейнере», поэтому я просто использовал тот, который у вас был. При изменении размеров красного переключателя измените внешнюю оболочку, а не элемент переключения (он будет соответствовать любому контейнеру, как по ширине, так и по высоте).
https://jsfiddle.net/j2refncs/7/
.toggle {
width: 20px;
height: 40px;
background: #ccc;
position: relative;
.left-border {
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
border-radius: 200px;
background-color: #ff0000;
animation: height 2s;
}
}
@-webkit-keyframes height {
from {
top: 0;
}
to {
top: 30px;
}
}
Можно использовать transform
from {
}
to {
transform: scaleY(0.1666);
}
0.1666 происходит от 10px / 60px
Вы можете анимировать top с помощью height, чтобы изменение высоты отображалось из центра:
.toggle {
position: relative;
width: 400px;
height: 200px;
background: #ccc;
}
.left-border {
position: absolute;
top: 25px;
left: 10px;
width: 20px;
height: 60px;
border-radius: 200px;
background-color: #ff0000;
animation: height 2s forwards;
}
@keyframes height {
from {
top: 25px;
height: 60px;
}
to {
top: 50px;
height: 10px;
}
}<div class = "toggle">
<div class = "left-border"></div>
</div>Вы также можете использовать transform: scaleY() в анимации. По умолчанию преобразовать происхождение - это центр.
.toggle {
position: relative;
width: 400px;
height: 200px;
background: #ccc;
}
.left-border {
position: absolute;
top: 25px;
left: 10px;
width: 20px;
height: 60px;
border-radius: 200px;
background-color: #ff0000;
animation: height 2s forwards;
}
@keyframes height {
from {
transform: scaleY(1);
}
to {
transform: scaleY(0.167);
}
}<div class = "toggle">
<div class = "left-border"></div>
</div>Просто добавьте top: 75px в ключевой кадр, поскольку изменение в height - 50px. Вы хотите уменьшить height на 25 пикселей или наполовину с обеих сторон, Топ и Нижний, чтобы прийти к желаемому 10px. Итак, 50 пикселей / 2 + top: 50px = top: 75px:
.toggle {
position: absolute;
width: 400px;
height: 200px;
background: #ccc;
}
.left-border {
position: absolute;
top: 50px; /* starting position from the top */
left: 10px;
width: 20px;
height: 60px;
border-radius: 200px;
background-color: #f00;
animation: height 2s;
}
@-webkit-keyframes height {
to {height: 10px; top: 75px} /* + ending position from the top */
}<div class = "toggle">
<div class = "left-border"></div>
</div>
Что вы имеете в виду, когда хотите, чтобы это происходило из центра? Не могли бы вы дать дополнительные разъяснения?