CSSで波のようなアニメーションを実装

波のようなアニメーションをCSSで実装する方法をご紹介します。

疑似要素

疑似要素を使用した方法です。
border-radiusプロパティで波模様を付けて、animationプロパティでtransformプロパティのrotate関数を使用して回転させ波を表現しています。

波1つ

HTML

<div class="sample"></div>

CSS

.sample {
	position:relative;
	overflow:hidden;
	box-shadow:0 4px 20px rgba(0, 0, 0, 0.2);
	margin:0 auto;
	width:300px;
	height:300px;
	background-color:#fff;
}

	.sample::before {
		position:absolute;
		top:-150%;
		left:-50%;
		border-radius:50% 50% / 50% 70%;
		width:200%;
		height:200%;
		content:"";
		background-color:#3168dd;
		animation:wave linear 6s infinite;
	}

@keyframes wave {
	from {
		transform:rotate(0deg);
	}
	to {
		transform:rotate(360deg);
	}
}

波2つ

波が2つの場合は疑似要素をもう1つ増やし形状を変えて、アニメーションを遅らせることで波を表現します。

HTML

<div class="sample"></div>

CSS

.sample {
	position:relative;
	overflow:hidden;
	box-shadow:0 4px 20px rgba(0, 0, 0, 0.2);
	margin:0 auto;
	width:300px;
	height:300px;
	background-color:#fff;
}

	.sample::before,
	.sample::after {
		position:absolute;
		left:-50%;
		width:200%;
		height:200%;
		content:"";
		background-color:#3168dd;
		animation:wave linear 6s infinite;
	}

	.sample::before {
		top:-150%;
		border-radius:50% 50% / 50% 70%;
	}

	.sample::after {
		top:-146%;
		border-radius:30% 70% / 30% 50%;
		opacity:0.2;
		animation-delay:0.4s;
	}

@keyframes wave {
	from {
		transform:rotate(0deg);
	}
	to {
		transform:rotate(360deg);
	}
}

SVG

SVGを使用した方法です。
SVGのpath要素を使用して波模様を描画し、animationプロパティでtransformプロパティのtranslate関数を使用して横方向へ移動させ波を表現しています。

波1つ

HTML

<div class="sample">
	<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 900 300" width="900" height="300">
		<path d="M 0,0 v 100,0 q 150,50 300,0 t 300,0 q 150,50 300,0 v 0,-100 Z" />
	</svg>
</div>

CSS

.sample {
	overflow:hidden;
	box-shadow:0 4px 20px rgba(0, 0, 0, 0.2);
	margin:0 auto;
	width:300px;
	height:300px;
	background-color:#fff;
}

	.sample svg path {
		fill:#3168dd;
		animation:wave linear 4s infinite;
	}

@keyframes wave {
	from {
		transform:translate(0);
	}
	to {
		transform:translate(-66.66%);
	}
}

波3つ

波が3つの場合は、SVGのx軸をずらしてアニメーションの速度を変えることで波を表現しています。
次のコードでは同じ波を表現しているため、SVGのdefs要素で波を定義し、use要素で定義した波を複製して描画しています。

HTML

<div class="sample">
	<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 300" width="1200" height="300">
		<defs>
			<path d="M 0,0 v 100,0 q 150,50 300,0 t 300,0 q 150,50 300,0 t 300,0 v 0,-100 Z" id="wave" />
		</defs>
		<use xlink:href="#wave" />
		<use xlink:href="#wave" x="-30" y="10" />
		<use xlink:href="#wave" x="-60" />
	</svg>
</div>

CSS

.sample {
	overflow:hidden;
	box-shadow:0 4px 20px rgba(0, 0, 0, 0.2);
	margin:0 auto;
	width:300px;
	height:300px;
	background-color:#fff;
}

	.sample svg use {
		fill:#3168dd;
		animation:wave linear 4s infinite;
	}

	.sample svg use:nth-of-type(2),
	.sample svg use:nth-of-type(3) {
		opacity:0.2;
	}

	.sample svg use:nth-of-type(2) {
		animation-duration:5s;
	}

	.sample svg use:nth-of-type(3) {
		animation-duration:3s;
	}

@keyframes wave {
	from {
		transform:translate(0);
	}
	to {
		transform:translate(-50%);
	}
}