无缝衔接轮播图——原生JS实现
原理就不讲了,太麻烦了,大致原理就是两扇推拉门,始终保持推拉门处于开启-闭合状态,大致就这样吧,原理很简单,只是说实现比较麻烦,一直想要实现这样的效果,奈何水平不够,也没那么多的时间来研究,趁最近有点闲时,就研究了一下,在部分浏览器上面可能存在一定的加载闪烁,下面是效果图(图片为网图,侵权即删):
接下来就是源码了,想要明白原理的就自己看代码吧,注释也不想写了,不想明白原理的可以直接拿来用,其他的特效可以自己看着加,这里只是一个简单的demo,提供一种实现无缝轮播的思路,毕竟transition属性定义了就无法干掉:
HTML
<div class="wrap">
<ul class="one">
<li class="list"><img src="images/1.jpg" alt=""></li>
<li class="list"><img src="images/2.jpg" alt=""></li>
</ul>
<ul class="two">
<li class="list"><img src="images/3.jpg" alt=""></li>
<li class="list"><img src="images/4.jpg" alt=""></li>
</ul>
</div>
<div class="to-left" onclick="toLeft()"><</div>
<div class="to-right" onclick="toRight()">></div>
CSS
* {
padding: 0;
margin: 0;
}
ul {
list-style: none;
}
img {
height: 600px;
width: 1200px;
}
.wrap {
height: 600px;
width: 1200px;
overflow: hidden;
margin: 50px auto;
position: relative;
}
.one, .two {
height: 600px;
width: 2400px;
position: absolute;
top: 0;
transition: left 1s;
}
.list {
float: left;
}
.to-left, .to-right {
height: 40px;
width: 40px;
text-align: center;
line-height: 40px;
background-color: black;
color: white;
float: left;
margin: 2px 20px;
cursor: pointer;
}
JavaScript
var list = document.getElementsByClassName("list");
var one = document.getElementsByClassName("one")[0];
var two = document.getElementsByClassName("two")[0];
var status = "right";
var change_flag = 0,
changing_flag = false;
var imgs = ["H:/images/1.jpg", "H:/images/2.jpg", "H:/images/3.jpg", "H:/images/4.jpg"];
var img_flag1 = imgs.length - 1,
img_flag2 = 0;
list[0].getElementsByTagName("img")[0].src = imgs[img_flag1];
list[1].getElementsByTagName("img")[0].src = imgs[(img_flag1 + 1) % imgs.length];
list[2].getElementsByTagName("img")[0].src = imgs[img_flag2];
list[3].getElementsByTagName("img")[0].src = imgs[(img_flag2 + 1) % imgs.length];
one.style.opacity = 1;
two.style.opacity = 0;
one.style.left = "-1200px";
two.style.left = 0;
function toLeft() {
if(changing_flag) { return; }
toChange("left");
changing_flag = true;
setTimeout(() => {
changing_flag = false;
}, 1000);
imgLoad(-2);
}
function toRight() {
if(changing_flag) { return; }
changing_flag = true;
setTimeout(() => {
changing_flag = false;
}, 1000);
toChange("right");
imgLoad(2);
}
function toChange(direction) {
if(status != direction) {
one.style.opacity = two.style.opacity == 0 ? 0 : 1;
two.style.opacity = two.style.opacity == 0 ? 1 : 0;
change_flag = ++ change_flag % 2;
}
status = direction;
two.style.opacity = one.style.opacity == 0 ? 0 : 1;
one.style.opacity = one.style.opacity == 0 ? 1 : 0;
two.style.left = one.style.left == "-1200px" ? "-1200px" : 0;
one.style.left = one.style.left == "-1200px" ? 0 : "-1200px";
}
function imgLoad(num) {
list[0].getElementsByTagName("img")[0].src = imgs[img_flag1];
list[1].getElementsByTagName("img")[0].src = imgs[(img_flag1 + 1) % imgs.length];
list[2].getElementsByTagName("img")[0].src = imgs[img_flag2];
list[3].getElementsByTagName("img")[0].src = imgs[(img_flag2 + 1) % imgs.length];
if(!change_flag) {
img_flag1 = (img_flag1 + imgs.length + num) % imgs.length;
}
else {
img_flag2 = (img_flag2 + imgs.length + num) % imgs.length;
}
change_flag = ++ change_flag % 2;
}
学习分享,一起成长!以上为小编的经验分享,若存在不当之处,请批评指正!