【javascript】クリックするとN秒後にダウンロードが開始されるダウンロードボタンの実装

やりたいこと
以下のように、javascriptを使って、クリックしてから 一定の時間が経ってから、 ダウンロードが始まるボタンの実装方法を紹介します。
コードは無料で提供するけど、少しでもページセッションを長くしたり、 インプレッション収益を上げたい時にこのボタンを使うことができます。
HTML
1行目 : data属性(data-timer="5") 設定した数字がカウントダウンされる。
2行目 : Google Fontsでアイコンを表示
<button class="download-btn" data-timer="5"> <!-- ここでは5秒でセット -->
<span class="icon material-symbols-rounded">vertical_align_bottom</span>
<span class="text">ファイルをダウンロード</span>
</button>
参考


CSS
CSSは参考までに
.download-btn {
display: flex;
align-items: center;
background: orange;
padding: .5rem 1rem;
box-shadow: 0 5px 10px rgba(0, 0, 0, 0.1);
border: none;
border-radius: 8px;
color: #fff;
text-shadow: 1px 1px 3px #333;
cursor: pointer;
transition: all 0.3s ease;
}
.download-btn:hover {
transform: translateY(-15px);
color: orange;
background: #fff;
border: 1px solid orange;
}
.download-btn .icon {
font-size: 2rem;
}
.download-btn .text {
font-size: 1.5rem;
padding-left: 10px;
}
.download-btn.timer {
color: #000;
background: #fff;
box-shadow: none;
font-size: 1.6rem;
pointer-events: none;
}
.download-btn.timer strong {
color: orange;
padding: 0 8px;
}
javascript
3行目 : ダウンロードするファイルのリンク
10行目 : data属性の数字をtimerに格納
14行目 : 1秒ごとカウントダウン
20行目 : timerが0になったらsetIntervalを停止
const downloadBtn = document.querySelector(".download-btn");
const fileLink = "https://gxy-life.com/images/PC DESK.jpg"; // ダウンロードするファイルのリンク
const countTimer = () => {
if (downloadBtn.classList.contains("disable-timer")) {
return (location.href = fileLink);
}
let timer = downloadBtn.dataset.timer; //data属性の数字をtimerに格納
downloadBtn.classList.add("timer");
downloadBtn.innerHTML = `ダウンロードまであと <strong>${timer}</strong> 秒`;
const initCounter = setInterval(() => { // 1秒ごとカウントダウン
if (timer > 0) {
timer--;
return (downloadBtn.innerHTML = `ダウンロードまであと <strong>${timer}</strong> 秒`);
}
clearInterval(initCounter); // timerが0になったらsetIntervalを停止
location.href = fileLink;
downloadBtn.textContent = "ダウンロード中...";
setTimeout(() => {
downloadBtn.classList.replace("timer", "disable-timer");
downloadBtn.innerHTML = `<span class="icon material-symbols-rounded">vertical_align_bottom</span>
<span class="text">もう一度ダウンロード</span>`;
}, 3000);
}, 1000);
};
downloadBtn.addEventListener("click", countTimer);
参考

まとめ
- data属性にタイマーの数字をセット
- setIntervalでカウントダウン
- timerが0になったら、location.href = fileLink; でダウンロード開始
こんな記事も読まれています。
-
【HTML】【CSS】【javascript】電卓の作り方
電卓のソースコードを2つ紹介します。javascriptはわずか数行で書けます。
-
【JacvaScript】【CSS】たった4行のJavaScriptでできるハンバーガーメニューの作り方
たった4行のJavaScriptで作るハンバーガーメニューの作り方について紹介します。✖をつくるには、transform-originがポイントです。
- リンク
-
波紋エフェクトを表現するjqueryのripples-min.jsの使い方
jqueryのripples-min.jsを使うと簡単に水面の波紋を表現できます。波紋の広がりの速度、波紋の大きさ、波紋のブレの値を変えていろいろ表現させると面白いです。
-
【Javascript】querySelectorAllで要素を取得し、クリックしたら、クラスを追加したり、削除したりする方法。
JavascriptのquerySelectorAllで要素を取得し、クリックしたら、クラスを追加したり、削除したりする方法について解説します。querySelectorと同じように書いてしまうとエラーがでます。forEachを使うとすべてに適用できます。
- リンク
-
要素の高さを取得する方法。getBoundingClientRectとは?window.innerHeightとは?window.pageYOffsetとは?
要素の高さを取得する方法について解説します。getBoundingClientRect、window.innerHeight、window.pageYOffsetについて理解し、要素がいつ画面に現れるかを把握できるようにしましょう。
-
Javascriptを使ったページネーションの実装
トップページの記事が増えてきたので、何とかページネーションで最新の記事だけを表示できないかと思っていたら、いい記事を発見しました。カスタマイズして実装することができました。
- リンク
-
【Javascript】マウスの指す(X, Y)座標とドラッグ & ドロップを理解する
マウスの指す(X, Y)座標とドラッグ & ドロップについて解説します。mousedown, mouseover, mousemove, mouseupを使います。
-
【javascript】連想配列をテーブルできれいに表示する方法
javascript(Object.entries)を使って、連想配列の中身をテーブルできれいに表示する方法について紹介します。
- リンク