使用ブラウザ:Google Chrome
使用言語:HTML, CSS, JavaScript
使用ライブラリ:JQuery, TweenMax

JQueryでアニメーションさせるととても微妙だったので、TweenMaxを使ってみました。
すごくいい感じでした。
これは2本のラインを下方向に伸ばすアニメーションを設定していて、
スクロールで下にいくと新しく次のラインが追加されアニメーションしていきます。
Y方向に関しては固定値ですが、X方向に関してはランダムで伸びるように設定しています。
応用すれば色々と使えるかなと思います。
以下コード
html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>線を伸ばすサンプル</title>
<!-- Style -->
<link rel="stylesheet" type="text/css" href="css/styles.css">
<!-- Script -->
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
</head>
<body>
<div class="container">
<header>
<h2>ヘッダー</h2>
</header>
<div class="main-container">
<div id="scroll-check">top:0</div>
<canvas name="can" width="500px" height="5000px"></canvas>
</div>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/1.20.4/TweenMax.min.js"></script>
<script src="js/main.js"></script>
</body>
</html>
css
html, body {
margin: 0px;
height: 100%;
width: 100%;
}
/* container */
.container {
height: 100%;
width: 100%;
}
/* main-container */
.main-container {
width: 100%;
height: 5000px;
background: black;
text-align: center;
}
#scroll-check {
position: fixed;
top: 100px;
left: 20px;
color: white;
font-size: 18px;
font-weight: bold;
}
/* canvas */
canvas {
background: #08088A;
}
/* header */
header {
height: 60px;
width: 100%;
padding: 0px;
margin: 0px;
background: #848484;
}
header h2 {
margin: 0;
color: white;
padding: 10px;
margin-left: 10px;
}
js
(function(){
'use strict';
// スクロール時のイベント
$(window).scroll(function() {
var top = $(this).scrollTop();
$('#scroll-check').html('top:' + top);
// ラインアニメーション中は通らない
if(drawing === false) {
for(var i=0; i<lineStartY.length; i++) {
if(top > (lineStartY[i]-200) && lineCount === (i+1)) {
draw();
break;
}
}
}
});
// ロードイベント
$(window).on("load",function(){
init();
draw();
});
var canvas, ctx;
var lineCount = 0;
var drawing = false;
var lineStartY = [
400,
800,
1200,
1600,
2000,
2400,
2800,
3200,
];
var lineEndY = 3600;
var colors = [
"rgb(255, 255, 255)",
"rgb(250, 88, 130)",
];
var fromLineParam = {
x: 0, y: 0,
x2:0, y2:0};
var moveLineParam = {
x: 0, y: 0,
x2:0, y2:0};
var toLineParam = {
x: 0, y: 0,
x2:0, y2:0};
var nextFromLineParam = {
x: 0, y: 0,
x2:0, y2:0};
//*********************************************
// 関数
//*********************************************
// 初期化
function init() {
canvas = $("canvas[name='can']")[0];
if ( !canvas || !canvas.getContext ) {
return false;
}
ctx = canvas.getContext('2d');
}
// 描画
function draw() {
if ( !canvas || !canvas.getContext ) {
return false;
}
drawing = true;
setLineParam(nextFromLineParam);
TweenMax.to(moveLineParam, 1,
{ x:toLineParam.x,
y: toLineParam.y,
x2: toLineParam.x2,
y2: toLineParam.y2,
ease: Quad.easeInOut,
onUpdate: onAnimation,
onComplete: function() {
drawPoint(toLineParam.x, toLineParam.y, colors[0]);
drawPoint(toLineParam.x2, toLineParam.y2, colors[1]);
ctx.closePath();
lineCount++;
drawing = false;
}
}
);
}
// パラメータの設定
function setLineParam() {
if(lineCount === 0) {
fromLineParam.x = 200;
fromLineParam.y = 10;
fromLineParam.x2 = 300;
fromLineParam.y2 = 10;
} else {
fromLineParam.x = nextFromLineParam.x;
fromLineParam.y = nextFromLineParam.y;
fromLineParam.x2 = nextFromLineParam.x2;
fromLineParam.y2 = nextFromLineParam.y2;
}
moveLineParam.x = fromLineParam.x;
moveLineParam.y = fromLineParam.y;
moveLineParam.x2 = fromLineParam.x2;
moveLineParam.y2 = fromLineParam.y2;
// 50から450の間
var randomX = Math.floor( Math.random() * 400 ) + 50;
var randomX2 = Math.floor( Math.random() * 400 ) + 50;
toLineParam.x = randomX;
toLineParam.y = lineStartY[lineCount] - 10;
toLineParam.x2 = randomX2;
toLineParam.y2 = lineStartY[lineCount] - 10;
if(lineCount < lineStartY.length) {
nextFromLineParam.x = randomX;
nextFromLineParam.y = lineStartY[lineCount];
nextFromLineParam.x2 = randomX2;
nextFromLineParam.y2 = lineStartY[lineCount];
} else {
toLineParam.y = lineEndY;
toLineParam.y2 = lineEndY;
}
}
// 円の描画
function drawPoint(x, y, color) {
ctx.beginPath();
ctx.fillStyle = color;
ctx.strokeStyle = color;
ctx.arc(x, y, 10, 0, 2 * Math.PI);
ctx.fill();
ctx.closePath();
ctx.stroke();
}
// ラインの描画
function drawLine(fromParam, moveParam) {
ctx.beginPath();
ctx.moveTo(fromParam.x, fromParam.y);
ctx.lineTo(moveParam.x, moveParam.y);
ctx.strokeStyle = colors[0];
ctx.lineWidth = 5;
ctx.stroke();
ctx.beginPath();
ctx.moveTo(fromParam.x2, fromParam.y2);
ctx.lineTo(moveParam.x2, moveParam.y2);
ctx.strokeStyle = colors[1];
ctx.lineWidth = 5;
ctx.stroke();
}
// アニメーション関数
function onAnimation() {
ctx.clearRect(0, 0, 500, 5000);
drawPoint(fromLineParam.x2, fromLineParam.y2, colors[1]);
drawPoint(fromLineParam.x, fromLineParam.y, colors[0]);
drawLine(fromLineParam, moveLineParam);
}
})();
以上です。