10.原生动画效果(用定时器做)

想让一个块级元素的宽逐渐变大的动画效果,不用css3,用原生JS做的话,就要用定时器

image.png

用offsetWidth能取到元素宽度

offsetWidth是啥呢?内容宽度+padding+border
image.png
image.png
image.png
image.png

image.png

image.png

image.png

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>原生JS动画</title>
    <style>
        #div1{
            width: 400px;
            height: 400px;
            background: #FF0;
        }
    </style>
</head>
<body>
<div id="div1">hhhhh</div>
<script>
    var oDiv1 = document.getElementById("div1");
    oDiv1.onclick = function(){
        var timer = setInterval(function(){
            // this.style.width = this.style.width + 10 +"px";这句不好使,取不到外联样式里的值
            oDiv1.style.width = oDiv1.offsetWidth + 10 +"px";//offsetWidth 获取值不带单位
            if(oDiv1.offsetWidth == 800){
                clearInterval(timer);
            }
        },500)

    }
</script>
</body>
</html>

注意到上面的代码,,我们没用this获取当前对象,因为在定时器里,this指向window,那要是我一定要用this呢,请参照我的另一篇文章,this指向问题,问题就迎刃而解了

第一种 把this指向保存到一个变量里面,这样就不怕被定时器改成指向window了

image.png

var oDiv1 = document.getElementById("div1");
    oDiv1.onclick = function(){
        var _this = this;
       var timer =  setInterval(function(){
            _this.style.width = _this.offsetWidth + 10 + "px";
            if(_this.offsetWidth==500){
              clearInterval(timer);
            }
        },50)

    }
第二种 在定时器处理函数后面绑定改变this指向的函数bind,只绑定,不调用,到时候他点击的时候自己调用

image.png

var oDiv1 = document.getElementById("div1");
    oDiv1.onclick = function(){
        var timer =  setInterval(function(){
            this.style.width = this.offsetWidth + 10 + "px";
            if(this.offsetWidth==500){
                clearInterval(timer);
            }
        }.bind(this),50)
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值