移动web中的幻灯片切换效果
百度或者谷歌下类似的插件有很多,原理都差不多,关键适合自己的项目,如果移动端要引入jquery这么大的插件,只能呵呵了....
下面是工作中针对webkit内核的浏览器写的,html很简单:
<section id="banner" class="banner z-c" >
<ul class="z-c-w">
<li class="z-c-i"></li>
</ul>
</section>
上面的li标签实际都可以动态生成的,这里只是为了方便阅读才加上。
css:
.banner {
position:relative;
overflow:hidden;
border-bottom:1px solid #FFFDFB;
font-size:;
}
.z-c-w {
display:-webkit-box;
width:100%;
height:100%;
}
.z-c-w.transitionable {
-webkit-transition:-webkit-transform 0.25s ease;
}
.z-c-i {
display:block;
width:100%;
}
.z-c-p {
position: absolute;
margin-top: -13px;
width: 100%;
text-align: center;
}
.z-c-p span {
display:inline-block;
width:6px;
height:6px;
margin:0 4px;
border-radius:50%;
border:1px solid #7cca26;
}
.z-c-p span.active {
background-color:#7cca26;
}
.z-c-i .img-wrapper{
display: inline-block;
width:100%;
height:100%;
background: #fafafa url('../images/cart_icon.png') no-repeat center center;
}
.z-c-i a{display: block;}
.z-c-i .img-wrapper img{width:100%;}
javascript:需要引入zepto,zepto压缩后不到10k,是移动端开发不错的js库。
/*
* carousel
*/
;(function($) {
$.extend($.fn, {
carousel : function(obj) {
this.each(function(){
// 当前Zepto对象
var $self = $(this); var dom = {
wrap : $self.find(".z-c-w"),
items : $self.find(".z-c-i"),
pageControl : null,
pageItems : null
};
var settings = {
width : dom.wrap.width(),
count : dom.items.size(),
index : 0,
startX : 0,
startY : 0,
movingX : false,
movingY : false,
distance : 0,
pageControl : obj ? (obj.showControl ? true : false) : true,
autoScroll : obj ? (obj.autoScroll ? true : false) : false
};
var funs = {
init : function() {
funs.initUI();
funs.bindEvent();
if (settings.autoScroll) {
settings.interval = setInterval(funs.autoScroll, 5000);
}
},
bindEvent : function() {
dom.wrap.off().on({
"touchstart" : function(e) {
e.stopPropagation();
e.preventDefault();
settings.width = dom.wrap.width();
settings.distance = settings.width / 4; settings.startX = e.touches[0].pageX;
settings.startY = e.touches[0].pageY; if (settings.autoScroll){
clearInterval(settings.interval);
//隐藏最后一个循环页
dom.dupItem.css("visibility", "hidden");
}
},
"touchmove" : function(e) {
e.stopPropagation();
e.preventDefault();
var currentX = e.touches[0].pageX;
var currentY = e.touches[0].pageY;
var dX = currentX - settings.startX;
var dY = currentY - settings.startY; if (settings.movingX) {
e.stopPropagation();
e.preventDefault();
var x = 0;
if (settings.index == 0 && dX > 0 || settings.index == settings.count - 1 && dX < 0) {
x = -settings.index * settings.width + dX / 3;
} else {
x = -settings.index * settings.width + dX;
}
dom.wrap.css("-webkit-transform", "translate3d(" + x + "px,0,0)");
} else if (!settings.movingY) {
e.stopPropagation();
var dX = Math.abs(dX);
var dY = Math.abs(dY);
if (dX > 10 && dX/dY > 1) {
settings.movingX = true;
settings.movingY = false;
} else if(dY > 10 && dX/dY < 1) {
settings.movingY = true;
settings.movingX = false;
}
}
},
"touchend" : function(e) {
e.stopPropagation();
e.preventDefault();
settings.movingY = false;
if (settings.movingX) {
settings.movingX = false;
var currentX = e.changedTouches[0].pageX;
var distance = currentX - settings.startX;
if (Math.abs(distance) >= settings.distance) {
settings.index = settings.index - Math.abs(distance) / distance;
settings.index = settings.index < 0 ? 0 : (settings.index > (settings.count - 1) ? (settings.count - 1) : settings.index);
}
funs.continueMove();
}
if (settings.autoScroll) {
settings.interval = setInterval(funs.autoScroll, 5000);
setTimeout(function(){
dom.dupItem.css("visibility", "visible");
},250);
}
},
"webkitTransitionEnd" : function() {
dom.wrap.removeClass("transitionable");
if(settings.index >= settings.count){
settings.index %= settings.count;
dom.wrap.css("-webkit-transform", "translate3d(" + -settings.index * settings.width + "px,0,0)");
}
}
});
dom.pageControl.off().on("touchstart", function(e) {
settings.width = dom.wrap.width();
settings.distance = settings.width / 4; var touchX = e.touches[0].pageX;
var currentX = $(dom.pageItems[settings.index]).offset().left;
if (touchX > currentX && settings.index < (settings.count - 1)) {
settings.index += 1;
funs.continueMove();
} else if (touchX < currentX && settings.index > 0) {
settings.index -= 1;
funs.continueMove();
}
});
$(window).on({
"resize" : function() {
funs.adjustPOS();
},
"orientationchange" : function() {
funs.adjustPOS();
}
});
},
adjustPOS : function() {
settings.width = dom.wrap.width();
settings.distance = settings.width / 5;
dom.wrap.css("-webkit-transform", "translate3d(" + -settings.index * settings.width + "px,0,0)");
},
continueMove : function() {
dom.wrap.addClass("transitionable");
dom.pageItems.removeClass("active");
$(dom.pageItems[settings.index % settings.count]).addClass("active");
dom.wrap.css("-webkit-transform", "translate3d(" + -settings.index * settings.width + "px,0,0)");
},
initUI : function() {
settings.distance = settings.width / 4;
if (settings.pageControl) {
$self.append(funs.createPageDOM());
}
dom.pageControl = $self.find(".z-c-p");
dom.pageItems = $self.find(".z-c-p>span"); if(settings.autoScroll){
//重复第一个页面用作尾部的循环
funs.dupFirstItem();
}
},
dupFirstItem : function() {
dom.dupItem = $self.find(".z-c-i:first-child").clone();
$(dom.wrap).append(dom.dupItem);
},
createPageDOM : function() {
var pageControlToRemove = $self.find(".z-c-p");
if (pageControlToRemove.length) {
pageControlToRemove.remove();
}
var pageFragment = document.createDocumentFragment();
var pageDiv = document.createElement("div");
pageDiv.setAttribute("class", "z-c-p");
pageFragment.appendChild(pageDiv);
var pageItemSpan = document.createElement("span");
pageItemSpan.setAttribute("class", "active");
pageDiv.appendChild(pageItemSpan);
for (var i = 1; i < settings.count; i++) {
pageItemSpan = document.createElement("span");
pageDiv.appendChild(pageItemSpan);
}
return pageFragment;
},
clear : function() {
var pageControlToRemove = $self.find(".z-c-p");
if (pageControlToRemove.length) {
pageControlToRemove.remove();
}
dom.wrap.empty().css("-webkit-transform", "translate3d(0,0,0)");
},
autoScroll : function() {
if(dom.wrap.width() > 0 && dom.items.width() > 0){
settings.index++;
settings.width = dom.wrap.width();
funs.continueMove(settings.index);
}
}
}; funs.init(); $self.clear = funs.clear;
}); return this;
}
});
})(Zepto);
调用方法:
$("#banner").carousel({
showControl: true,
autoScroll: true
});
ps:切记在触屏事件的时候加上e.stopPropagation();和e.preventDefault,不然在android低端浏览器会有卡顿现象
移动web中的幻灯片切换效果的更多相关文章
- 利用css3的多背景图属性实现幻灯片切换效果
css3里关于背景的属性增加了可以添加多背景图的特性,例如: .box{background: url(img/1.png),url(img/2.png),url(img/3.png);} 这段css ...
- 旋转木马幻灯片切换效果JS源码详解
首先,放上慕课网的课程链接,源码是在这个课程里分享出来的,https://www.imooc.com/learn/386. 文章适合学习过这个课程的同学,再看这篇文章,可能有更深入的理解.主要是对各种 ...
- javascript实现的有缩略图功能的幻灯片切换效果
不久前写了一个简单的图片效果,没想到那么快就要用到项目中,所以功能方面要丰富一下: 主要改进: 1# 用圆点代替之前简单的页数显示,并且点击圆点可以显示对应图片: 2# 点击圆点,显示对应图片的缩略图 ...
- Android 自定义 ViewPager 打造千变万化的图片切换效果
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38026503 记得第一次见到ViewPager这个控件,瞬间爱不释手,做东西的主 ...
- Axure RP Pro 7.0苏宁易购式标签切换效果教程
转:http://jingyan.baidu.com/article/7082dc1c4f0a11e40a89bdac.html 页面标签切换效果,几乎是所有大网站(尤其是电商类网站)标配的交互方式: ...
- Android App中使用Gallery制作幻灯片播放效果
http://www.jb51.net/article/83313.htm 我们有时候在iPhone手机上或者Windows上面看到动态的图片,可以通过鼠标或者手指触摸来移动它,产生动态的图片滚动效果 ...
- Android中使用ViewPager实现屏幕页面切换和页面切换效果
之前关于如何实现屏幕页面切换,写过一篇博文<Android中使用ViewFlipper实现屏幕切换>,相比ViewFlipper,ViewPager更适用复杂的视图切换,而且Viewpag ...
- HT for Web中3D流动效果的实现与应用
流动效果在3D领域有着广泛的应用场景,如上图中医学领域可通过3D的流动直观的观察人体血液的流动,燃气领域可用于监控管道内流动的液体或气体的流向.流速和温度等指标. 如今企业数据中心机房普遍面临着设备散 ...
- 自动播放——幻灯片缓冲效果&&带Loading效果的图片切换&&移动效果(按轨迹移动)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
随机推荐
- CentOS7-Minimal1708安装设置python3
使用 python -V 命令查看一下是否安装Python然后使用命令 which python 查看一下Python可执行文件的位置可见执行文件在/usr/bin/ 目录下,切换到该目录下执行 ll ...
- es查询,聚合、平均值、值范围、cardinality去重查询
原文:https://blog.csdn.net/sxf_123456/article/details/78195829 普通查询 GET ana-apk/_search { "query& ...
- 通过Maven简单搭建SSM框架
创建Maven就不用多说了,下面直接看Pom.xml里面的依赖吧 <properties> <!-- spring版本号 --> <spring.version>5 ...
- mybatis的CRUD实例(三)
前面的文章我们已经实现了根据id查询用户信息的功能,下面我们进行其他业务功能的实现. 一.根据用户名模糊查询用户列表 查询使用的sql : select * from user where usern ...
- 2018牛客多校2 - J farm 随机乱搞/二进制分组
题意:给定n*m的格子,每个格子有不同的种类,q次操作,每次操作使[x1,y1]到[x2,y2]的格子除了k类型的以外都删除,最后单次询问所有格子被删了几个 官方题解提到了两种有意思的做法,随机和二进 ...
- 在使用Vue搭建前端服务器时,路由出现#号的解决办法
路由模式解析 这里要讲vue-router的路由模式,首先要了解的一点就是路由是由多个URL组成的,使用不同的URL可以相应的导航到不同的位置.如果有进行过服务器开发或者对http协议有所了解就会知道 ...
- js 面向对象 定时器 046
获取DOM对象补充 document.getElementsByTagName('div'); //获取的多个DOM对象 这种对象叫伪数组 如果想遍历此对象 通过for(var i=0; i < ...
- 第七次 Scrum Meeting
第七次 Scrum Meeting 写在前面 会议时间 会议时长 会议地点 2019/4/11 22:00 10min 大运村1号楼6F 附Github仓库:WEDO 例会照片 工作情况总结(4.11 ...
- java centos7配置查看jdk环境变量
[root@bogon java-1.8.0-openjdk-1.8.0.212.b04-0.el7_6.x86_64]# which java/usr/bin/java[root@bogon jav ...
- 接口自动化测试框架 :APIAutoTest框架
前言 随着测试技术的发展,接口自动化测试逐渐成为各大公司投入产出比最高的测试技术.介入时间早,执行效率高,稳定性高的优点,让越来越多的公司引入接口自动化测试. 框架简介 APIAutoTest是处理A ...