「現在何パーセント読み込まれているか」を表示するローディングビューをReact(javascript)で実装してみます。 本サイトのローディングでも以下のソースをベースとしています。
.tsx
interface Props {}
const Loading: React.FC<Props> = (): JSX.Element => {
useEffect(() => {
const images = document.getElementsByTagName('img');
const loadingBar = document.getElementById('loading_bar');
const loadingArea = document.getElementById('loading');
const percent: any = document.getElementById('percent-text'); // パーセントのテキスト部分
let count = 0;
let current = 0;
let intervalCount = 0;
// 画像の読み込み
const onLoadImage = setInterval(function() {
const img = new Image(); // 画像の作成
// 画像読み込み完了したとき
img.onload = function() {
count += 1;
current = Math.floor(count / images.length * 100);
console.log(current)
percent.innerHTML = current;
loadingBar.style.width = current + '%';
}
// 画像読み込み失敗したとき
img.onerror = function() {
count += 1;
}
img.src = images[intervalCount].src; // 画像にsrcを指定して読み込み開始
intervalCount++
if (intervalCount >= images.length) {
clearInterval(onLoadImage);
}
}, 100) // 0.1sごとにループ
// ローディング処理
const nowLoading = setInterval(function() {
// 全て読み込んだ時
if (current >= 100) {
// ローディング要素の非表示
loadingArea.classList.add('loadingNone');
// ローディングの終了
clearInterval(nowLoading);
}
}, 1000);
}, [])
return (
<Loading>
<div id="loading">
<div className="loading_barWrap">
<p className="text">
<span id="percent-text"></span>% 読み込み中
</p>
<div id="loading_bar"></div>
</div>
</div>
</Loading>
)
}
.scss
#loading {
width: 100vw;
height: 100vh;
background: #000;
position: fixed;
top: 0;
left: 0;
z-index: 999;
.loading_barWrap {
width: 30vw;
height: calc(1rem + 5px);
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
margin: auto;
#loading_bar {
width: 0;
height: 5px;
background: #fff;
transition-duration: 1s;
}
.text {
text-align: center;
color: #fff;
}
}
}
.loadingNone {
animation: loadingAnime 1s forwards;
}
@keyframes loadingAnime {
0% {
opacity: 1;
}
99% {
opacity: 0;
}
100% {
opacity: 0;
display: none;
}
}