一个 div 手写红绿灯- 分别用 css3 和 js 实现

【要求】

一个div,配合 css3 或者 js 实现红绿灯切换的效果。

【思路】

使用 css3,要实现红绿灯颜色的变换必然要用到 animation 动画,通过 keyframes 控制颜色的渐变效果。

使用 js,则需要使用定时器,在定时器的方法中改变 div 的类名或者直接修改样式,来控制颜色的变换。

【实现】

首先看dom结构,非常简单,一个div:

<div class="hld" id="hld"></div>

基本样式:

.hld {
    width: 100px;
    height: 100px;
    border-radius: 50%;
    background: red;
  }
  .red {
    background: red;
  }
  .green {
    background: green;
  }

【css3实现】

.hld {
    width: 100px;
    height: 100px;
    border-radius: 50%;
    background: red;
    animation: hld 1s ease-in-out 1s infinite;
  }
  @keyframes hld {
    0% { background: red; }
    100% { background: green; }
  }

思路很简单,定义两个关键帧,0%的时候设置背景色为红色,100%的时候设置为绿色,需要注意的地方就是动画的写法,这里简单复习一下:

keyframes

@keyframes animationname {keyframes-selector {css-styles;}}
  • animationname: 动画名称,在 animation 属性值中使用
  • keyframes-selector: 动画时长的百分比,关键词 "from" 和 "to",等价于 0% 和 100%。
  • css-styles: 一个或多个合法的 css 样式属性

【注意】

animation

div {
  animation: myfirst 5s linear 2s infinite alternate;
  /* Firefox: */
  -moz-animation: myfirst 5s linear 2s infinite alternate;
  /* Safari 和 Chrome: */
  -webkit-animation: myfirst 5s linear 2s infinite alternate;
  /* Opera: */
  -o-animation: myfirst 5s linear 2s infinite alternate;
}
  • animation-name: 规定 @keyframes 动画的名称。
  • animation-duration: 规定动画完成一个周期所花费的秒或毫秒。默认是 0
  • animation-timing-function: 规定动画的速度曲线。默认是 "ease"  —— linear | ease | ease-in | ease-out | ease-in-out)
  • animation-delay: 规定动画何时开始(延迟时间)。默认是 0
  • animation-iteration-count: 规定动画被播放的次数。默认是 1  —— n | infinite
  • animation-direction: 规定动画是否在下一周期逆向地播放。默认是 "normal" —— normal | alternate(轮流反向播放)
  • animation-play-state: 规定动画是否正在运行或暂停。默认是 "running" —— paused | running
  • animation-fill-mode: 规定对象动画时间之外的状态。 

【效果】

 

【js实现】

// 获取目标节点
  var node = document.getElementById('hld');
  // 定义颜色变换方法
  function turnColor () {
    // 在定时器中动态设置 div 类名
    setTimeout(function () {
      node.className = 'hld red'
      setTimeout(function () {
        node.className = 'hld green'
        // 递归执行方法
        setTimeout(turnColor, 0)
      }, 1000)
    }, 1000)
  }
  turnColor()

【优化】

尽管上述 js 代码已经能够符合要求,但是从 api 设计的角度上来说,没有提供统一的简单的执行入口,因此还可以继续优化,如下:

// 获取目标节点方法
  function TargetEle (node) {
    this.node = document.getElementById(node)
  }
  // 设置原型方法
  TargetEle.prototype.turn = function () {
    // 获取目标节点
    let thisNode = this.node;
    // 主动执行颜色变换方法
    (function turnColor () {
      setTimeout(() => {
        thisNode.className = 'hld red'
        setTimeout(() => {
          thisNode.className = 'hld green'
          setTimeout(turnColor(), 0)
        }, 1000)
      }, 1000)
    })()
  }
  // 生成原型实例的方法
  function getEle (node) {
    let ele = new TargetEle(node)
    return ele
  }
  // api: 提供节点id, 执行对应方法即可
  getEle('hld').turn()

【效果】

 

【总结】

一个简单的效果,考察了 css3 的使用,在使用 js 实现过程中,体现了对定时器、函数原型、以及api设计的了解和掌握程度。

 

【参考】

17年毕业生杭州求职web前端

js面试题--红绿灯切换效果

CSS3 动画

CSS3 @keyframes 规则

 

转载于:https://www.cnblogs.com/wx1993/p/8426384.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
观察十字路口红绿灯工作流程,设计交通灯。 1、初始时:南北向、东西向直行左转均为红灯 2、南北向直行: ①南北向直行绿灯亮,延时若干秒 ②启动南北向左转数码管显示:倒计时6秒;同时南北向直行绿灯闪烁3下,灭亮灭亮灭亮共3秒,然后南北向直行绿灯灭,南北向直行黄灯亮,延时3秒 ③南北向左转数码管倒计时显示结束,关闭;同时南北向直行黄灯灭,南北向直行红灯亮 3、南北向左转: ①南北向左转绿灯亮,延时若干秒 ②启动东西向直行数码管显示:倒计时6秒;同时南北向左转绿灯闪烁3下,灭亮灭亮灭亮共3秒,然后南北向左转绿灯灭,南北向左转黄灯亮,延时3秒 ③东西向直行数码管倒计时显示结束,关闭;同时南北向左转黄灯灭,南北向左转红灯亮 4、东西向直行: ①东西向直行绿灯亮,延时若干秒 ②启动东西向左转数码管显示:倒计时6秒;同时东西向直行绿灯闪烁3下,灭亮灭亮灭亮共3秒,然后东西向直行绿灯灭,东西向直行黄灯亮,延时3秒 ③东西向左转数码管倒计时显示结束,关闭;同时东西向直行黄灯灭,东西向直行红灯亮 5、东西向左转: ①东西向左转绿灯亮,延时若干秒 ②启动南北向直行数码管显示:倒计时6秒;同时东西向左转绿灯闪烁3下,灭亮灭亮灭亮共3秒,然后东西向左转绿灯灭,东西向左转黄灯亮,延时3秒 ③南北向直行数码管倒计时显示结束,关闭;同时东西向左转黄灯灭,东西向左转红灯亮

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值