返回上一级

原生JS实现文字从下到上无缝轮播效果 公告轮播效果

多说无益,先看效果

公告

在市面上找了许多无缝轮播效果样式,基本都离不开jQ,只好自己把jQ改写成原生实现了

来源地址:https://www.cnblogs.com/ccdr/p/10082157.html

这是原来jQ的实现部分

 1/*
 2* 参数说明
 3* obj : 动画的节点,本例中是ul
 4* top : 动画的高度,本例中是-35px;注意向上滚动是负数
 5* time : 动画的速度,即完成动画所用时间,本例中是500毫秒,即marginTop从0到-35px耗时500毫秒
 6* function : 回调函数,每次动画完成,marginTop归零,并把此时第一条信息添加到列表最后;
 7* 
 8*/
 9function noticeUp(obj,top,time) {
10 $(obj).animate({
11 marginTop: top
12 }, time, function () {
13 $(this).css({marginTop:"0"}).find(":first").appendTo(this);
14 })
15}

换用原生JS实现

 1function noticeUp(obj, top, time) {
 2    var element = document.querySelector(obj);
 3    var start = null;
 4    var targetMarginTop = parseInt(top, 10);
 5    var initialMarginTop = parseInt(window.getComputedStyle(element).marginTop, 10);
 6    var changeInValue = targetMarginTop - initialMarginTop;
 7    var currentTime = 0;
 8    var increment = 20;
 9    var animateMargin = function (timestamp) {
10        if (!start) start = timestamp;
11        currentTime += increment;
12        var val = Math.easeInOutQuad(currentTime, initialMarginTop, changeInValue, time);
13        element.style.marginTop = val + 'px';
14        if (currentTime < time) {
15            requestAnimationFrame(animateMargin);
16        } else {
17            element.style.marginTop = '0px';
18            element.appendChild(element.firstElementChild);
19        }
20    };
21    // t = current time, b = start value, c = change in value, d = duration
22    Math.easeInOutQuad = function (t, b, c, d) {
23        t /= d / 2;
24        if (t < 1) return c / 2 * t * t + b;
25        t--;
26        return -c / 2 * (t * (t - 2) - 1) + b;
27    };
28    requestAnimationFrame(animateMargin);
29}

不得不说jQ真的方便,比原生现实代码少了几倍

最后整个页面整理了一下

大概就是

 1<!DOCTYPE html>
 2<html>
 3
 4<head lang="en">
 5    <meta charset="UTF-8">
 6    <title>文字从下到上无缝轮播</title>
 7    <style>
 8        div,
 9        ul,
10        li {
11            margin: 0;
12            padding: 0
13        }
14
15        /*先初始化一下默认样式*/
16        .notice {
17            width: 300px;
18            /*单行显示,超出隐藏*/
19            height: 35px;
20            /*固定公告栏显示区域的高度*/
21            padding: 0 30px;
22            background-color: #b3effe;
23            overflow: hidden;
24        }
25
26        .notice ul li {
27            list-style: none;
28            line-height: 35px;
29            /*以下为了单行显示,超出隐藏*/
30            display: block;
31            white-space: nowrap;
32            text-overflow: ellipsis;
33            overflow: hidden;
34        }
35    </style>
36</head>
37
38<body>
39    <div class="notice">
40        <ul>
41            <li>1条公告第1条公告第1条公告第1条公告第1条公告第1条公告</li>
42            <li>2条公告第2条公告第2条公告第2条公告第2条公告第2条公告</li>
43            <li>3条公告第3条公告第3条公告第3条公告第3条公告第3条公告</li>
44            <li>4条公告第4条公告第4条公告第4条公告第4条公告第4条公告</li>
45        </ul>
46    </div>
47    <script>
48        function noticeUp(obj, top, time) {
49            var element = document.querySelector(obj);
50            var start = null;
51            var targetMarginTop = parseInt(top, 10);
52            var initialMarginTop = parseInt(window.getComputedStyle(element).marginTop, 10);
53            var changeInValue = targetMarginTop - initialMarginTop;
54            var currentTime = 0;
55            var increment = 20;
56
57            var animateMargin = function (timestamp) {
58                if (!start) start = timestamp;
59                currentTime += increment;
60                var val = Math.easeInOutQuad(currentTime, initialMarginTop, changeInValue, time);
61                element.style.marginTop = val + 'px';
62                if (currentTime < time) {
63                    requestAnimationFrame(animateMargin);
64                } else {
65                    element.style.marginTop = '0px';
66                    element.appendChild(element.firstElementChild);
67                }
68            };
69
70            // t = current time, b = start value, c = change in value, d = duration
71            Math.easeInOutQuad = function (t, b, c, d) {
72                t /= d / 2;
73                if (t < 1) return c / 2 * t * t + b;
74                t--;
75                return -c / 2 * (t * (t - 2) - 1) + b;
76            };
77
78            requestAnimationFrame(animateMargin);
79        }
80
81
82        setInterval("noticeUp('.notice ul','-35px',500)", 2000);
83
84    </script>
85</body>
86
87</html>