html钢笔特效,HTML5 SVG在文章中使用钢笔圈词画线连接的动画

JavaScript

语言:

JaveScriptBabelCoffeeScript

确定

console.clear();

var paddingX = 8;

var paddingY = 4;

var svg = document.querySelector("#svg");

var srcText = document.querySelector(".src-text");

var tgtText = document.querySelector(".tgt-text");

var randomBtn = document.querySelector("#random-btn");

var replayBtn = document.querySelector("#replay-btn");

var arrowPath = document.querySelector(".arrow-path");

var circlePath = document.querySelector(".circle-path");

var split = new SplitText(".text-block", {

type: "words"

});

var allWords = split.words;

var numWords = allWords.length;

var circleBox = circlePath.getBBox();

var animation = new TimelineMax();

var srcWord = null;

var tgtWord = null;

var requestId = null;

window.addEventListener("resize", resize);

replayBtn.addEventListener("click", replay);

randomBtn.addEventListener("click", randomize);

TweenLite.set([arrowPath, circlePath], {

autoAlpha: 1,

drawSVG: 0

});

selectWords();

function selectWords() {

cancelAnimationFrame(requestId);

var index1 = Math.floor(Math.random() * numWords);

var index2 = Math.floor(Math.random() * numWords);

if (index1 === index2) {

return selectWords();

}

srcWord = allWords[index1];

tgtWord = allWords[index2];

srcText.innerHTML = "Source Word = " + srcWord.textContent;

tgtText.innerHTML = "Target Word = " + tgtWord.textContent;

animation.seek(0);

updateAnimation();

}

function updateAnimation() {

// Save animation progress

var progress = animation.progress();

// Clear animation

animation.seek(0).clear();

var svgBounds = getBounds(svg, 0, 0);

var srcBounds = getBounds(srcWord, paddingX, paddingY);

var tgtBounds = getBounds(tgtWord, 0, 0);

var x1 = (srcBounds.left - svgBounds.left) + srcBounds.width / 2;

var y1 = (srcBounds.top - svgBounds.top) + paddingY;

var x2 = (tgtBounds.left - svgBounds.left) + tgtBounds.width / 2;

var y2 = (tgtBounds.top - svgBounds.top) + paddingY;

var dx = x1 - x2;

var dy = y1 - y2;

var rx = Math.abs(dx * 0.6);

var ry = Math.max(Math.abs(dy * 1.35), 100);

var sweepFlag = dx < 0 ? 1 : 0;

var data = "M" + x1 + " " + y1 + " A " + rx + " " + ry + " 0 0 " + sweepFlag + " " + x2 + " " + y2;

arrowPath.setAttribute("d", data);

TweenLite.set(circlePath, {

scaleX: srcBounds.width / circleBox.width,

scaleY: srcBounds.height / circleBox.height,

x: srcBounds.left - svgBounds.left,

y: srcBounds.top - svgBounds.top

});

// Rebuild animation

animation

.to(circlePath, 1, {

drawSVG: true

})

.to(arrowPath, 0.5, {

drawSVG: true

})

.to(tgtWord, 0.2, {

color: "red"

})

.progress(progress || 0)

requestId = null;

}

function getBounds(element, paddingX, paddingY) {

paddingX = paddingX || 0;

paddingY = paddingY || 0;

var rect = element.getBoundingClientRect();

return {

left: rect.left - paddingX,

top: rect.top - paddingY,

width: rect.width + paddingX * 2,

height: rect.height + paddingY * 2,

};

}

function resize() {

if (!requestId) {

requestId = requestAnimationFrame(updateAnimation);

}

}

function replay() {

animation.play(0);

}

function randomize() {

selectWords();

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HTML5SVG可以用来创建各种炫酷的动画效果,包括多条波浪线条动画。下面是一个简单的示例代码,用于创建两条波浪线条动画: ```HTML <svg width="800" height="400"> <path id="wave1" fill="none" stroke="#00BFFF" stroke-width="5" d="M0 150 q30 30 60 0 t60 0 t60 0 t60 0 t60 0 t60 0 t60 0 v250 h-360 z"> <animateTransform attributeName="transform" attributeType="XML" type="translate" dur="10s" values="0; -400" repeatCount="indefinite" /> </path> <path id="wave2" fill="none" stroke="#00BFFF" stroke-width="5" d="M0 250 q30 -30 60 0 t60 0 t60 0 t60 0 t60 0 t60 0 t60 0 v150 h-360 z"> <animateTransform attributeName="transform" attributeType="XML" type="translate" dur="10s" values="0; -400" repeatCount="indefinite" /> </path> </svg> ``` 在这个例子,我们创建了两个波浪线条,分别称为“wave1”和“wave2”。这些路径有一个“d”属性,用于定义路径的形状。这里我们使用SVG的曲线命令“q”来创建波浪线条。我们还使用SVG的路径命令“v”和“h”来定义线条的垂直和水平线段。 接下来,我们使用SVG动画功能,通过使用“animateTransform”元素来创建平移动画。我们将波浪线条沿着Y轴向下移动,并且在10秒钟内完成动画。我们还使用“repeatCount”属性使动画无限循环。 最后,我们将两个波浪线条添加到SVG元素,并设置宽度和高度以适应我们的动画。我们还可以使用CSS样式来进一步自定义这些元素的外观。 这只是一个简单的示例,但你可以使用SVG的各种命令和动画功能来创建更复杂和炫酷的波浪线条动画
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值