Я пытаюсь сделать svg-анимацию, как показано в демо, когда я масштабирую зарядку svg, она была перемещена к левому краю контейнера.
Можно ли сохранить атрибуты x, y пути в svg? Или мой svg невозможно правильно анимировать?
.svg {
width: 40%;
}
#charge {
/* animation: charge 1s ease infinite; */
transform: scaleX(0.1);
}
@keyframes charge {
0% {
transform: scaleX(0.1);
}
100% {
transform: scale(1);
}
}<div class = "svg">
<svg xmlns = "http://www.w3.org/2000/svg" id = "battery_1_" x = "0px" y = "0px" viewBox = "0 0 214 100">
<polygon id = "outline" points = "214,22.5 200,22.5 200,0 0,0 0,100 200,100 200,77.5 214,77.5"/>
<rect id = "charge" width = "180" height = "80" x = "10" y = "10" fill = "#0071BC"/>
</svg>
</div>





Вместо этого вы можете анимировать width, чтобы добиться желаемого эффекта:
.svg {
width: 40%;
}
#charge {
width: 10px;
height: 80px;
animation: charge 1s ease infinite;
}
@keyframes charge {
0% {
width: 0;
}
100% {
width: 180px;
}
}<div class = "svg">
<svg xmlns = "http://www.w3.org/2000/svg" id = "battery_1_" x = "0px" y = "0px" viewBox = "0 0 214 100">
<polygon id = "outline" points = "214,22.5 200,22.5 200,0 0,0 0,100 200,100 200,77.5 214,77.5"/>
<rect id = "charge" x = "10" y = "10" fill = "#0071BC"/>
</svg>
</div>Вы можете использовать свойство transform-origin, позволяющее изменить положение трансформирующихся элементов. Значения по умолчанию — 50%, 50%, поэтому ваши преобразования начинаются с середины элемента.
.svg {
width: 40%;
}
#charge {
transform-origin: 10px;
animation: charge 1s ease infinite;
transform: scaleX(0.1);
}
@keyframes charge {
0% {
transform: scaleX(0.1);
}
100% {
transform: scale(1);
}
}<div class = "svg">
<svg xmlns = "http://www.w3.org/2000/svg" id = "battery_1_" x = "0px" y = "0px" viewBox = "0 0 214 100">
<polygon id = "outline" points = "214,22.5 200,22.5 200,0 0,0 0,100 200,100 200,77.5 214,77.5"/>
<rect id = "charge" width = "180" height = "80" x = "10" y = "10" fill = "#0071BC"/>
</svg>
</div>Чтобы не устанавливать значение пикселя для transform-origin, вы также можете настроить transform-box так, чтобы transform-origin относился к элементу, а не ко всему SVG:
.svg {
width: 40%;
}
#charge {
transform-origin: left;
transform-box:fill-box;
animation: charge 1s ease infinite;
transform: scaleX(0.1);
}
@keyframes charge {
0% {
transform: scaleX(0.1);
}
100% {
transform: scale(1);
}
}<div class = "svg">
<svg xmlns = "http://www.w3.org/2000/svg" id = "battery_1_" x = "0px" y = "0px" viewBox = "0 0 214 100">
<polygon id = "outline" points = "214,22.5 200,22.5 200,0 0,0 0,100 200,100 200,77.5 214,77.5"/>
<rect id = "charge" width = "180" height = "80" x = "10" y = "10" fill = "#0071BC"/>
</svg>
</div>