跑马灯案例(29)

在LONG LONG AGO以前,实现跑马灯用的是MARQUEE

    1.不好实现无缝衔接

    2.开始显示内容的时候后有空白

    3.性能消耗大

    4.目前MARQUEE标签基本上被舍弃了

    ...

  现如今跑马灯都是基于JS动画或者CSS3动画实现的

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>珠峰培训</title>
    <link rel="stylesheet" href="css/reset.min.css">
    <style>
        .marqueeBox {
            position: relative;
            margin: 20px auto;
            width: 500px;
            height: 100px;
            border: 1px solid green;
            overflow: hidden;
        }

        .wrapper {
            position: absolute;
            top: 0;
            left: 0;
            width: 900px;
            height: 100px;
        }

        .wrapper li {
            float: left;
            width: 100px;
            height: 100px;
            line-height: 100px;
            text-align: center;
            font-size: 20px;
        }

        .wrapper li:nth-child(3n+1) {
            background: lightblue;
        }

        .wrapper li:nth-child(3n+2) {
            background: lightcyan;
        }

        .wrapper li:nth-child(3n+3) {
            background: lightpink;
        }
    </style>
</head>
<body>
<div class="marqueeBox">
    <ul class="wrapper">
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
        <li>5</li>
        <li>6</li>
        <li>7</li>
        <li>8</li>
        <li>9</li>
    </ul>
</div>

<script src="js/utils.js"></script>
<script src="js/跑马灯.js"></script>
</body>
</html>
/*
 * 实现JS动画
 *   让WRAPPER每间隔一段时间(最优动画时间是13~17MS)在原有的LEFT值基础上减去步长(想让动画快一些,步长就大一点)
 */

let wrapper = document.querySelector('.wrapper');
//1.把WRAPPER中原有的LI整体克隆一份放到容器的末尾(无缝滚动)
/*let wrapperList = wrapper.querySelectorAll('li');
let frg = document.createDocumentFragment();
[].forEach.call(wrapperList, item => {
    frg.appendChild(item.cloneNode(true));
});
wrapper.appendChild(frg);
frg = null;*/
wrapper.innerHTML += wrapper.innerHTML;
utils.css(wrapper, 'width', utils.css(wrapper, 'width') * 2);//=>克隆完成后别忘记修改一下WRAPPER的宽度(内容变多了)

//2.基于定时器实现动画
setInterval(() => {
    //=>获取当前WRAPPER的LEFT值,减去步长,把最新的LEFT赋值给元素即可
    let curL = utils.css(wrapper, 'left');
    curL -= 2;
    utils.css(wrapper, {
        left: curL
    });

    //=>实现无缝:当我们UL距离MARQUEE-BOX的左偏移已经是整个WRAPPER的一半宽度(第一组原始内容已经运动完成了,现在看到的是克隆后的),此时我们让WRAPPER立即运动到LEFT为零的位置即可
    if (Math.abs(wrapper.offsetLeft) >= utils.css(wrapper, 'width') / 2) {
        utils.css(wrapper, 'left', 0);//=>立即回到起始的位置
    }
}, 17);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值