阅读 219

JavaScript实现消消乐的源代码

这篇文章主要介绍了JavaScript实现消消乐-源代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

JavaScript实现消消乐的源码下载地址:点击下载源代码

在这里插入图片描述

index.html

123456789101112131415161718192021222324252627<!doctype html><html lang="en">    <head>        <meta charset="UTF-8">        <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">        <meta http-equiv="X-UA-Compatible" content="ie=edge">        <title>LuckyStar</title>        <link rel="stylesheet" href="./css/index.css?v=1.0.0" rel="external nofollow" >    </head>    <body>        <div class="lucky-star" id="luckyStar">            <div class="score-target">                <p class="score-level">关卡 <span id="scoreLevel"></span></p>                <p>目标:<span id="scoreTarget"></span></p>            </div>            <div class="score-current">得分<span id="scoreCurrent"></span></div>            <div class="score-select" id="scoreSelect"></div>            <ul class="star-list" id="starList"> </ul>        </div>    </body>     <script src="./js/countUp.js"></script>    <script src="./js/index.js"></script>    <script src="./js/resize.js"></script>    <script>        new PopStar()     </script></html>

JS文件

在这里插入图片描述

main.js

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383(function() {    //全局配置     var config = {        tileWidth: .75, //小星星的宽高        tileHeight: .75,        tileSet: [], //存储小星星的二维数组        tableRows: 10, //行数        baseScore: 5, //每一个小星星的基础分数        stepScore: 10, //每一个小星星的递增分数        targetScore: 2000, //目标分数,初始为2000        el: document.querySelector('#starList'),// 星星列表        scoreTarget: document.querySelector('#scoreTarget'),//目标分数        scoreCurrent: document.querySelector('#scoreCurrent'),//当前分数        scoreSelect: document.querySelector('#scoreSelect'),//选中星星分数        scoreLevel: document.querySelector('#scoreLevel'),//当前所在的关数    };     //全局计算属性    var computed = {        flag: true, //锁        choose: [], //已选中的小星星集合        timer: null,        totalScore: 0, //总分数        tempTile: null,        level: 1, //当前所在的关数(每闯过一关+1,游戏失败回复为1)        stepTargetScore: 1000, //闯关成功的递增分数(1000/关)        score: 0 //当前的计算分数    };     //Block对象    function Block(number, row, col) {        var tile = document.createElement('li');        tile.width = config.tileWidth;        tile.height = config.tileHeight;        tile.number = number;        tile.row = row;        tile.col = col;        return tile;    }      //入口函数    function PopStar() {        return new PopStar.prototype.init();    }     //PopStar原型    PopStar.prototype = {        /**         * PopStar的入口函数         */        init: function() {            this.initTable();        },        /**         * 初始化操作         */        initTable: function() {            this.initScore();            this.initTileSet();            this.initBlocks();        },         /**         * 初始化当前分数和目标         */        initScore: function() {            new CountUp(config.scoreTarget, config.targetScore, config.targetScore).start();            config.scoreCurrent.innerHTML = computed.totalScore;            config.scoreLevel.innerHTML = computed.level;        },        /**         * 点击事件操作         */        mouseClick: function() {            var tileSet = config.tileSet,                choose = computed.choose,                baseScore = config.baseScore,                stepScore = config.stepScore,                el = config.el,                self = this,                len = choose.length;            if (!computed.flag || len <= 1) {                return;            }            computed.flag = false;            computed.tempTile = null;            var score = 0;            for (var i = 0; i < len; i++) {                score += baseScore + i * stepScore;             }             new CountUp(config.scoreCurrent, computed.totalScore, computed.totalScore += score).start();            for (var i = 0; i < len; i++) {                setTimeout(function(i) {                    tileSet[choose[i].row][choose[i].col] = null;                    el.removeChild(choose[i]);                }, i * 100, i);            }            setTimeout(function() {                self.move();                //判断结束                setTimeout(function() {                    if (self.isFinish()) {                        self.clear();                        if (computed.totalScore >= config.targetScore) {                            new CountUp(config.scoreTarget, config.targetScore, config.targetScore += (computed.level - 1) * computed                                    .stepTargetScore)                                .start();                             new CountUp(config.scoreLevel, computed.level, computed.level += 1).start();                            alert("恭喜获胜");                            console.log("恭喜获胜")                        } else {                            config.targetScore = config.scoreTarget = 2000;                            computed.level = computed.totalScore = 0;                            alert("游戏失败");                            console.log("游戏失败")                        }                        computed.flag = true;                                             } else {                        choose = [];                        computed.flag = true; //在所有动作都执行完成之后释放锁                        self.mouseOver(computed.tempTile);                    }                }, 300 + choose.length * 150);            }, choose.length * 100);        },        /**         * 闯关成功或失败清除(清除二维数组和el的子节点)操作         */        clear: function() {            var tileSet = config.tileSet,                rows = tileSet.length,                el = config.el;             var temp = [];            for (var i = rows - 1; i >= 0; i--) {                for (var j = tileSet[i].length - 1; j >= 0; j--) {                    if (tileSet[i][j] === null) {                        continue;                    }                    temp.push(tileSet[i][j])                    tileSet[i][j] = null;                }            }            for (var k = 0; k < temp.length; k++) {                setTimeout(function(k) {                     el.removeChild(temp[k]);                            if(k>=temp.length-1){                                setTimeout(function(k) {                                         new PopStar();                                },1000)                         }                }, k * 100, k);            }        },        /**         * 是否游戏结束         * @returns {boolean}         */        isFinish: function() {            var tileSet = config.tileSet,                rows = tileSet.length;            for (var i = 0; i < rows; i++) {                var row = tileSet[i].length;                for (var j = 0; j < row; j++) {                    var temp = [];                    this.checkLink(tileSet[i][j], temp);                    if (temp.length > 1) {                        return false;                    }                }            }            return true;        },        /**         * 消除星星后的移动操作         */        move: function() {            var rows = config.tableRows,                tileSet = config.tileSet;            //向下移动            for (var i = 0; i < rows; i++) {                var pointer = 0; //pointer指向小方块,当遇到null的时候停止,等待上面的小方块落到这里来                for (var j = 0; j < rows; j++) {                    if (tileSet[j][i] != null) {                        if (j !== pointer) {                            tileSet[pointer][i] = tileSet[j][i];                            tileSet[j][i].row = pointer;                            tileSet[j][i] = null;                        }                        pointer++;                    }                }            }            //横向移动(最下面一行其中有无空列)            for (var i = 0; i < tileSet[0].length;) {                if (tileSet[0][i] == null) {                    for (var j = 0; j < rows; j++) {                        tileSet[j].splice(i, 1);                    }                    continue;                }                i++;            }            this.refresh()        },        /**         * 鼠标移入时的闪烁操作         * @param obj         */        mouseOver: function(obj) {            if (!computed.flag) { //处于锁定状态不允许有操作                computed.tempTile = obj;                return;            }            this.clearFlicker();            var choose = [];            this.checkLink(obj, choose);            computed.choose = choose;            if (choose.length <= 1) {                choose = [];                return;            }            this.flicker(choose);            this.computeScore(choose);        },        /**         * 计算已选中的星星分数         * @param arr         */        computeScore: function(arr) {            var score = 0,                len = arr.length,                baseScore = config.baseScore,                stepScore = config.stepScore;            for (var i = 0; i < len; i++) {                score += baseScore + i * stepScore            }            if (score <= 0) {                return;            }            computed.score = score;            config.scoreSelect.style.opacity = '1';            config.scoreSelect.innerHTML = arr.length + "连消 " + score + "分";            setTimeout(function() {                config.scoreSelect.style.opacity = '0';            }, 1200)        },        /**         * 鼠标移出时的消除星星闪烁的操作         */        clearFlicker: function() {            var tileSet = config.tileSet;            for (var i = 0; i < tileSet.length; i++) {                for (var j = 0; j < tileSet[i].length; j++) {                    var div = tileSet[i][j];                    if (div === null) {                        continue;                    }                    div.classList.remove("scale");                }            }        },        /**         * 星星闪烁         * @param arr         */        flicker: function(arr) {            for (var i = 0; i < arr.length; i++) {                var div = arr[i];                div.classList.add("scale");            }        },        /**         * 检查鼠标移入的这个星星是否有相连着的相同的星星,         * @param obj star         * @param arr choose         */        checkLink: function(obj, arr) {            if (obj === null) {                return;            }            arr.push(obj);            /**             * 检查左边方块是否可以加入到选入的可消除星星行列:             * 选中的星星不能是最左边的,             * 选中的星星左边要有星星,             * 选中的星星左边的星星的跟选中的星星一样,             * 选中的星星左边的星星没有被选中过             */            var tileSet = config.tileSet,                rows = config.tableRows;            if (obj.col > 0 && tileSet[obj.row][obj.col - 1] && tileSet[obj.row][obj.col - 1].number === obj.number && arr.indexOf(                    tileSet[obj.row][obj.col - 1]) === -1) {                this.checkLink(tileSet[obj.row][obj.col - 1], arr);            }            if (obj.col < rows - 1 && tileSet[obj.row][obj.col + 1] && tileSet[obj.row][obj.col + 1].number === obj.number &&                arr.indexOf(tileSet[obj.row][obj.col + 1]) === -1) {                this.checkLink(tileSet[obj.row][obj.col + 1], arr);            }            if (obj.row < rows - 1 && tileSet[obj.row + 1][obj.col] && tileSet[obj.row + 1][obj.col].number === obj.number &&                arr.indexOf(tileSet[obj.row + 1][obj.col]) === -1) {                this.checkLink(tileSet[obj.row + 1][obj.col], arr);            }            if (obj.row > 0 && tileSet[obj.row - 1][obj.col] && tileSet[obj.row - 1][obj.col].number === obj.number && arr.indexOf(                    tileSet[obj.row - 1][obj.col]) === -1) {                this.checkLink(tileSet[obj.row - 1][obj.col], arr);            }        },        /**         * 初始化二维数组         */        initTileSet: function() {            var rows = config.tableRows,                arr = config.tileSet;            for (var i = 0; i < rows; i++) {                arr[i] = [];                for (var j = 0; j < rows; j++) {                    arr[i][j] = [];                }            }        },        /**         * 初始化el的子节点         */        initBlocks: function() {            var tileSet = config.tileSet,                self = this,                el = config.el,                cols = tileSet.length;            for (var i = 0; i < cols; i++) {                var rows = tileSet[i].length;                for (var j = 0; j < rows; j++) {                    var tile = this.createBlock(Math.floor(Math.random() * 5), i, j);                    tile.onmouseover = function() {                        self.mouseOver(this)                    };                    tile.onclick = function() {                        self.mouseClick();                    };                                          tileSet[i][j] = tile;                    el.appendChild(tile);                }            }            this.refresh()        },        /**         * 渲染el的子节点         */        refresh: function() {            var tileSet = config.tileSet;            for (var i = 0; i < tileSet.length; i++) {                var row = tileSet[i].length;                for (var j = 0; j < row; j++) {                    var tile = tileSet[i][j];                    if (tile == null) {                        continue;                    }                    tile.row = i;                    tile.col = j;                     tile.style.left = tileSet[i][j].col * config.tileWidth + "rem";                    tile.style.bottom = tileSet[i][j].row * config.tileHeight + "rem";                    tile.style.backgroundImage = "url('./images/" + tileSet[i][j].number + ".png')";                 }            }        },        /**         * 创建星星子节点的函数         * @param number         * @param row         * @param col         * @returns {HTMLElement}         */        createBlock: function(number, row, col) {            return new Block(number, row, col);        },     };    PopStar.prototype.init.prototype = PopStar.prototype;    window.PopStar = PopStar;})();

index.js

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116(function(){function u(a,b,c){var d=document.createElement("li");d.width=e.tileWidth;d.height=e.tileHeight;d.number=a;d.row=b;d.col=c;return d}function m(){return new m.prototype.init}var e={tileWidth:.75,tileHeight:.75,tileSet: [],tableRows:10,baseScore:5,stepScore:10,targetScore:2E3,el:document.querySelector("#starList"),scoreTarget:document.querySelector("#scoreTarget"),scoreCurrent:document.querySelector("#scoreCurrent"),scoreSelect:document.querySelector("#scoreSelect"),scoreLevel:document.querySelector("#scoreLevel")},n=!0,t=[],p=0,r=null,q=1;m.prototype={init:function(){this.initTable()},initTable:function(){this.initScore();this.initTileSet();this.initBlocks()},initScore:function(){(new CountUp(e.scoreTarget,e.targetScore,e.targetScore)).start();e.scoreCurrent.innerHTML=p;e.scoreLevel.innerHTML=q},mouseClick:function(){var a=e.tileSet,b=t,c=e.baseScore,d=e.stepScore,f=e.el,g=this,h=b.length;if(n&&!(1>=h)){n=!1;r=null;for(var l=0,k=0;k<h;k++)l+=c+k*d;(new CountUp(e.scoreCurrent,p,p+=l)).start();for(k=0;k<h;k++)setTimeout(function(c){a[b[c].row][b[c].col]=null;f.removeChild(b[c])},100*k,k);setTimeout(function(){g.move();setTimeout(function(){g.isFinish()?(g.clear(),p>=e.targetScore?((new CountUp(e.scoreTarget,e.targetScore,e.targetScore+=1E3*(q-1))).start(),(new CountUp(e.scoreLevel,q,q+=1)).start(),alert("\u606d\u559c\u83b7\u80dc"),console.log("\u606d\u559c\u83b7\u80dc")):(e.targetScore=e.scoreTarget=2E3,q=p=0,alert("\u6e38\u620f\u5931\u8d25"),console.log("\u6e38\u620f\u5931\u8d25")),n=!0):(b=[],n=!0,g.mouseOver(r))},300+150*b.length)},100*b.length)}},clear:function(){for(var a=e.tileSet,b=e.el,c=[],d=a.length-1;0<=d;d--)for(var f=a[d].length-1;0<=f;f--)null!==a[d][f]&&(c.push(a[d][f]),a[d][f]=null); for(a=0;a<c.length;a++)setTimeout(function(a){b.removeChild(c[a]);a>=c.length-1&&setTimeout(function(a){new m},1E3)},100*a,a)},isFinish:function(){for(var a=e.tileSet,b=a.length,c=0;c<b;c++)for(var d=a[c].length,f=0;f<d;f++){var g=[];this.checkLink(a[c][f],g);if(1<g.length)return!1}return!0},move:function(){for(var a=e.tableRows,b=e.tileSet,c=0;c<a;c++)for(var d=0,f=0;f<a;f++)null!=b[f][c]&&(f!==d&&(b[d][c]=b[f][c],b[f][c].row=d,b[f][c]=null),d++);for(c=0;c<b[0].length;)if(null==b[0][c])for(f=0;f<a;f++)b[f].splice(c,1);else c++;this.refresh()},mouseOver:function(a){if(n){this.clearFlicker();var b=[];this.checkLink(a,b);t=b;1>=b.length||(this.flicker(b),this.computeScore(b))}else r=a},computeScore:function(a){for(var b=0,c=a.length,d=e.baseScore,f=e.stepScore,g=0;g<c;g++)b+=d+g*f;0>=b||(e.scoreSelect.style.opacity="1",e.scoreSelect.innerHTML=a.length+"\u8fde\u6d88 "+b+"\u5206",setTimeout(function(){e.scoreSelect.style.opacity="0"},1200))},clearFlicker:function(){for(var a=e.tileSet,b=0;b<a.length;b++)for(var c=0;c<a[b].length;c++){var d=a[b][c];null!==d&&d.classList.remove("scale")}},flicker:function(a){for(var b=0;b<a.length;b++)a[b].classList.add("scale")},checkLink:function(a,b){if(null!==a){b.push(a);var c=e.tileSet,d=e.tableRows;0<a.col&&c[a.row][a.col-1]&&c[a.row][a.col-1].number===a.number&&-1===b.indexOf(c[a.row][a.col-1])&&this.checkLink(c[a.row][a.col-1],b);a.col<d-1&&c[a.row][a.col+1]&&c[a.row][a.col+1].number===a.number&&-1===b.indexOf(c[a.row][a.col+1])&&this.checkLink(c[a.row][a.col+1],b);a.row<d-1&&c[a.row+1][a.col]&&c[a.row+1][a.col].number===a.number&&-1===b.indexOf(c[a.row+1][a.col])&&this.checkLink(c[a.row+1][a.col],b);0<a.row&&c[a.row-1][a.col]&&c[a.row-1][a.col].number===a.number&&-1===b.indexOf(c[a.row-1][a.col])&&this.checkLink(c[a.row-1][a.col],b)}},initTileSet:function(){for(var a=e.tableRows,b=e.tileSet,c=0;c<a;c++){b[c]=[];for(var d= 0;d<a;d++)b[c][d]=[]}},initBlocks:function(){for(var a=e.tileSet,b=this,c=e.el,d=a.length,f=0;f<d;f++)for(var g=a[f].length,h=0;h<g;h++){var l=this.createBlock(Math.floor(5*Math.random()),f,h);l.onmouseover=function(){b.mouseOver(this)};l.onclick=function(){b.mouseClick()};a[f][h]=l;c.appendChild(l)}this.refresh()},refresh:function(){for(var a=e.tileSet,b=0;b<a.length;b++)for(var c=a[b].length,d=0;d<c;d++){var f=a[b][d];null!=f&&(f.row=b,f.col=d,f.style.left=a[b][d].col*e.tileWidth+"rem",f.style.bottom=a[b][d].row*e.tileHeight+"rem",f.style.backgroundImage="url('./images/"+a[b][d].number+".png')")}},createBlock:function(a,b,c){return new u(a,b,c)}};m.prototype.init.prototype=m.prototype;window.PopStar=m})();

resize.js

1234567891011121314151617181920212223// JavaScript Document(function px2rem(doc, win) {  var docEl = doc.documentElement,    resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',    recalc = function () {      var clientWidth = docEl.clientWidth;      if (!clientWidth) return;      docEl.style.fontSize = 100 * (clientWidth / 750) + 'px';      /*       * 100 -> html,body { font-size:100px; }       * 750 -> 此处以 iPhone6 两倍设计稿 宽度750px 布局页面       * 根据具体情况改变这两个数值       */    };  if (!doc.addEventListener) return;  // 窗口大小发生变化,初始化  win.addEventListener(resizeEvt, recalc, false);  doc.addEventListener('DOMContentLoaded', recalc, false);  //防止在html未加载完毕时执行,保证获取正确的页宽  setTimeout(function(){    px2rem(doc, win);  }, 200);})(document, window);

countUp.js

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260(function(root, factory) { if (typeof define === 'function' && define.amd) {  define(factory); } else if (typeof exports === 'object') {  module.exports = factory(require, exports, module); } else {  root.CountUp = factory(); }}(this, function(require, exports, module) { /*     countUp.js    by @inorganik */ // target = id of html element or var of previously selected html element where counting occurs// startVal = the value you want to begin at// endVal = the value you want to arrive at// decimals = number of decimal places, default 0// duration = duration of animation in seconds, default 2// options = optional object of options (see below) var CountUp = function(target, startVal, endVal, decimals, duration, options) {     var self = this;    self.version = function () { return '1.9.3'; };         // default options    self.options = {        useEasing: true, // toggle easing        useGrouping: true, // 1,000,000 vs 1000000        separator: ',', // character to use as a separator        decimal: '.', // character to use as a decimal        easingFn: easeOutExpo, // optional custom easing function, default is Robert Penner's easeOutExpo        formattingFn: formatNumber, // optional custom formatting function, default is formatNumber above        prefix: '', // optional text before the result        suffix: '', // optional text after the result        numerals: [] // optionally pass an array of custom numerals for 0-9    };     // extend default options with passed options object    if (options && typeof options === 'object') {        for (var key in self.options) {            if (options.hasOwnProperty(key) && options[key] !== null) {                self.options[key] = options[key];            }        }    }     if (self.options.separator === '') {        self.options.useGrouping = false;    }    else {        // ensure the separator is a string (formatNumber assumes this)        self.options.separator = '' + self.options.separator;    }     // make sure requestAnimationFrame and cancelAnimationFrame are defined    // polyfill for browsers without native support    // by Opera engineer Erik Möller    var lastTime = 0;    var vendors = ['webkit', 'moz', 'ms', 'o'];    for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {        window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame'];        window.cancelAnimationFrame = window[vendors[x]+'CancelAnimationFrame'] || window[vendors[x]+'CancelRequestAnimationFrame'];    }    if (!window.requestAnimationFrame) {        window.requestAnimationFrame = function(callback, element) {            var currTime = new Date().getTime();            var timeToCall = Math.max(0, 16 - (currTime - lastTime));            var id = window.setTimeout(function() { callback(currTime + timeToCall); }, timeToCall);            lastTime = currTime + timeToCall;            return id;        };    }    if (!window.cancelAnimationFrame) {        window.cancelAnimationFrame = function(id) {            clearTimeout(id);        };    }     function formatNumber(num) {        var neg = (num < 0),        x, x1, x2, x3, i, len;        num = Math.abs(num).toFixed(self.decimals);        num += '';        x = num.split('.');        x1 = x[0];        x2 = x.length > 1 ? self.options.decimal + x[1] : '';        if (self.options.useGrouping) {            x3 = '';            for (i = 0, len = x1.length; i < len; ++i) {                if (i !== 0 && ((i % 3) === 0)) {                    x3 = self.options.separator + x3;                }                x3 = x1[len - i - 1] + x3;            }            x1 = x3;        }        // optional numeral substitution        if (self.options.numerals.length) {            x1 = x1.replace(/[0-9]/g, function(w) {                return self.options.numerals[+w];            })            x2 = x2.replace(/[0-9]/g, function(w) {                return self.options.numerals[+w];            })        }        return (neg ? '-' : '') + self.options.prefix + x1 + x2 + self.options.suffix;    }    // Robert Penner's easeOutExpo    function easeOutExpo(t, b, c, d) {        return c * (-Math.pow(2, -10 * t / d) + 1) * 1024 / 1023 + b;    }    function ensureNumber(n) {        return (typeof n === 'number' && !isNaN(n));    }     self.initialize = function() {         if (self.initialized) return true;                 self.error = '';        self.d = (typeof target === 'string') ? document.getElementById(target) : target;        if (!self.d) {             self.error = '[CountUp] target is null or undefined'            return false;        }        self.startVal = Number(startVal);        self.endVal = Number(endVal);        // error checks        if (ensureNumber(self.startVal) && ensureNumber(self.endVal)) {            self.decimals = Math.max(0, decimals || 0);            self.dec = Math.pow(10, self.decimals);            self.duration = Number(duration) * 1000 || 2000;            self.countDown = (self.startVal > self.endVal);            self.frameVal = self.startVal;            self.initialized = true;            return true;        }        else {            self.error = '[CountUp] startVal ('+startVal+') or endVal ('+endVal+') is not a number';            return false;        }    };     // Print value to target    self.printValue = function(value) {        var result = self.options.formattingFn(value);         if (self.d.tagName === 'INPUT') {            this.d.value = result;        }        else if (self.d.tagName === 'text' || self.d.tagName === 'tspan') {            this.d.textContent = result;        }        else {            this.d.innerHTML = result;        }    };     self.count = function(timestamp) {         if (!self.startTime) { self.startTime = timestamp; }         self.timestamp = timestamp;        var progress = timestamp - self.startTime;        self.remaining = self.duration - progress;         // to ease or not to ease        if (self.options.useEasing) {            if (self.countDown) {                self.frameVal = self.startVal - self.options.easingFn(progress, 0, self.startVal - self.endVal, self.duration);            } else {                self.frameVal = self.options.easingFn(progress, self.startVal, self.endVal - self.startVal, self.duration);            }        } else {            if (self.countDown) {                self.frameVal = self.startVal - ((self.startVal - self.endVal) * (progress / self.duration));            } else {                self.frameVal = self.startVal + (self.endVal - self.startVal) * (progress / self.duration);            }        }         // don't go past endVal since progress can exceed duration in the last frame        if (self.countDown) {            self.frameVal = (self.frameVal < self.endVal) ? self.endVal : self.frameVal;        } else {            self.frameVal = (self.frameVal > self.endVal) ? self.endVal : self.frameVal;        }         // decimal        self.frameVal = Math.round(self.frameVal*self.dec)/self.dec;         // format and print value        self.printValue(self.frameVal);         // whether to continue        if (progress < self.duration) {            self.rAF = requestAnimationFrame(self.count);        } else {            if (self.callback) self.callback();        }    };    // start your animation    self.start = function(callback) {        if (!self.initialize()) return;        self.callback = callback;        self.rAF = requestAnimationFrame(self.count);    };    // toggles pause/resume animation    self.pauseResume = function() {        if (!self.paused) {            self.paused = true;            cancelAnimationFrame(self.rAF);        } else {            self.paused = false;            delete self.startTime;            self.duration = self.remaining;            self.startVal = self.frameVal;            requestAnimationFrame(self.count);        }    };    // reset to startVal so animation can be run again    self.reset = function() {        self.paused = false;        delete self.startTime;        self.initialized = false;        if (self.initialize()) {            cancelAnimationFrame(self.rAF);            self.printValue(self.startVal);        }    };    // pass a new endVal and start animation    self.update = function (newEndVal) {        if (!self.initialize()) return;        newEndVal = Number(newEndVal);        if (!ensureNumber(newEndVal)) {            self.error = '[CountUp] update() - new endVal is not a number: '+newEndVal;            return;        }        self.error = '';        if (newEndVal === self.frameVal) return;        cancelAnimationFrame(self.rAF);        self.paused = false;        delete self.startTime;        self.startVal = self.frameVal;        self.endVal = newEndVal;        self.countDown = (self.startVal > self.endVal);        self.rAF = requestAnimationFrame(self.count);    };     // format startVal on initialization    if (self.initialize()) self.printValue(self.startVal);}; return CountUp; }));

在这里插入图片描述

index.css

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171a,body,button,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,input,label,li,ol,p,span,table,td,textarea,th,tr,ul{   -webkit-box-sizing:border-box;    -moz-box-sizing:border-box;box-sizing:border-box;    margin:0;padding:0;    border:0;-webkit-tap-highlight-color:transparent}body,html{    width:100%;min-height:100%;background-color:#fff;    -webkit-user-select:none;    -moz-user-select:none;    -ms-user-select:none;    user-select:none}body{color:#333;font-family:微软雅黑}h1,h2,h3,h4,h5,h6{font-weight:400;font-size:100%}a{color:#555}a,a:hover{text-decoration:none}img{border:none}li,ol,ul{list-style:none}input,textarea{outline:0;-webkit-appearance:none}::-webkit-input-placeholder{color:#b0b0b0}:-moz-placeholder,::-moz-placeholder{color:#b0b0b0}:-ms-input-placeholder{color:#b0b0b0}[v-cloak]{display:none}.lucky-star{position:fixed;top:0;left:0;width:100%;height:100%;background-image:url(../images/cover.jpg);background-size:cover;background-repeat:no-repeat;font-size:0;-moz-background-size:cover;-o-background-size:cover}.score-target{padding:0 .3rem;height:1.5rem;-webkit-box-pack:justify;-webkit-justify-content:space-between;-moz-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.score-current,.score-target{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-ms-flexbox;display:flex;width:100%;color:#fff;font-size:.24rem;-webkit-box-align:center;-webkit-align-items:center;-moz-box-align:center;-ms-flex-align:center;align-items:center}.score-current{position:absolute;top:.3rem;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-moz-box-orient:vertical;-moz-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-webkit-justify-content:center;-moz-box-pack:center;-ms-flex-pack:center;justify-content:center}.score-current span{color:#fffc0f;font-size:.48rem}.score-select{width:100%;color:#fff;text-align:center;font-size:.28rem;opacity:0;-webkit-transition:opacity 1s;-moz-transition:opacity 1s;-o-transition:opacity 1s;transition:opacity 1s} .star-list{position:fixed;bottom:0;left:0;width:100%;height:70%}.star-list li{position:absolute;width:.75rem;height:.75rem;border:0;-webkit-border-radius:.16rem;-moz-border-radius:.16rem;border-radius:.16rem;background-size:cover;-webkit-transition:left .3s,bottom .3s,-webkit-transform .3s;-moz-transition:transform .3s,left .3s,bottom .3s,-moz-transform .3s;-o-transition:left .3s,bottom .3s,-o-transform .3s;transition:left .3s,bottom .3s,-webkit-transform .3s;transition:transform .3s,left .3s,bottom .3s;transition:transform .3s,left .3s,bottom .3s,-webkit-transform .3s,-moz-transform .3s,-o-transform .3s;-moz-background-size:cover;-o-background-size:cover}.star-list li.scale{border:2px solid #bfefff;-webkit-animation:scale .3s linear infinite alternate;-moz-animation:scale .3s linear infinite alternate;-o-animation:scale .3s linear infinite alternate;animation:scale .3s linear infinite alternate}.star-list li img{position:absolute;top:15%;left:15%;width:70%;height:70%}@-webkit-keyframes scale{0%{-webkit-transform:scale(1);transform:scale(1)}to{-webkit-transform:scale(.95);transform:scale(.95)}}@-moz-keyframes scale{0%{-moz-transform:scale(1);transform:scale(1)}to{-moz-transform:scale(.95);transform:scale(.95)}}@-o-keyframes scale{0%{-o-transform:scale(1);transform:scale(1)}to{-o-transform:scale(.95);transform:scale(.95)}}@keyframes scale{0%{-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);transform:scale(1)}to{-webkit-transform:scale(.95);-moz-transform:scale(.95);-o-transform:scale(.95);transform:scale(.95)}}

.DS_Store

到此这篇关于JavaScript实现消消乐-源代码的文章就介绍到这了



文章分类
ANDROID
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐