静止しているストライプの場合は、repeating-linear-gradientを利用できますが、アニメーションの場合は、repeating-linear-gradient では継ぎ目が一致しない状態になります。
ストライプをアニメーションする場合は、実装がやや面倒ですが、background-position プロパティを利用して実装する必要があります。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<link rel="stylesheet" href="StripeAnimation01.css" />
</head>
<body>
<div class="StripeFrame">
Test
</div>
</body>
</html>
.StripeFrame {
width: 360px;
height: 180px;
background: linear-gradient(0deg, rgba(255,176,166,1) 0%, rgba(255,176,166,1) 25%, rgba(231,113,97,1) 25%, rgba(231,113,97,1) 25%,
rgba(231,113,97,1) 50%, rgba(255,176,166,1) 50%, rgba(255,176,166,1) 75%, rgba(231,113,97,1) 75%, rgba(231,113,97,11) 100%);
animation: stripe-animation 1s linear infinite;
}
@keyframes stripe-animation {
0% {
background-position: 0 0;
}
100% {
background-position: 0px 90px
}
}
stripe-animation
を指定しています。また、アニメーション再生回数に infinite
を指定し、アニメーションが終了しない状態とします。animation: stripe-animation 1s linear infinite;
キーフレームの設定は下記です。background-position
プロパティでのアニメーションとします。100%の状態で縦方向に90ピクセル移動します。今回、縞模様を表示する枠の高さが
height: 180px;
で指定されているため180ピクセルあります。2つの縞を表現しているため、1回のアニメーションループで、高さの半分の距離 (180px / 2 = 90px) 移動すると、
アニメーションの継ぎ目がなく移動できることになります。@keyframes stripe-animation {
0% {
background-position: 0 0;
}
100% {
background-position: 0px 90px
}
}
background-size
プロパティが指定され、ストライプの幅が調整された場合のアニメーションを紹介します。<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<link rel="stylesheet" href="StripeAnimation02.css" />
</head>
<body>
<div class="StripeFrame">
Test
</div>
</body>
</html>
.StripeFrame {
width: 360px;
height: 180px;
background: linear-gradient(-45deg, #c3ff9f 0%, #c3ff9f 25%, #73b749 25%, #73b749 25%, #73b749 50%, #c3ff9f 50%, #c3ff9f 75%, #73b749 75%, #73b749 100%);
background-size: 32px 32px;
animation: stripe-animation 1s linear infinite;
}
@keyframes stripe-animation {
0% {
background-position: 0 0;
}
100% {
background-position: 32px 32px
}
}
background-size: 32px 32px;
の記述により、ストライプのパターンが32ピクセルの正方形に縮小され枠内に繰り返しで配置されます。 0% {
background-position: 0 0;
}
100% {
background-position: 32px 32px
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<link rel="stylesheet" href="StripeAnimation02.css" />
</head>
<body>
<div class="StripeFrame">
Test
</div>
</body>
</html>
.StripeFrame {
width: 360px;
height: 180px;
background: linear-gradient(-60deg, #c3ff9f 0%, #c3ff9f 25%, #73b749 25%, #73b749 25%, #73b749 50%, #c3ff9f 50%, #c3ff9f 75%, #73b749 75%, #73b749 100%);
background-size: 32px 32px;
animation: stripe-animation 1s linear infinite;
}
@keyframes stripe-animation {
0% {
background-position: 0 0;
}
100% {
background-position: 32px 32px
}
}
background-size
の値の
縦と横を同じサイズにしておけばズレは発生しません。background-size
の値を変更し正方形でない形状にします。background-size
の矩形の横を x 縦を y とすると、tan θ = y/x
の関係が成り立ちます。ストライプの角度(θ) | 横 | 縦 | 補足 |
---|---|---|---|
0 | 1 | 1.00 | tan θ=∞ となるので計算式からは除外 |
10 | 1 | 0.18 | |
20 | 1 | 0.36 | |
22.5 | 1 | 0.41 | |
30 | 1 | 0.58 | |
45 | 1 | 1.00 | |
60 | 1 | 1.73 | |
67.5 | 1 | 2.41 | |
75 | 1 | 3.73 | |
80 | 1 | 5.67 | |
90 | 1 | 1.00 | tan θ=∞ となるので計算式からは除外 |
.StripeFrame {
width: 360px;
height: 180px;
background: linear-gradient(30deg, #e0bbff 0%, #e0bbff 25%, #a883e4 25%, #a883e4 25%, #a883e4 50%, #e0bbff 50%, #e0bbff 75%, #a883e4 75%, #a883e4 100%);
background-size: 64px 37px;
animation: stripe-animation 1s linear infinite;
}
@keyframes stripe-animation {
0% {
background-position: 0 0;
}
100% {
background-position: 128px 37px
}
}
background-size: 64px 37px;
により、正方形でない矩形のタイルにします。64px * 0.58 = 37.12
により計算できます。<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<link rel="stylesheet" href="StripeAnimation-hands-on-01.css" />
<title></title>
<script type="text/javascript">
function MouseOver() {
var elem = document.getElementById("Frame01");
elem.classList.add("Animate");
}
function MouseLeave() {
var elem = document.getElementById("Frame01");
elem.classList.remove("Animate");
}
</script>
</head>
<body>
<div id="Frame01" class="StripeFrame" onmouseover="MouseOver();" onmouseleave="MouseLeave();" >
<img class="ImgFrame" src="char.png"/>
</div>
</body>
</html>
.StripeFrame {
margin-top: 5rem;
margin-left: 5rem;
width: 160px;
height: 240px;
display: flex;
background-color: #c3ff9f;
align-content: flex-end;
border-radius: 10%;
transition-duration: 0.2s;
transition-timing-function: ease-in-out;
}
.StripeFrame.Animate {
transform: rotate(-5deg) scale(1.05,1.05);
background: linear-gradient(-45deg, #c3ff9f 0%, #c3ff9f 25%, #83de4b 25%, #83de4b 25%, #83de4b 50%, #c3ff9f 50%, #c3ff9f 75%, #83de4b 75%, #83de4b 100%);
background-size: 32px 32px;
animation: stripe-animation 1s linear infinite;
}
.ImgFrame {
width: 100%;
}
@keyframes stripe-animation {
0% {
background-position: 0 0;
}
100% {
background-position: 32px 32px
}
}
Animate
サブクラスを追加し、アニメーションを開始します。
マウスポインタが枠外に出ると、Animate
サブクラスを削除しアニメーションを停止します。
また、transform
プロパティを利用して、枠の拡大と回転を追加します。マウスポインタを枠に重ねると、枠が拡大し傾く効果をつけています。