单文件抽奖小工具(不放回抽)

单文件抽奖小工具(不放回抽)

创建时间:2024-08-12

一、HTML 部分

这段 HTML 代码构建了抽奖小工具的页面结构。引入了 jQuery 库用于后续的 JavaScript 操作,定义了两个音频元素用于播放抽奖相关音效。h1 标签显示“抽奖”标题,span 标签用于显示时间,wrapDiv 包含了抽奖的主要区域,如参与抽奖的人员列表、抽奖按钮和已选中人员列表。

<!doctype html>
<html>

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>抽奖小工具</title>
    <script src="https://libs.baidu.com/jquery/1.10.2/jquery.min.js"></script>

    <style>
        <!-- 此处是一系列的样式定义,包括页面整体背景、字体、各个元素的布局、颜色、边框、阴影等 -->
    </style>
</head>

<body>
    <audio id="drawSound" src="draw.mp3" preload="auto"></audio>
    <audio id="drawSound1" src="drawSound1.mp3" preload="auto"></audio>
    <h1>抽奖</h1>
    <span id="span"></span>

    <div class="wrapDiv">
        <div id="leftBox" class="leftBox"></div>
        <input type="button" id="btn" value="开始抽奖">
        <div id="selectedName" class="selectedName">
            <h1>抽中名单</h1>
        </div>
    </div>
    <img src="./first-logo.png" alt="First Logo" style="position: absolute; top: 80px; left: 100px; width: 150px; height: auto;">
    <!--    <img src="./second-logo.png" alt="Second Logo" style="position: absolute; top: 94px; left: 200px; width: 150px; height: auto;">-->
    <br>
</body>

</html>

二、CSS 部分

这里通过 CSS 对页面元素进行了详细的样式设置。比如,body 的背景、字体和颜色,wrapDiv 的宽度、位置、背景、阴影和边框,leftBox 的边框和溢出处理,spanbtn 的样式,nameBox 的样式及其鼠标悬停效果,selectedName 的样式等等,共同营造出美观且具有交互性的页面效果。

body {
    background-color: #f0f8ff;
    font-family: 'Arial', sans-serif;
    color: #333;
}

.wrapDiv {
    width: 80%;
    max-width: 1200px;
    margin: 0 auto;
    text-align: center;
    position: absolute;
    top: 80px;
    left: 0;
    right: 0;
    background: #ffffff;
    box-shadow: 0 0 15px rgba(0, 0, 0, 0.1);
    border-radius: 10px;
    padding: 20px;
}

.leftBox {
    width: 100%;
    height: auto;
    margin: 20px auto;
    padding: 10px;
    border-bottom: 2px solid #e0e0e0;
    overflow: hidden;
}

#span {
    float: right;
    margin-top: 10px;
    font-size: 16px;
    color: #666;
}

#btn {
    width: 150px;
    height: 40px;
    background-color: #007bff;
    color: white;
    border: none;
    border-radius: 5px;
    cursor: pointer;
    margin: 20px auto;
    font-size: 16px;
}

#btn:hover {
    background-color: #0056b3;
}

.nameBox {
    width: 100px;
    height: 40px;
    float: left;
    background-color: #f8f9fa;
    margin: 10px;
    text-align: center;
    line-height: 40px;
    border-radius: 5px;
    box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
    transition: background-color 0.3s, color 0.3s;
}

.nameBox:hover {
    background-color: #007bff;
    color: white;
}

.selectedName {
    width: 100%;
    background: #f8f9fa;
    margin-top: 20px;
    padding: 20px;
    border-radius: 10px;
    box-shadow: 0 0 15px rgba(0, 0, 0, 0.1);
    height: auto;
}

.selectedName h1 {
    color: #007bff;
}

h1 {
    text-align: center;
    font-size: 24px;
    margin-bottom: 20px;
    color: #007bff;
}

三、JavaScript 部分

在 JavaScript 部分,首先定义了一个包含众多人员名字的数组 arr ,并通过 shuffle 函数对其进行随机打乱。initForm 函数用于初始化页面布局,包括计算并设置已选中人员列表的高度,以及动态创建参与抽奖人员的盒子。

clearBoxColor 函数用于清除所有盒子的背景颜色,setBoxColor 函数用于根据当前选中的人员设置相应盒子的背景颜色为红色。appendSelectedName 函数用于将选中的人员添加到已选中人员列表中。

点击抽奖按钮时,根据按钮的当前值决定是开始还是停止抽奖。开始抽奖时,通过 setInterval 定时随机选择人员并设置颜色,同时播放音效;停止抽奖时,暂停音效,将选中人员添加到已选中列表,从原数组中移除,并更新按钮的值。

getTime 函数用于获取当前时间,并通过 setInterval 每秒更新页面上显示的时间

var arr = ['刘备','关羽','张飞','赵云','马超','黄忠','诸葛亮','庞统','姜维','魏延','马岱','关平','周仓','廖化','法正','李严','黄权','孟达','刘封','马良','马谡','蒋琬','费祎','董允','向宠','张苞','关兴','曹仁','曹洪','夏侯惇','夏侯渊','张辽','张郃','徐晃','许褚','典韦','郭嘉','荀彧','荀攸','贾诩','程昱','司马懿','司马师','司马昭','邓艾','钟会','孙策','孙权','周瑜','鲁肃','貂蝉','大乔','小乔','孙尚香'];
var orgArrCount = arr.length;
var currentSelectNum = 0;

function shuffle(array) {
    for (let i = array.length - 1; i > 0; i--) {
        const j = Math.floor(Math.random() * (i + 1));
        [array[i], array[j]] = [array[j], array[i]];
    }
    return array;
}

arr = shuffle(arr);

initForm();

function initForm() {
    var selectedNameHeight = orgArrCount / 3 * 40 + 120;
    $("#selectedName").css("height", selectedNameHeight + "px");
    dynamicCreateBox();
}

function dynamicCreateBox() {
    for (var i = 0; i < arr.length; i++) {
        var div = document.createElement("div");
        div.innerText = arr[i];
        div.className = "nameBox";
        $("#leftBox").append(div);
    }
}

function clearBoxColor() {
    $("#leftBox").children("div").each(function () {
        $(this).css("background-color", "");
    });
}

function setBoxColor() {
    $("#leftBox").children("div").each(function () {
        var thisText = ($(this).text());
        var selectedName = arr[currentSelectNum];

        if (thisText == selectedName) {
            $(this).css("background-color", "red");
        }
    });
}

function appendSelectedName() {
    var div = document.createElement("div");
    div.innerText = arr[currentSelectNum];
    div.className = "nameBox";
    $("#selectedName").append(div);
}

$('#btn').click(function () {
    var curentCount = arr.length;
    if (curentCount < 1) {
        alert("全部抽完了~~~~");
        clearBoxColor();
        return;
    }

    if (this.value === "开始抽奖") {
        // 播放音效
        document.getElementById('drawSound').play();
        document.getElementById('drawSound1').play();
        timeId = setInterval(function () {
            clearBoxColor();
            var num = Math.floor(Math.random() * curentCount);
            currentSelectNum = num;
            setBoxColor();
        }, 90);
        this.value = "停止";
    } else {
        // 停止音效
        document.getElementById('drawSound').pause();
        // document.getElementById('drawSound1').pause();
        document.getElementById('drawSound').currentTime = 0;
        // document.getElementById('drawSound1').currentTime = 0;
        clearInterval(timeId);
        appendSelectedName();
        arr.splice(currentSelectNum, 1);
        this.value = "开始抽奖";
    }
});

getTime();
setInterval(getTime, 1000);

function getTime() {
    var day = new Date();
    var year = day.getFullYear();
    var month = day.getMonth() + 1;
    var dat = day.getDate();
    var hour = day.getHours();
    var minute = day.getMinutes();
    var second = day.getSeconds();
    month = month < 10? "0" + month : month;
    dat = dat < 10? "0" + dat : dat;
    hour = hour < 10? "0" + hour : hour;
    minute = minute < 10? "0" + minute : minute;
    second = second < 10? "0" + second : second;
    $("#span").text(year + "-" + month + "-" + dat + " " + hour + ":" + minute + ":" + second);
}

四、完整代码

<!doctype html>
<html>

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>抽奖小工具</title>
    <script src="https://libs.baidu.com/jquery/1.10.2/jquery.min.js"></script>

    <style>
        body {
            background-color: #f0f8ff;
            font-family: 'Arial', sans-serif;
            color: #333;
        }

        .wrapDiv {
            width: 80%;
            max-width: 1200px;
            margin: 0 auto;
            text-align: center;
            position: absolute;
            top: 80px;
            left: 0;
            right: 0;
            background: #ffffff;
            box-shadow: 0 0 15px rgba(0, 0, 0, 0.1);
            border-radius: 10px;
            padding: 20px;
        }

        .leftBox {
            width: 100%;
            height: auto;
            margin: 20px auto;
            padding: 10px;
            border-bottom: 2px solid #e0e0e0;
            overflow: hidden;
        }

        #span {
            float: right;
            margin-top: 10px;
            font-size: 16px;
            color: #666;
        }

        #btn {
            width: 150px;
            height: 40px;
            background-color: #007bff;
            color: white;
            border: none;
            border-radius: 5px;
            cursor: pointer;
            margin: 20px auto;
            font-size: 16px;
        }

        #btn:hover {
            background-color: #0056b3;
        }

        .nameBox {
            width: 100px;
            height: 40px;
            float: left;
            background-color: #f8f9fa;
            margin: 10px;
            text-align: center;
            line-height: 40px;
            border-radius: 5px;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
            transition: background-color 0.3s, color 0.3s;
        }

        .nameBox:hover {
            background-color: #007bff;
            color: white;
        }

        .selectedName {
            width: 100%;
            background: #f8f9fa;
            margin-top: 20px;
            padding: 20px;
            border-radius: 10px;
            box-shadow: 0 0 15px rgba(0, 0, 0, 0.1);
            height: auto;
        }

        .selectedName h1 {
            color: #007bff;
        }

        h1 {
            text-align: center;
            font-size: 24px;
            margin-bottom: 20px;
            color: #007bff;
        }
    </style>
</head>

<body>
<audio id="drawSound" src="draw.mp3" preload="auto"></audio>
<audio id="drawSound1" src="drawSound1.mp3" preload="auto"></audio>
    <h1>抽奖</h1>
    <span id="span"></span>

    <div class="wrapDiv">
        <div id="leftBox" class="leftBox"></div>
        <input type="button" id="btn" value="开始抽奖">
        <div id="selectedName" class="selectedName">
            <h1>抽中名单</h1>
        </div>
    </div>
    <img src="./first-logo.png" alt="First Logo" style="position: absolute; top: 80px; left: 100px; width: 150px; height: auto;">
<!--    <img src="./second-logo.png" alt="Second Logo" style="position: absolute; top: 94px; left: 200px; width: 150px; height: auto;">-->
    <br>

    <script>
        var arr = ['刘备','关羽','张飞','赵云','马超','黄忠','诸葛亮','庞统','姜维','魏延','马岱','关平','周仓','廖化','法正','李严','黄权','孟达','刘封','马良','马谡','蒋琬','费祎','董允','向宠','张苞','关兴','曹仁','曹洪','夏侯惇','夏侯渊','张辽','张郃','徐晃','许褚','典韦','郭嘉','荀彧','荀攸','贾诩','程昱','司马懿','司马师','司马昭','邓艾','钟会','孙策','孙权','周瑜','鲁肃','貂蝉','大乔','小乔','孙尚香'];
        var orgArrCount = arr.length;
        var currentSelectNum = 0;

        function shuffle(array) {
            for (let i = array.length - 1; i > 0; i--) {
                const j = Math.floor(Math.random() * (i + 1));
                [array[i], array[j]] = [array[j], array[i]];
            }
            return array;
        }

        arr = shuffle(arr);

        initForm();

        function initForm() {
            var selectedNameHeight = orgArrCount / 3 * 40 + 120;
            $("#selectedName").css("height", selectedNameHeight + "px");
            dynamicCreateBox();
        }

        function dynamicCreateBox() {
            for (var i = 0; i < arr.length; i++) {
                var div = document.createElement("div");
                div.innerText = arr[i];
                div.className = "nameBox";
                $("#leftBox").append(div);
            }
        }

        function clearBoxColor() {
            $("#leftBox").children("div").each(function () {
                $(this).css("background-color", "");
            });
        }

        function setBoxColor() {
            $("#leftBox").children("div").each(function () {
                var thisText = ($(this).text());
                var selectedName = arr[currentSelectNum];

                if (thisText == selectedName) {
                    $(this).css("background-color", "red");
                }
            });
        }

        function appendSelectedName() {
            var div = document.createElement("div");
            div.innerText = arr[currentSelectNum];
            div.className = "nameBox";
            $("#selectedName").append(div);
        }

        $('#btn').click(function () {
            var curentCount = arr.length;
            if (curentCount < 1) {
                alert("全部抽完了~~~~");
                clearBoxColor();
                return;
            }

            if (this.value === "开始抽奖") {
                   // 播放音效
                document.getElementById('drawSound').play();
                document.getElementById('drawSound1').play();
                timeId = setInterval(function () {
                    clearBoxColor();
                    var num = Math.floor(Math.random() * curentCount);
                    currentSelectNum = num;
                    setBoxColor();
                }, 90);
                this.value = "停止";
            } else {
                  // 停止音效
                document.getElementById('drawSound').pause();
<!--                document.getElementById('drawSound1').pause();-->
                document.getElementById('drawSound').currentTime = 0;
<!--                document.getElementById('drawSound1').currentTime = 0;-->
                clearInterval(timeId);
                appendSelectedName();
                arr.splice(currentSelectNum, 1);
                this.value = "开始抽奖";
            }
        });

        getTime();
        setInterval(getTime, 1000);

        function getTime() {
            var day = new Date();
            var year = day.getFullYear();
            var month = day.getMonth() + 1;
            var dat = day.getDate();
            var hour = day.getHours();
            var minute = day.getMinutes();
            var second = day.getSeconds();
            month = month < 10 ? "0" + month : month;
            dat = dat < 10 ? "0" + dat : dat;
            hour = hour < 10 ? "0" + hour : hour;
            minute = minute < 10 ? "0" + minute : minute;
            second = second < 10 ? "0" + second : second;
            $("#span").text(year + "-" + month + "-" + dat + " " + hour + ":" + minute + ":" + second);
        }
    </script>

</body>

</html>

五、目录树

    draw.mp3  # 声音2 
    drawSound1.mp3 # 声音1 
    first-logo.png # logo
    index.html  # 主文件
    
    
 声音和logo文件可之间替换,抽奖的人也可以之间在index.html 文件里面之间进行修改。 不放回抽

六、效果

6.1 界面

6.2 抽奖过程

6.3 最后一个

七、文件位置

解压密码:  lottery

蓝奏云: https://wwsl.lanzoul.com/iAAMb278n8yd

百度网盘: 通过百度网盘分享的文件:抽奖脱敏版
链接:https://pan.baidu.com/s/1aTxx94Xjv17m4lWBVvDr5g?pwd=gcxn 
提取码:gcxn 
--来自百度网盘超级会员V6的分享

gittee: 这是合集下面的一个小项目。
https://gitee.com/suifeng55549/small_tolls.git 

posted @ 2024-08-22 16:24  随风小屋  阅读(48)  评论(0编辑  收藏  举报