JavaScript花式点名

简单的HTML+CSS+JavaScript小练手

运行展示

一、初始界面

在这里插入图片描述

二、随机排号

可以连续的单击,多次按人头随机排号,下图中点了三次
在这里插入图片描述

三、顺序排号

顺序排号,一次就好,点多少次排号结果都是一样的
在这里插入图片描述

四、水平点名

单击水平点名,其它的点名按钮被禁用,沿着水平方向,一行一行地向下跑,跑到终点后回头重新跑,再次单击水平点名就停下,下图中跑了两轮,停在65
在这里插入图片描述

五、垂直点名

单击垂直点名,其它的点名按钮被禁用,沿着垂直方向,一列一列地从左向右跑,跑到终点后回头重新跑,再次单击垂直点名就停下,下图中跑了两轮,停在2
在这里插入图片描述

六、水平S型点名

单击水平S型点名,其它的点名按钮被禁用,沿着水平S型方向,一行一行地由上向下跑,跑到终点后回头重新跑,再次单击水平S型点名就停下,下图中跑了两轮,停在6
在这里插入图片描述

七、竖直S型点名

单击竖直S型点名,其它的点名按钮被禁用,沿着竖直S型方向,一列一列地从左向右跑,跑到终点后回头重新跑,再次单击水平S型点名就停下,下图中跑了两轮,停在32
在这里插入图片描述

八、一边点名一边随机排号

点名按钮可任选,随机排号可以在点名过程一直单击
下图按80个人先顺序排号,其次水平点名,再多次随机排号,最后结束水平点名
在这里插入图片描述

运行代码

一、html和css

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>newborn</title>
    <link rel="stylesheet" href="./css/newborn.css">
</head>
<body>
<div id="outcome"></div>
<div id="container">
    <div id="controlBar">
            <input type="number" id="numberInput" min="10" max="100" placeholder="pepole's number"  autofocus>
            <button id="randomNumberingButton" onmousedown="randomNumbering()">随机排号</button>
            <button id="orderlyNumberingButton" onmousedown="orderlyNumbering()">顺序排号</button>
            <button id="horizontalCallingButton" onmousedown="horizontalCalling()">水平点名</button>
            <button id="verticalCallingButton" onmousedown="verticalCalling()">垂直点名</button>
            <button id="bendCallingButton1" onmousedown="bendCalling1()">水平S型点名</button>
            <button id="bendCallingButton2" onmousedown="bendCalling2()">竖直S型点名</button>
    </div>

    <div id="veil">

    </div>
</div>
<script src="./js/newborn.js"></script>
</body>
</html>
body
{
    background-image: url("../image/1.jpg");
    background-size: cover;
}
#outcome
{
    width: 1000px;
    height:90px;
    /*border: dotted 1px mediumpurple;*/
    margin-left: auto;
    margin-right: auto;
    text-align: center;
    font-size: 30px;
    color: ghostwhite;
    line-height: 90px;
    visibility: hidden;
}
#container
{
    width: 1000px;
    height: 600px;
    /*border: dotted 1px mediumpurple;*/
    margin-left: auto;
    margin-right: auto;
    /*margin-top: 5%;*/
}
#controlBar
{
    width: 280px;
    height: 600px;
    border: orange 1px solid;
    float:left;
    text-align: center;
}
#numberInput
{
    display: inline-block;
    width: 200px;
    height: 36px;
    border-radius: 18px;
    /*border: 3px white solid;*/
    border: none;
    outline: none;
    margin-top: 30px;
    /*opacity: 0.3;*/
    background: orange;
    font-size: 18px;
}
#numberInput:hover
{
    background:#E4C6A5;
    width: 206px;
    height: 42px;
}
button:hover
{
    background:#E4C6A5;
    width: 206px;
    height: 42px;
}
button{
    display: inline-block;
    width: 200px;
    height: 36px;
    border-radius: 18px;
    border: none;
    outline: none;
   margin-top: 30px;
    background-color: orange;
    font-size: 18px;
}

#veil
{
    width: 700px;
    height: 600px;
    border: red 1px dotted;
    border-radius: 3%;
    float:right;
}
.row
{
    width: 100%;
    height: 60px;
    /*边界线同样占据空间*/
    /*border: blue 1px solid;*/
    text-align: center;
}
.column
{
    width:50px;
    height: 50px;
    border: silver 1px solid;
    display: inline-block;
    border-radius: 20%;
    margin-left: 10px;
    line-height: 50px;
    font-size: 25px;
    color: yellow;
}

二、JavaScript

function createRow() //创建行div并设置class属性值
{
    var row;
    var veil = window.document.getElementById("veil");
    for (var i = 0; i < 10; i++) {
        row = window.document.createElement("div");
        row.setAttribute("class", "row");
        veil.appendChild(row);
    }
}

function createColumn() //在行的基础上,创建列div并设置class和id属性值
{
    var rowArray = window.document.getElementsByClassName("row");
    var length = rowArray.length;
    var column;
    var textNode;
    var number = 0;
    for (var rowIndex = 0; rowIndex < length; rowIndex++) {
        for (var k = 0; k < 10; k++) {
            column = window.document.createElement("div");
            column.setAttribute("class", "column");
            column.setAttribute("id", number + "");
            // column.style.visibility="hidden";
            textNode = window.document.createTextNode(number + "")
            column.appendChild(textNode);
            rowArray[rowIndex].appendChild(column);
            number++;
        }
    }
}

function setVisibility(array, value, begin, length)
{
    for (; begin < length; begin++) {
        array[begin].style.visibility = value;
    }
}

function getDataInput() //从输入框里获取用户输入的人数
{
    var numberInput = window.document.getElementById("numberInput");
    var maxNumber = numberInput.value;
    if (maxNumber === null || maxNumber.trim()=="") {
        alert("请正确输入");
        return null;
    }
    if (maxNumber < 10 || maxNumber > 100) {
        alert("人数不得少于10或者大于100");
        return null;
    }
    return maxNumber;
}

function numbering(numberArray) //根据已存入编号的数组,将数组每个元素的值(即编号)显现在div小方格上
{
    var column;
    var number;
    for (var i = 0; i < numberArray.length; i++) {
        column = window.document.getElementById(i.toString());
        number = numberArray[i];//div小方格上所需的编号都存储在numberArray中
        column.innerText = number.toString();//div小方格上显现的编号
        column.style.visibility = "visible";//显现div小方格
    }
}

var length = 100;
//length为函数randomNumbering、orderlyNumbering所共用的全局变量
//存储人数,也是存储div小方格的数量,最大为100

var columnArray = window.document.getElementsByClassName("column");
//所有的div小方格对象数组,所有div小方格的class属性均为column
//所有的div小方格均有唯一的id属性值,id从零开始编号
function randomNumbering() //随机编号函数
{
    var maxNumber = getDataInput();
    if(maxNumber==null)
    {
        return;
    }
    setVisibility(columnArray, "hidden", 0, length);//隐藏所有div小方格
    length = maxNumber;//用户输入的人数,也就是"编号数组"的长度
    abolishOutcome();//清除上次点名的结果
    var numberArray = [];
    for (var i = 0; i < length; i++)//把生成的随机数存入"编号数组"
    {
        numberArray[i] = Math.round((Math.random() * 1000) % maxNumber)+1;
    }
    numbering(numberArray);

}

function orderlyNumbering()//顺序编号函数
{
    var maxNumber = getDataInput();
    if(maxNumber==null)
    {
        return;
    }
    setVisibility(columnArray, "hidden", 0, length);//隐藏所有div小方格
    length = getDataInput();
    abolishOutcome();
    var numberArray = [];
    for (var i = 0; i < length; i++) {
        numberArray[i] = i + 1;
    }
    numbering(numberArray);
}

function setBackgroundColor(id, color) {
    var element = window.document.getElementById(id);
    element.style.backgroundColor = color;
}

var counter = 0;//全局变量counter为数组下标,数组内存储div小方格的id属性值
//在函数vitalize运行之后,counter只会在函数内部取到零,外部取不到零
function vitalize(array)//整体代码运行的核心思想,
{
// 把一群div小方格的id属性值存入数组,
// 不管是在div小方格们上水平走,竖直走,水平S型走,竖直S型走
//在数组上都是直着走,div小方格们上的走法全是直着存入数组中
    if (counter === array.length) {
        setBackgroundColor(array[counter - 1], "");
        counter = 0;
    }
    setBackgroundColor(array[counter], "#E4C6A5");//某一个div小方格有背景色
    for (var i = 0; i < counter; i++)//那它前面的小方格们就没有背景色
    {
        setBackgroundColor(array[i], "");
    }
    counter++;
}

function abolishOutcome()   //褪去上一次点名选中div小方格的背景色及结果信息展示
{
    var outcome = window.document.getElementById("outcome");
    if (outcome.style.visibility == "visible")//显现点名结果div,id为outcome,若可见
    {
        outcome.style.visibility = "hidden";//则让其不可见
        if (counter > 0)//同时,若"编号数组"下标counter大于0,则说明已经进行过一次点名了
        {
            setBackgroundColor(identifierArray[counter - 1], "");//让选中的div小方格褪去背景色
        }
    }
}

function manifestOutcome()
{
    var column = window.document.getElementById(identifierArray[counter - 1] + "");
    var outcome = window.document.getElementById("outcome");
    outcome.style.visibility = "visible";
    outcome.innerText = "Congratulation!" + column.innerText;//将选中div小方格的信息显现出来
}

function enableCallingButton(id) //启用某一个点名按钮
{
    var button = window.document.getElementById(id);
    button.removeAttribute("disabled");
    button.style.backgroundColor = "orange";
}

function enableCallingButtons(idArray)//同时启用一连串点名按钮
{
    var button;
    for (var i = 0; i < idArray.length; i++) {
        button = window.document.getElementById(idArray[i]);
        button.removeAttribute("disabled");
        button.style.backgroundColor = "orange";
    }
}

function disableCallingButtons(idArray) 同时禁用一连串点名按钮
{
    var button;
    for (var i = 0; i < idArray.length; i++) {
        button = window.document.getElementById(idArray[i]);
        button.setAttribute("disabled", "disabled");
        button.style.backgroundColor = "#27231F";
    }
}
function validateData(maxNumber)
{
    if (maxNumber == null)
        return false;
    if(maxNumber>length || maxNumber<length)//length为上次的人数,也是上次div小方格的数量
    {
        alert("请先排号");
        return false;
    }
    return true;
}



var identifierArray;
var timeout = 50;
var horizontalInterval = null;
var verticalInterval = null;
var bendCalling1Interval = null;
var bendCalling2Interval = null;
var buttonIdArray = ["horizontalCallingButton", "verticalCallingButton", "bendCallingButton1", "bendCallingButton2"];

function horizontalCalling() {
    var maxNumber = getDataInput();
    if(validateData(maxNumber)==false)
        return;
    if (horizontalInterval == null)
    {
        disableCallingButtons(buttonIdArray);//禁用所有点名按钮
        enableCallingButton("horizontalCallingButton");//启用当前已单击过的点名按钮
        abolishOutcome();//清除上次点名留下的数据
        counter = 0;//"编号数组"下标归零,重头开始点名
        // -------------------------------------------水平点名行走坐标id
        var array = [];
        for (var i = 0; i < maxNumber; i++) {
            array[i] = i;
        }
        identifierArray = array;
        // -------------------------------------------水平点名行走坐标id
        horizontalInterval = window.setInterval(function () {
            vitalize(array)
        }, timeout);
    } else {
        window.clearInterval(horizontalInterval);
        horizontalInterval = null;
        manifestOutcome();
        enableCallingButtons(buttonIdArray);
    }
}

function verticalCalling() {
    var maxNumber = getDataInput();
    if(validateData(maxNumber)==false)
        return;
    if (verticalInterval == null) {
        disableCallingButtons(buttonIdArray);
        enableCallingButton("verticalCallingButton");
        abolishOutcome();
        counter = 0;//数组下标归零,重头开始点名
        // -------------------------------------------垂直点名行走坐标id
        var row = Math.ceil(maxNumber / 10);
        var index = 0
        var array = [];
        var id = 0;//id为行走下标,存储div的id属性值,从零开始计算,最大值为maxNumber-1
        for (var column = 0; column < 10; column++) {
            for (var i = 0; i < row; i++) {
                id = column + i * 10;
                array[index++] = id;
                if (id == maxNumber - 1)
                    row = row - 1;
            }
        }
        identifierArray = array;
        // -------------------------------------------垂直点名行走坐标id

        verticalInterval = window.setInterval(function () {
            vitalize(array)
        }, timeout);
    } else {
        window.clearInterval(verticalInterval);
        verticalInterval = null;
        manifestOutcome();
        enableCallingButtons(buttonIdArray);
    }
}

function bendCalling1() {
    var maxNumber = getDataInput();
    if(validateData(maxNumber)==false)
        return;
    if (bendCalling1Interval == null) {
        disableCallingButtons(buttonIdArray);
        enableCallingButton("bendCallingButton1");
        abolishOutcome();
        counter = 0;//数组下标归零,重头开始点名
        // -------------------------------------------水平S型点名行走坐标id
        var array = [];
        var symbol = 0;
        var row = Math.ceil(maxNumber / 10);
        console.log("maxNumber" + maxNumber);
        var id = 0;///id为"行走下标",存储div小方格的id属性值,从零开始计算,最大值为maxNumber-1
        for (var i = 0; i < row; i++)//行下标 从零开始计算
        {
            if (i % 2 == 0) {
                id = i * 10;
                symbol = 1;
            } else {
                id = i * 10 + 9;
                symbol = -1;
            }
            for (var j = 0; j < 10; j++) //列下标 从零开始计算
            {
                if (id >= maxNumber)//最后一个奇数行,行走初始id
                {
                    id = maxNumber - 1;
                }
                array[i * 10 + j] = id
                if ((symbol == 1 && id == maxNumber - 1) || (symbol == -1 && id == (row - 1) * 10))//"偶数行"和"奇数行"行走坐标结束标志
                {
                    break;
                }
                id = id + symbol;
            }
        }
        identifierArray = array;
        // -------------------------------------------水平S型点名行走坐标id
        bendCalling1Interval = window.setInterval(function () {
            vitalize(array)
        }, timeout);
    } else {
        window.clearInterval(bendCalling1Interval);
        bendCalling1Interval = null;
        manifestOutcome();
        enableCallingButtons(buttonIdArray);
    }
}

function bendCalling2() {
    var maxNumber = getDataInput();
    if(validateData(maxNumber)==false)
        return;
    if (bendCalling2Interval == null) {
        disableCallingButtons(buttonIdArray);
        enableCallingButton("bendCallingButton2");
        abolishOutcome();
        counter = 0;//数组下标归零,重头开始点名
        // -------------------------------------------竖直S型点名行走坐标id
        var array = [];
        var symbol = 1;//行下标进行加/减运算标志,1是加,-1是减
        var row = Math.ceil(maxNumber / 10);//总行数
        var begin;//行起始下标
        var index = 0;//数组下标
        for (var column = 0; column < 10; column++) //列下标
        {
            if (column % 2 == 0) {
                begin = 0;
                symbol = 1;
            } else {
                begin = row - 1;//下标从零开始,所以最后一行的下标等于总行数减一
                symbol = -1;
            }
            for (var i = begin; i >= 0 && i < row; i = i + symbol) //行下标
            {
                if (i * 10 + column == maxNumber)//竖直S型行走到最大编号处,行数减一
                {
                    row = row - 1;
                    continue;
                }
                array[index] = i * 10 + column;
                index++;
            }
        }
        identifierArray = array;
        // -------------------------------------------竖直S型点名行走坐标id
        bendCalling2Interval = window.setInterval(function () {
            vitalize(array)
        }, timeout);
    } else {
        window.clearInterval(bendCalling2Interval);
        bendCalling2Interval = null;
        manifestOutcome();
        enableCallingButtons(buttonIdArray);
    }
}



createRow();
createColumn();

想说的话

写代码很容易,写出让自己满意的代码则需要耗费巨大的心血和苦苦的思索,而写出让别人满意的代码需要学科学的套路并学以致用。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值