这篇文章主要为大家详细介绍了js实现移动端轮播图效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
本文实例为大家分享了移动端轮播图效果展示的具体代码,供大家参考,具体内容如下
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<title>document</title>
<link rel="stylesheet" href="reset.css" rel="external nofollow" >
<style>
html,body{
width:100%;
overflow-x:hidden;
}
html{
font-size:100px;
}
.banner{
position:relative;
height:3rem;
overflow:hidden;
}
.banner .wrapper{
position:absolute;
top:0;
left:-100%;
height:100%;
}
.banner .wrapper .slide{
float:left;
height:100%;
background:#eee;
}
.banner .wrapper .slide img{
display:none;
width:100%;
height:100%;
}
.tip{
position:absolute;
left:0;
bottom:.1rem;
width:100%;
height:.16rem;
text-align:center;
}
.tip li{
display:inline-block;
margin:0 .03rem;
width:.16rem;
height:.16rem;
background:rgba(0,0,0,0.2);
border-radius:50%;
vertical-align:top;
}
.tip li.bg{
background:#007aff;
}
</style>
</head>
<body>
<section class='banner'>
<p class='wrapper'>
<!--实现无缝滚动:把第一张放末尾 最后一张放开头-->
<p class='slide'><img src="img/banner5.jpg" alt=""></p>
<p class='slide'><img src="img/banner1.jpg" alt=""></p>
<p class='slide'><img src="img/banner2.jpg" alt=""></p>
<p class='slide'><img src="img/banner3.jpg" alt=""></p>
<p class='slide'><img src="img/banner4.jpg" alt=""></p>
<p class='slide'><img src="img/banner5.jpg" alt=""></p>
<p class='slide'><img src="img/banner1.jpg" alt=""></p>
</p>
<ul class='tip'>
<li class='bg'></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>
</section>
<script charset='utf-8' src='zepto.min.js'></script>
<script charset='utf-8'>
//rem
~function(){
document.documentelement.style.fontsize = document.documentelement.clientwidth/640*100 + 'px';
}()
//页面中如果自己使用了touch move等原生事件,需要把浏览器的默认行为阻止掉
$(document).on('touchmove touchstart touchend',function(ev){
ev.preventdefault();
})
//banner
var bannerrender = (function(){
var winw = document.documentelement.clientwidth,
maxl = 0,
minl = 0;
var $banner = $('.banner'),
$wrapper = $banner.children('.wrapper'),
$slidelist = $wrapper.children('.slide'),
$imglist = $wrapper.find('img');
var step = 1,
count = 0,
followtimer = null;
//public fn
function isswipe(strx,stry,endx,endy){
return math.abs(endx - strx)>30 || math.abs(endy - stry) > 30)
}
function swipedir(strx,stry,endx,endy){
return math.abs(endx - strx)>=math.abs(endy - stry)?(endx - strx>0?'right':'left'):(endy - stry>0?'down':'up');
}
//touch start
function dragstart(ev){
var point = ev.touches[0];
$wrapper.attr({
strl:parsefloat($wrapper.css('left')),
strx:point.clientx,
stry:point.clienty,
ismove:false,
dir:null,
changex:null
})
}
//touch move
function draging(ev){
var point = ev.touches[0];
var endx = point.clientx,
endy = point.clienty,
strx = parsefloat($wrapper.attr('strx')),
stry = parsefloat($wrapper.attr('stry')),
strl = parsefloat($wrapper.attr('strl')),
changex = endx - strx;
//计算出是否滑动以及滑动的方向:只有是左右滑动才进行处理
var ismove = isswipe(strx,stry,endx,endy),
dir = swipedir(strx,stry,endx,endy);
if(ismove && /(left|right)/i.test(dir)){
$wrapper.attr({
ismove:true,
dir:dir,
changex:changex
});
var curl = strl+changex;
curl = curl>maxl?maxl:(curl<minl?minl:curl);
$wrapper[0].style.webkittransitionduration = '0s';
$wrapper.css('left',curl);
}
}
//touch end
function dragend(){
var ismove = $wrapper.attr('ismove'),
dir = $wrapper.attr('dir'),
changex = parsefloat($wrapper.attr('changex'));
if(ismove && /(left|right)/i.test(dir)){
if(math.abs(changex)>=winw/2){
if(dir==='left'){
step++;
}else{
step--;
}
}
}
$wrapper[0].style.webkittransitionduration = '.2s';
$wrapper.css('left',-step*winw);
lazyimg();
//动画运动过程中,我们监听一个定时器:动画运动完成判断当前是否运动到边界,如果运动到达了边界,我们让其立马回到自己的真实位置
window.cleartimeout(followtimer)
followtimer = window.settimeout(function(){
if(step===0){
$wrapper[0].style.webkittransitionduration = '0s';
$wrapper.css('left',-(count-2)*winw);
step = count-2;
lazyimg();
}
if(step===count-1){
$wrapper[0].style.webkittransitionduration = '0s';
$wrapper.css('left',-winw);
step = 1;
lazyimg();
}
window.cleartimeout(followtimer)
},200)
}
//图片延迟加载,让当前的活动块及相邻的两个活动块进行加载
function lazyimg(){
var $cur = $slidelist.eq(step),
$tar = $cur.add($cur.prev()).add($cur.next());
$tar.each(function(index,item){
var $img = $(item).children('img');
if($img.attr('isload')==='true'){
//attr存储或者获取的属性值都是一个字符串,如果当前的图片已经加载过了,我们就不需要重新的加载了
return;
}
var oimg = new image;
oimg.src = $img.attr('src');
oimg.onload = function(){
$img.attr({
src:this.src,
isload:true
}).css('display','block')
oimg = null;
}
})
}
return{
init:function(){
//init css style
count = $slidelist.length;
minl = -($slidelist.length-1)*winw;
$wrapper.css('width',$slidelist.length*winw);
$slidelist.css('width',winw);
//lazy img
lazyimg();
$banner.on('touchstart',dragstart).on('touchmove',draging).on('touchend',dragend)
}
}
})()
bannerrender.init();
</script>
</body>
</html>
边界判断逻辑可参照下图
以上就是javascript教程之移动端轮播图效果的实现的详细内容。