#javascript #animation #transition
Вопрос:
Я хочу анимировать атрибут текста svg с 55% до 100% при наведении курсора.
Я сделал это, но я не могу найти способ анимировать атрибут textLength.
<div class="image-with-text__wrapper">
<a href="/collections/clothing" class="image-with-text__heading">
<svg viewBox="0 0 200 60" xmlns="http://www.w3.org/2000/svg">
<text id="shopText" y="40" textLength="55%">Shop</text>
</svg>
</a>
</div>
<script>
var svgElement = document.getElementById("shopText");
var elementHover = document.getElementById("shopHover");
elementHover.addEventListener("mouseover", mouseOver);
elementHover.addEventListener("mouseout", mouseOut);
function mouseOver() {
svgElement.setAttribute("textLength", "100%");
}
function mouseOut() {
svgElement.setAttribute("textLength", "55%");
}
</script>
Ответ №1:
У вас была ошибка в коде, которая не связана с текстовой анимацией. У вас в коде нет Shopover, поэтому вы никогда не запускали наведение курсора мыши.
Короткое исправление приводит к следующему:
<div class="image-with-text__wrapper">
<a href="/collections/clothing" class="image-with-text__heading">
<svg viewBox="0 0 200 60" xmlns="http://www.w3.org/2000/svg">
<text id="shopText" y="40" textLength="55%">Shop</text>
</svg>
</a>
</div>
<script>
var svgElement = document.getElementById("shopText");
svgElement.addEventListener("mouseover", mouseOver);
svgElement.addEventListener("mouseout", mouseOut);
function mouseOver() {
svgElement.setAttribute("textLength", "100%");
}
function mouseOut() {
svgElement.setAttribute("textLength", "55%");
}
</script>
Этот код должен работать и анимировать ваш SVG-текст.
Ответ №2:
Эй, приведенный выше ответ верен, но я думаю, что вы действительно хотите, чтобы он был анимирован снаружи, поэтому я пошел дальше и написал небольшой анимационный код. Это чистый ванильный js, так что он должен быть хорошим. проверить это.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link rel="preconnect" href="https://fonts.gstatic.com">
<link href="https://fonts.googleapis.com/css2?family=Satisfyamp;display=swap"
rel="stylesheet">
<style>
.image-with-text__wrapper {
height: auto;
width: auto;
}
#shopText {
font-family: 'Satisfy', cursive;
}
</style>
</head>
<body>
<div class="image-with-text__wrapper">
<a href="/collections/clothing" class="image-with-text__heading">
<svg viewBox="-1 -5 200 40" xmlns="http://www.w3.org/2000/svg">
<text id="shopText" y="20" font-size="16" textLength="55%">Shop</text>
</svg>
</a>
</div>
<script>
var svg = document.querySelector('.image-with-text__wrapper');
var svgElement = document.getElementById("shopText");
svg.addEventListener("mouseover", mouseOver, false);
svg.addEventListener("mouseout", mouseOut, false);
var i;
function getlength() {
var s = svgElement.getAttribute("textLength");
i = s.split('%', 1)[0];
}
function spaceout() {
svgElement.setAttribute("textLength", i "%");
i ;
if (i < 101)
window.requestAnimationFrame(spaceout);
else
getlength();
}
function spacein() {
svgElement.setAttribute("textLength", i "%");
i--;
if (i > 54)
window.requestAnimationFrame(spacein);
else
getlength();
}
function mouseOver() {
getlength();
spaceout();
}
function mouseOut() {
getlength();
spacein();
}
</script>
</body>
</html>