2020.12.28

HTML・CSS

CSSロードアニメーションの実装【円の一部分の色を回転】

デモページはこちら

円の一部分の色が回転する動作のCSSロードアニメーションを実装します。ローダーの見た目は全てCSSで実装するため、svgは使用しません。

htmlは入れ子になった空のdivタグを3つ用意します。クラス名p-loaderのdivタグはローディング全体(オーバーレイ)、クラス名p-loader-circle-wrapのdivタグはローダーのフェードイン、クラス名p-loader-circleがローダーです。なお、クラス名p-loader-circle-wrapのdivタグはなくても動作します。

<body data-status="loading">
<div class="p-loader">
	<div class="p-loader-circle-wrap">
		<div class="p-loader-circle"></div>
	</div>
</div>

bodyタグのdata-status属性がloadingの間はローディングを表示します。ローディング中、bodyタグはoverflow: hidden;を指定してスクロールバーを非表示にします。
ローディング全体(オーバーレイ)はローディング終了時、opacityを1から0へtransitionで変化させます。また、pointer-eventsをautoからnoneへ変化させます。ローディング中はpointer-eventsがnoneだと背面に隠れているコンテンツが選択できてしまいます。ローディング終了後はpointer-eventsがautoだとコンテンツが選択できません。displayプロパティをblockからnoneへ変更することなく、オーバーレイのフェードアウトを実現しています。
ローダーは幅と高さを50pxにしborder-radius: 50%;を指定することで円にしています。borderを半透明の白、border-rightのみ透過度を100%にして、円の一部分が異なる色に見えるようにしています。ローディング中はCSSアニメーションでtransformプロパティのrotateを0から360degへ変化させて回転させます。

body[data-status="loading"] {
	overflow: hidden;
}
body[data-status="loading"] .p-loader {
	pointer-events: auto;
	opacity: 1;
}
.p-loader {
	position: fixed;
	z-index: 10000;
	width: 100vw;
	height: 100vh;
	background: #3bbbff;
	pointer-events: none;
	opacity: 0;
	transition: opacity .3s;
}
.p-loader-circle-wrap {
	position: relative;
	width: 100vw;
	height: 100vh;
	animation: opacity .3s ease forwards;
}
@keyframes opacity {
	0% {
		opacity: 0;
	}
	100% {
		opacity: 1;
	}
}
body[data-status="loading"] .p-loader-circle {
	animation: loading 1s linear infinite;
}
@keyframes loading {
	0% {
		transform: translate(-50%, -50%) rotate(0);
	}
	100% {
		transform: translate(-50%, -50%) rotate(360deg);
	}
}
.p-loader-circle {
	position: absolute;
	top: 50%;
	left: 50%;
	transform: translate3d(-50%, -50%, 0);
	width: 50px;
	height: 50px;
	border: 4px solid rgba(255, 255, 255, 0.5);
	border-right: 4px solid #fff;
	border-radius: 50%;
	box-sizing: border-box;
}

JavaScriptのコードです。デモページの読み込みが速いため、setTimeoutで10秒後にローディングを終了しています。

$(window).on('load',function(){
	setTimeout(function() {
		$('body').attr('data-status', 'loaded');
	}, 10000);
});

関連記事

2025.07.01

HTML・CSS

mask-imageを利用したグラデーションの点線

CSSのmask-imageプロパティを利用して、グラデーションの点線を作成します。デモページはこちら グラデーションの点線は疑似要素にmask-imageプロ…

2024.09.02

HTML・CSS

box-shadowとfilter: drop-shadowの違い

box-shadowプロパティとfilterプロパティのdrop-shadowを比較して違いを確認します。デモページはこちら filter: drop-shad…

2021.07.06

HTML・CSS

background-imageプロパティを利用した高さ可変の三角形

borderプロパティで三角形を作成した場合、高さを可変にすることができません。そこで、background-imageプロパティのlinear-gradien…

2021.07.12

HTML・CSS

CSSカスタムプロパティの使い方

CSSカスタムプロパティはCSS変数とも呼ばれ、CSS内に変数を定義して各プロパティの値で呼び出して使用します。一般的に変数は:rootに定義してグローバル変数…

2021.08.26

HTML・CSS

svgをCSSのbackground-imageに指定

svgをCSSのbackground-imageに指定します。IE11への対応で書き方が変わりますが、今回はIE11にも対応させます。svgのコードは以下の通り…

上に戻る