<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
div {
width: 200px;
height: 200px;
position: relative;
margin: 100px auto;
overflow: hidden;
border: 1px solid blue;
}
ul {
display: flex;
align-items: center;
width: max-content;
position: relative;
z-index: -1;
}
ul li {
width: 200px;
height: 200px;
font-size: 20px;
display: flex;
align-items: center;
justify-content: center;
flex-basis: 300px;
}
.a {
background-color: red;
}
.b {
background-color: yellow;
}
.c {
background-color: greenyellow;
}
.d {
background-color: aqua;
}
</style>
</head>
<body>
<div>
<ul>
<li class="a">1</li>
<li class="b">2</li>
<li class="c">3</li>
<li class="d">4</li>
</ul>
</div>
<button onclick="leftNext(true)">左移动</button>
<button onclick="rightNext(true)">右移动</button>
<button onclick="begin()">开启定时器</button>
<script>
// 轮播定时器
let setFn = null;
// 轮播元素容器【ul】
const ul = document.querySelector("ul");
// 轮播元素【li】总列表
const lis = ul.querySelectorAll("li");
// 轮播元素总长度
const itemLen = lis.length;
// 轮播元素宽度
const itemWidth = lis[0].offsetWidth;
// 默认轮播下标
let cindex = 0;
// 复制第一个元素
const fr = ul.firstElementChild.cloneNode(true);
// 复制最后一个元素
const la = ul.lastElementChild.cloneNode(true);
// 将复制第一个元素添加到后面
ul.appendChild(fr);
// 将复制最后一个元素添加到前面
ul.insertBefore(la, ul.firstElementChild);
// 将复制的最后一个元素进行定位并往前位移自身宽度,使容器依然默认显示第一张元素,不然将显示复制的最后一个元素
la.style.transform = "translateX(-100%)";
la.style.position = "absolute";
// 移动函数 每次将容器【ul】往前位移一个轮播元素【li】的宽度
function moveTo(index) {
ul.style.transform = `translateX(${(index) * -itemWidth}px)`;
ul.style.transition = ".5s";
cindex = index;
}
// 向右移动
function rightNext(boolean = false) {
/* 当此时显示容器【div】最后一张元素,接着向右移动时
* 将整个轮播容器【ul】先出其不意地将复制的最后一个元素移动到显示容器【div】,然后往前位移一个轮播元素【li】的宽度
* 相当于从最后一个元素无缝切换到了第一个元素
* */
if (setFn && boolean) {
clearInterval(setFn);
setFn = null;
}
// 此时显示容器【div】最后一张元素
if (cindex == itemLen - 1) {
// 立马将整个轮播容器【ul】往后移动一个轮播元素【li】的宽度,显示容器【div】显示的是复制的最后一个元素
ul.style.transform = `translateX(${itemWidth}px)`;
ul.style.transition = 'none';
// 强制渲染
ul.clientHeight;
// 移动到第一个元素,从肉眼看是从最后一个无缝移动到了第一个
moveTo(0);
} else {
cindex++
moveTo(cindex);
}
}
// 向左移动
function leftNext(boolean = false) {
if (setFn && boolean) {
clearInterval(setFn);
setFn = null;
}
if (cindex == 0) {
ul.style.transform = `translateX(-${itemLen * itemWidth}px)`;
ul.style.transition = 'none';
ul.clientHeight;
moveTo(itemLen - 1);
} else {
cindex--;
moveTo(cindex);
}
}
function begin() {
setFn = setInterval(function () {
rightNext();
}, 1000);
}
begin();
</script>
</body>
</html>
关于H5实现无缝轮播
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 转自:https://www.bilibili.com/read/cv1522826/[https://www.b...