Изменение размера окружности SVG с использованием анимации CSS
Я пытаюсь анимировать атрибут радиуса круга SVG с помощью CSS. Хотя (с помощью инструмента Firefox Inspect Element) я вижу, что сама анимация настроена и работает правильно, размер ".innerCircle" не изменяется заметно.
Если вы заметите что-то, что я явно пропустил, или поможете, я был бы очень признателен. Я новичок в этом, поэтому, если я ошибся, пожалуйста, будьте добры!
Я вставил свои файлы внизу для справки.
Еще раз спасибо.
@keyframes buttonTransition {
from {
r: 5%;
}
to {
r: 25%;
}
}
.innerCircle {
animation-duration: 1s;
animation-iteration-count: infinite;
animation-name: buttonTransition;
}
<html>
<head>
<link href = "styling.css" rel = "stylesheet" type = "text/css"></link>
</head>
<body>
<svg class = "button" expanded = "true" height = "100px" width = "100px">
<circle cx = "50%" cy = "50%" r = "35%" stroke = "#000000" stroke-width = "10%" fill = "none"/>
<circle class = "innerCircle" cx = "50%" cy = "50%" r = "25%" fill = "#000000"/>
</svg>
</body>
</html>
Ответы
Ответ 1
В SVG 1.1 радиус круга является атрибутом, а не CSS-свойством.
CSS-анимация анимирует свойства CSS и не анимирует атрибуты.
Firefox теперь реализовал эту часть спецификации SVG 2, поэтому тестовый пример в вопросе теперь будет работать, хотя он не работал, когда вопрос был написан.
Анимации SMIL будут работать с атрибутами (и свойствами CSS) этих UA.
<html>
<head>
<link href = "styling.css" rel = "stylesheet" type = "text/css"></link>
</head>
<body>
<svg class = "button" expanded = "true" height = "100px" width = "100px">
<circle cx = "50%" cy = "50%" r = "35%" stroke = "#000000" stroke-width = "10%" fill = "none"/>
<circle class = "innerCircle" cx = "50%" cy = "50%" r = "25%" fill = "#000000">
<animate attributeName="r" begin="0s" dur="1s" repeatCount="indefinite" from="5%" to="25%"/>
</circle>
</svg>
</body>
</html>
Ответ 2
Есть простая альтернатива: масштабировать анимированный элемент вместо радиуса круга. По состоянию на 2018 г. он поддерживается в Edge и во всех современных браузерах.
SMIL-анимация устарела и поддерживается только браузерами по устаревшим причинам. Он может быть удален в будущем и никогда не появится в Edge или некоторых будущих браузерах.
@keyframes buttonTransition {
from {
transform: scale(0.2);
}
to {
transform: scale(1);
}
}
.innerCircle {
animation-duration: 1s;
animation-iteration-count: infinite;
animation-name: buttonTransition;
transform-origin: center center;
}
<html>
<head>
<link href = "styling.css" rel = "stylesheet" type = "text/css"></link>
</head>
<body>
<svg class = "button" expanded = "true" height = "100px" width = "100px">
<circle cx = "50%" cy = "50%" r = "35%" stroke = "#000000" stroke-width = "10%" fill = "none"/>
<circle class = "innerCircle" cx = "50%" cy = "50%" r = "25%" fill = "#000000"/>
</svg>
</body>
</html>
Ответ 3
Если кто-то все еще ищет, как это сделать, я нашел довольно хорошее решение для заполненного круга без использования SMIL. Это решение немного взломано, и оно будет работать только для кругов, которые имеют сплошное заполнение. По сути, я сделал анимацию ширины штрихов этих кругов, чтобы они выглядели так, как будто они растут.
Мой первоначальный круг
<circle cx="46" cy="46" r="2.8"/>
Для этого я устанавливаю радиус круга близко к 0.
<circle cx="46" cy="46" r="0.01"/>
Затем установите ширину хода в два раза больше исходного радиуса и, наконец, настройте анимацию ширины хода.
@keyframes circle_animation {
from {
stroke-width: 0;
}
}
circle {
stroke-width: 5.6;
animation: circle_animation .5s linear infinite;
}