JSFiddle - React, Tailwind, and code Playground
by Shang WenLong
HTML
<div class="carousel">
<ol class="indicator"><!-- 这是下面那个指示 -->
<li class="active" data-slider-to="0"></li>
<li class="" data-slider-to="1"></li>
<li class="" data-slider-to="2"></li>
</ol>
<div class="item-wrap"><!-- 这是你放内容的容器 -->
<div class="item active">
<div class="dummy-image-1">我是内容1</div><!-- 我没图片,就用div和背景颜色代替 -->
</div>
<div class="item">
<div class="dummy-image-2">我是内容2</div>
</div>
<div class="item">
<div class="dummy-image-3">我是内容3</div>
</div>
</div>
<!-- 这里你可以放2个箭头按钮,不知道怎么做的话再问我 -->
</div>
CSS
.carousel{
border:1px solid #000;
width:500px;
height:200px;
position:relative;
}
.carousel .indicator{
margin:0;
padding:0;
position:absolute;
bottom:20px;
left:20px;
list-style:none;
z-index:2;
}
.carousel .indicator > li{
display:inline-block;
width: 10px;
height: 10px;
cursor: pointer;
background-color: #fff;
border: 1px solid #000;
border-radius: 50%;
}
.carousel .indicator > li.active{
background-color: #000;
border: 1px solid red;
}
.carousel .item-wrap{
width:100%;
height:100%;
overflow:hidden;
position:relative;
}
.carousel .item-wrap .item{
position: absolute;
left:100%;
width:100%;
height:100%;
}
.carousel .item-wrap .item.active{
left:0;
}
.dummy-image-1{
width:100%;
height:100%;
background:red;
}
.dummy-image-2{
width:100%;
height:100%;
background:green;
}
.dummy-image-3{
width:100%;
height:100%;
background:blue;
}
JavaScript
//这里我就简单写写,你可以写成封装成控件等等
function toArray(nodeList){
return Array.prototype.slice.call(nodeList,0);
}
function addClass(dom,className){
var classArray = dom.className.split(' ');
if (classArray.indexOf(className) > -1){
return;
}
classArray.push(className);
dom.className = classArray.join(' ');
}
function removeClass(dom,className){
var classArray = dom.className.split(' '),
index = classArray.indexOf(className)
if (index < 0){
return;
}
classArray.splice(index,1);
dom.className = classArray.join(' ');
}
var fps = 60;
var step = 1/fps;
var container = document.querySelector('.carousel');
var itemWrap = container.querySelector('.item-wrap');
var items = itemWrap.querySelectorAll('.item');
items = toArray(items);
var indicator = container.querySelector('.indicator');
var isAnimation = false;
function slideLeftIn(dom,duration){
var start = 100;
var scale = step/duration;
isAnimation = true;
(function loop(){
if(Math.abs(start) < scale){
dom.style.left = 0;
isAnimation = false;
console.log('end1');
return;
}
setTimeout(function(){
start-=scale*100;
dom.style.left = start+"%";
loop();
},step*1000);
})();
}
function slideLeftOut(dom,duration){
var end = 0;
var scale = step/duration;
(function loop(){
if(Math.abs(end) >100+scale){
dom.style.left = "-100%";
console.log('end2');
return;
}
setTimeout(function(){
end+=scale*100;
dom.style.left = -end+"%";
loop();
},step*1000);
})();
}
indicator.addEventListener('click',function(e){
var target = e.target,slideTo = 0,
activedIndicator = null,
activedItem = 0;
if(isAnimation){
return;
}
if(target.tagName.toLowerCase()==='li'){
activedIndicator =...