簡単なクイズやテストを、ユニークなスクラッチカード形式で実装する方法。
CSSとJavaScriptを用いて、「ドラッグで削れるシルバーの領域」を再現します。コピペで簡単に使えます!
スクラッチカードのクイズ実装サンプル
漢字クイズ
答え:かれい
シルバーの領域をドラッグすると、スクラッチが削れるよ!
地理クイズ
スクラッチ箇所は、2箇所でも3箇所でも設定できます。
ことわざクイズ
意味:子は親に似る
FontAwesomeのアイコンフォントや、画像を仕込むこともできます。
ソースコード
JavaScriptコード
<script> (function() { function createScratchEffect(scratchElement) { const overlay = document.createElement('div'); overlay.className = 'scratch-overlay'; scratchElement.appendChild(overlay); const canvas = document.createElement('canvas'); const ctx = canvas.getContext('2d'); overlay.appendChild(canvas); let isDrawing = false; let lastX = 0; let lastY = 0; function initCanvasSize() { const rect = scratchElement.getBoundingClientRect(); canvas.width = rect.width; canvas.height = rect.height; const gradient = ctx.createLinearGradient(0, 0, canvas.width, canvas.height); gradient.addColorStop(0, '#eeeeee'); gradient.addColorStop(1, '#bbbbbb'); ctx.fillStyle = gradient; ctx.fillRect(0, 0, canvas.width, canvas.height); } initCanvasSize(); function startDrawing(e) { isDrawing = true; [lastX, lastY] = getPosition(e); draw(e); } function stopDrawing() { isDrawing = false; } function draw(e) { if (!isDrawing) return; e.preventDefault(); const [x, y] = getPosition(e); ctx.globalCompositeOperation = 'destination-out'; ctx.beginPath(); ctx.moveTo(lastX, lastY); ctx.lineTo(x, y); ctx.lineWidth = 15; ctx.lineCap = 'round'; ctx.stroke(); lastX = x; lastY = y; } function getPosition(e) { const rect = canvas.getBoundingClientRect(); const clientX = e.clientX || (e.touches && e.touches[0].clientX); const clientY = e.clientY || (e.touches && e.touches[0].clientY); return [ clientX - rect.left, clientY - rect.top ]; } canvas.addEventListener('mousedown', startDrawing); document.addEventListener('mousemove', draw); document.addEventListener('mouseup', stopDrawing); canvas.addEventListener('touchstart', function(e) { e.preventDefault(); startDrawing(e); }, { passive: false }); document.addEventListener('touchmove', function(e) { if (isDrawing) { e.preventDefault(); draw(e); } }, { passive: false }); document.addEventListener('touchend', stopDrawing); document.addEventListener('touchcancel', stopDrawing); } function initializeScratchEffects() { document.querySelectorAll('.scratch').forEach(createScratchEffect); } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', initializeScratchEffects); } else { initializeScratchEffects(); } })(); </script>
JavaScriptコードは</body>の前に入れます。
49行目のctx.lineWidth = 15;はスクラッチの描画サイズの直径です。要は、シルバーを削るときの指の太さみたいなものです。
30に設定すれば、ひとかきでザックリ削れるようになります。5に設定すれば、チマチマした削り方になります。お好みで調節してね!
HTMLコード
<div class="mondai">「鰈」は何と読む?<br /> 答え:<span class="scratch"><span class="scratch-content">かれい</span></span></div>
スクラッチの部分は<span class="scratch"><span class="scratch-content">文字列</span></span>を追加することで増やせます。
クイズのサンプルでは<div class="mondai"></div>でカードを作り、その中でスクラッチを表示しましたが、スクラッチ部分を単独で使うこともできます。
CSSコード
.mondai { max-width: 350px; /* カードの最大幅 */ font-size: 28px; /* テキストのサイズ */ background: #ff0; /* カードの背景色 */ color: #000; /* テキストの色 */ border: solid 3px #000; /* カードの枠線 */ padding: 15px; /* カード内の余白 */ border-radius: 15px; /* カードの角の丸み */ margin: 20px auto; /* カードの外側の余白 */ box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.3); /* カードの影 */ box-sizing: border-box; } .mondai, .scratch { user-select: none; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; } .scratch { display: inline-block; background: #fff;/* 削ったスクラッチの背景色 */ padding: 5px 20px; margin: 0 3px; border-radius: 30px; position: relative; } .scratch-content { position: relative; z-index: 1; color: #008;/* 削ったスクラッチの文字色 */ font-weight: bold; } .scratch-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; border-radius: inherit; overflow: hidden; z-index: 2; } canvas { position: absolute; top: 0; left: 0; width: 100%; height: 100%; cursor: pointer; background: transparent; }
9行目のmargin: 20px auto;をmargin: 20px 0;に変更するとカードの中央揃えが解除されます。
JavaScriptを使わないシンプルなパターン
クリック中だけ答えをチラ見せ
答え:やまね
シルバーの領域をクリック(またはタップ)している間だけ答えが表示されます。
HTMLとCSSだけで作られているので、実装が簡単です。
クリックで答えを出す
答え:なまけもの
シルバーの領域をクリック(またはタップ)すると、シルバー部分が段階的に削れます。
シルバーが削れる過程はCSSアニメーションで実装しており、JavaScript無しで使えます。
簡単かつ「削ってる感」を出したいならこれ!
シルバーを削るアニメーションの再生速度はCSS内で調整できます。