zoukankan      html  css  js  c++  java
  • 一个跑马灯的几种设计思路

    小学选手~

    先看效果 :http://sandbox.runjs.cn/show/994ghu9f

    <ul id="traffic" class="wait">
      <li><span></span></li>
      <li><span></span></li>
      <li><span></span></li>
    </ul>
    
    
    #traffic > li{
      display: block;
    }
     
    #traffic span{
      display: inline-block;
       50px;
      height: 50px;
      background-color: gray;
      margin: 5px;
      border-radius: 50%;
    }
     
    #traffic.stop li:nth-child(1) span{
      background-color: #a00;
    }
     
    #traffic.wait li:nth-child(2) span{
      background-color: #aa0;
    }
     
    #traffic.pass li:nth-child(3) span{
      background-color: #0a0;
    }
    
    const traffic = document.getElementById("traffic");
     
    (function reset(){
      traffic.className = "wait";
     
      setTimeout(function(){
          traffic.className = "stop";
          setTimeout(function(){
            traffic.className = "pass";
            setTimeout(reset, 2000)
          }, 2000)
      }, 2000);
    })();

    2初中水平~(数据抽象

    const traffic = document.getElementById("traffic");
     
    var stateList = ["wait", "stop", "pass"];
     
    var currentStateIndex = 0;
     
    setInterval(function(){
      var state = stateList[currentStateIndex];
      traffic.className = state;
      currentStateIndex = (currentStateIndex + 1) % stateList.length;
    }, 2000);

    2补充--普通青年水平~~

    const traffic = document.getElementById("traffic");
     
    function start(traffic, stateList){
      var currentStateIndex = 0;
     
      setInterval(function(){
        var state = stateList[currentStateIndex];
        traffic.className = state;
        currentStateIndex = (currentStateIndex + 1) % stateList.length;
      }, 2000);
    }
     
    start(traffic, ["wait", "stop", "pass"]);

    3高中水平~过程抽象

    const traffic = document.getElementById("traffic");
    
    function poll(...fnList){
      let stateIndex = 0;
     
      return function(...args){
        let fn = fnList[stateIndex++ % fnList.length];
        return fn.apply(this, args);
      }
    }
     
    function setState(state){
      traffic.className = state;
    }
     
    let trafficStatePoll = poll(setState.bind(null, "wait"),
                                setState.bind(null, "stop"),
                                setState.bind(null, "pass"));
     
    setInterval(trafficStatePoll, 2000);

    4 大学版本~各种新特性哈哈

    const traffic = document.getElementById("traffic");
     
    function wait(time){
      return new Promise(resolve => setTimeout(resolve, time));
    }
     
    function setState(state){
      traffic.className = state;
    }
     
    function reset(){
      Promise.resolve()
        .then(setState.bind(null, "wait"))
        .then(wait.bind(null, 1000))
        .then(setState.bind(null, "stop"))
        .then(wait.bind(null, 2000))
        .then(setState.bind(null, "pass"))
        .then(wait.bind(null, 3000))
        .then(reset);
    }
     
    reset();

    5 宇宙版本……现在有点看不懂 留在以后再看

    const trafficEl = document.getElementById("traffic");
     
    function TrafficProtocol(el, reset){
      this.subject = el;
      this.autoReset = reset;
      this.stateList = [];
    }
     
    TrafficProtocol.prototype.putState = function(fn){
      this.stateList.push(fn);
    }
     
    TrafficProtocol.prototype.reset = function(){
      let subject = this.subject;
     
      this.statePromise = Promise.resolve();
      this.stateList.forEach((stateFn) => {
        this.statePromise = this.statePromise.then(()=>{
          return new Promise(resolve => {
            stateFn(subject, resolve);
          });
        });
      });
      if(this.autoReset){
        this.statePromise.then(this.reset.bind(this));
      }
    }
     
    TrafficProtocol.prototype.start = function(){
      this.reset();
    }
     
    var traffic = new TrafficProtocol(trafficEl, true);
     
    traffic.putState(function(subject, next){
      subject.className = "wait";
      setTimeout(next, 1000);
    });
     
    traffic.putState(function(subject, next){
      subject.className = "stop";
      setTimeout(next, 2000);
    });
     
    traffic.putState(function(subject, next){
      subject.className = "pass";
      setTimeout(next, 3000);
    });
     
    traffic.start();

    参考:http://mp.weixin.qq.com/s?__biz=MzAxODE2MjM1MA==&mid=2651551635&idx=1&sn=a7d6e09a94ef854a94ed578a9de70015&chksm=8025a052b752294443a3a89745ded0cc158bcba1fb6e5af1fa2c223f379341da3b58c8fe00a9&mpshare=1&scene=23&srcid=0108Rg5m1KroA9GpzeTWQBMh#rd

    http://www.cnblogs.com/yunfeifei/p/4453690.html

  • 相关阅读:
    ARP 协议
    天梯赛L1 题解
    DNS域名系统
    LeetCode 三角形最小路径和
    sql注入漏洞的利用
    XSS漏洞防御
    忘记密码功能漏洞挖掘
    sql bypass
    Web环境搭建组合
    常用数据库的总结
  • 原文地址:https://www.cnblogs.com/WhiteHorseIsNotHorse/p/6262564.html
Copyright © 2011-2022 走看看