0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ルーレットをJavaScriptで作ってみた

Last updated at Posted at 2025-07-05

ちょっとカスタム可能なルーレットをJavaScriptで作ってみた

  • HTML / CSS / JavaScript(vanillaJS)のフロントエンドのみの構成
  • GitHubpagesでホスト
  • 項目数、項目名、カラーテーマを選択可能
  • 設定はブラウザに保存可能

デモ

ソース


htmlについて

html

  • <!DOCTYPE html>
    → HTML5の宣言

  • <html lang="ja">
    → 日本語のHTMLページであることを示す

  • <meta charset="UTF-8">
    → 文字コード指定(UTF-8)

  • <meta name="viewport"...>
    → スマホ表示最適化

  • <title>
    → ブラウザタブのタイトル

  • <link rel="stylesheet" href="style.css">
    → 外部CSSファイルを読み込み

  • <div id="flashMessage"...>
    → フラッシュメッセージ用。初期状態は非表示。

  • <div id="app">
    → アプリ全体のラッパー

  • <div id="settings">
    → 設定画面

  • <button id="startButton">
    → ルーレット開始ボタン

  • <select id="colorTheme">
    → カラーテーマ選択肢

  • <select id="itemCount">
    → 項目数選択肢(JavaScriptで2〜12が追加される)

  • <div id="itemInputs">
    → 項目の入力欄(動的生成)

  • <button id="clearSettings">
    → 設定初期化ボタン(localStorageを消去)

  • <div id="rouletteArea" class="hidden">
    → ルーレット画面(初期は非表示)

  • <canvas id="wheelCanvas">
    → ルーレット本体(Canvas描画)

  • <div id="rouletteAreaButtons">
    → 「もう一回」「戻る」ボタン

  • <div id="resultDisplay">
    → 結果の表示欄

  • <script src="script.js">
    → JavaScriptファイルの読み込み


cssについて

style.css の構成と役割

  • body
    → ダークテーマ、中央揃え、スマホ対応、テキスト選択禁止

  • #app
    → 横幅最大600pxで、スマホ〜PCの画面サイズに対応

  • #settings
    → 設定画面の中央寄せ&制限幅

  • .hidden
    → 表示・非表示制御(display:none)

  • #itemInputs input
    → 項目入力欄のスタイル(ダーク背景、白文字)

  • canvas
    → ルーレットの描画領域(正方形、黒背景)

  • button
    → 全ボタン共通の紫色ボタン

  • button:hover
    → ホバー時の色変更

  • #rouletteArea button
    → ルーレット画面のボタンの余白を広めに

  • #rouletteAreaButtons
    → 「もう一回」「戻る」ボタンを横並びに配置

  • #clearSettings
    → 「初期化」ボタン専用のグレーボタン

  • select
    → プルダウンメニューのダークテーマ化

  • .flash
    → フラッシュメッセージの中央固定&不透明度アニメーション

  • @keyframes flashAnimation
    → フラッシュメッセージのフェードイン・アウトの動き


jsについて

jsについて

  • 初期の要素取得

    • document.getElementById を使って、HTMLの各要素を取得
    • ルーレット本体(Canvas)、ボタン、入力欄、設定画面など
  • 項目数セレクトボックスの初期化

    • 2〜12の <option> を動的に生成して <select> に追加
  • 色テーマの定義:getColors

    • 原色・パステル・グレースケール・暖色・寒色の5テーマ
    • 指定数だけ切り出して配列で返す
  • 設定保存&読み込み

    • localStorage を使用して、ルーレットの「項目」と「色テーマ」を保存/復元
    • ユーザーが画面を再読み込みしても状態を保持できる
  • 項目入力欄の動的生成:initItemInputs

    • 選択された項目数に応じて、入力欄を増減させる
  • フラッシュメッセージ表示:showFlashMessage

    • 短時間表示されるメッセージ
    • CSSのアニメーションと同期して非表示に戻る
  • イベントリスナー

    • 項目数変更 → 入力欄の再生成
    • ルーレット開始 → 設定画面を隠して、ルーレット画面へ
    • 設定初期化 → localStorageを削除し、フラッシュメッセージ後リロード
    • もう一回 → 前回の設定で再抽選
    • 設定に戻る → 元の画面に戻す
  • 色のコントラスト計算:getContrastYIQ

    • 選ばれた背景色に応じて、白か黒の文字色を返す
    • 可視性を確保
  • ルーレットの描画と回転:spinWheel

    • Canvasにルーレットの扇形を描画
    • 項目名も配置
    • 回転速度はランダムで開始し、摩擦(friction)で徐々に減速
    • 停止したら、選ばれた項目を計算して表示
  • ポインター描画:drawPointer

    • ルーレットの「結果判定位置」を示す三角形を右端に描画
  • ページ読み込み時の初期化

    • 保存された設定があれば復元
    • なければデフォルト(6項目・原色テーマ)

確率の偏り、到達不能があったので、以下に検証しました。
https://qiita.com/kubo4ka/items/a3e9521df52b8c404c56


0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?