js实现终极无缝滚动轮播

感觉没有特别难得,也就动画的函数封装很有用,没有jQuery,里面$随便加的不要在意,

css
* {
margin: 0;
padding: 0;
}

    #view {
        width: 200px;
        height: 300px;
        border: 2px solid red;
        overflow: hidden
    }

    #banner {
        overflow: hidden;
        width: 800px;
    }

    #banner img {
        float: left;
    }

    img {
        width: 200px;
        height: 300px;
    }
</style>

html:

<div id="view">
    <div id="banner">
        <img src="./2019-12-11dom事件/img/1.jpg" alt="">
        <img src="./2019-12-11dom事件/img/2.jpg" alt="">
        <img src="./2019-12-11dom事件/img/3.jpg" alt="">


    </div>
</div>
<button id="next">1234</button>
<button id="prev">上</button>

js

<script>
    var banner = document.querySelector('#banner');
    var banner_item = document.querySelector('#banner').children;
    var clone = banner_item[0].cloneNode(true);
    var prev = document.querySelector('#prev');
    banner.appendChild(clone);

    var next = document.querySelector('#next');
    var x = 0;

    next.onclick = function () {
        x++;
        if (x > banner_item.length - 1) {
            x = 1;
            banner.style.marginLeft = 0;
        }
        $_animation(banner, "marginLeft", -x * 200, 1000,function(){
            
        })
    }
    prev.onclick = function () {
        count--;
        if (x < 0) {
            x = 2;
            banner.style.marginLeft = -200 + "px";
        }
        $_animation(banner, "marginLeft", -x *200, 100,function(){

        })
    }
    var flag=true

function $_animation(el, str, end, tm, fn) {
clearInterval(el.timer)
// 1:获取初始样式
var start = getSty(el, str);
start = parseFloat(start);
// 2: 求差
var s = end - start;
// 3;执行动画
el.timer = setInterval(function () {
start += s / tm * 16.7; // 每次属性值的变化(例如每次移动距离)
if (s > 0) {// end>start 业务
if (start >= end) {
start = end;
clearInterval(el.timer);
flag=true
el.style[str] = str === ‘opacity’ ? start : start + ‘px’;
// 执行下一个动画业务从合理
fn ? fn() : null; // 判断是否有参数;如果有参数;执行回调函数
} else {
el.style[str] = str === ‘opacity’ ? start : start + ‘px’;
}

    } else {
        // 处理end <start 业务
        if (start <= end) {
            start = end;
            clearInterval(el.timer);
            flag=true
            el.style[str] = str === 'opacity' ? start : start + 'px';
            fn ? fn() : null;

        } else {
            el.style[str] = str === 'opacity' ? start : start + 'px';
        }
    }

}, 16.7)

}

function getSty(el, str) {
var res;
if (el.currentStyle) {
// ie
res = el.currentStyle[str];
} else {
// 非IE
res = getComputedStyle(el)[str];
}

return res;

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值