js无缝滚动实现及原理详解
js无缝滚动实现及原理详解
【案例分析】
①点击左(右)按钮一次,就让图片滚动一次
②声明一个变量i,
每点击一次右侧按钮,自增1,让这个变量*图片的宽度,即为ul移动的距离
每点击一次左侧按钮,自减1,让这个变量*图片的宽度,即为ul移动的距离
③图片无缝滚动原理
将ul中第一张图片所在的li复制一份,放到ul的最后面。需要强调移动是ul不是li,实现如下:
a.,当图片滚动到克隆的最后一张图片时,此时再点击右侧按钮,让ul快速的、不做动画的跳到最左侧(第一张图片处):left:0+'px';

b.同理,当图片滚动到第一张图片时,此时再点击左侧按钮,让ul快速的、不做动画的跳到最右侧(克隆的最后一张图片处):
left: -img_width * (ul.children.length - 1)+'px';

c.同时,将变量i重置为初始值0,这就可以从新开始滚动图片了
【应用知识点】
1、animate动画函数,将animate动画函数所在annimate.js文件引入
注意:可见使用动画函数的前提,该元素必须有定位,因为添加了定位的元素才能使用element.style.left
2、克隆节点。cloneNode()加true深克隆,复制里面的子节点,false或省略为浅克隆
3、添加节点appenChild()
4、element.offsetWidth返回自身包括padding、边框、内容区的宽度,返回数值不带单位。
注意:offsetWidth为只读属性,只能获取不能赋值。
5、给elemt.style.left赋值时末尾注意+‘px’
html代码:
<!-- 引入动画函数 -->
<script src="animate.js"></script>
<body> <div class="banner"> <ul> <li><img src="images/1.jpg" alt=""></li> <li><img src="images/2.jpg" alt=""></li> <li><img src="images/3.jpg" alt=""></li> <li><img src="images/4.jpg" alt=""></li> </ul> <!-- 右侧按钮 --> <div class="forward"> <a href="javascript:;">》</a> </div> <!-- 左侧按钮 --> <div class="back"> <a href="javascript:;">《</a> </div> </div> </body>
css代码:
<style> * { margin: 0; padding: 0; } a { text-decoration: none; color: #000000; font-size: 24px; } .banner { position: relative; width: 1024px; height: 688px; margin: 100px auto; overflow: hidden; } .banner ul { position: relative; width: 6000px; height: 688px; background-color: darkslategray; } li { float: left; width: 1024px; height: 688px; overflow: hidden; list-style: none; background-color: chocolate; } .forward { position: absolute; right: 0; top: 340px; } .back { position: absolute; left: 0; top: 340px; } </style>
js代码:
<script>
//1、获取元素对象
var forward = document.querySelector('.forward');
var back = document.querySelector('.back');
var ul = document.querySelector('.banner').querySelector('ul');
var firstli = ul.children[0];
//2、把ul第一个li复制一份,放到ul的最后面
var firstli_clone = firstli.cloneNode(true);
ul.appendChild(firstli_clone)
console.log(firstli);
//3、声明一个变量i
var i = 0;
//图片的宽度(=包含图片小li的宽度)
var img_width = document.querySelector('.banner').querySelector('li').offsetWidth;
//4、右侧按钮
forward.addEventListener('click', function() {
if (i == ul.children.length - 1) {
ul.style.left = 0 + 'px';
i = 0;
}
i++;
// diaplacement表ul需要移动的距离
var diaplacement = -img_width * i;
animate(ul, diaplacement);
});
//5、左侧按钮
back.addEventListener('click', function() {
if (i == 0) {
ul.style.left = -img_width * (ul.children.length - 1) + 'px';
i = ul.children.length - 1;
}
i--;
// diaplacement表ul需要移动的距离
var diaplacement = -img_width * i;
animate(ul, diaplacement);
});
</script>
效果:

浙公网安备 33010602011771号