js原生选项卡(包含移动端无缝选项卡)三
今天分享下移动端原生js的无缝轮播图;
移动端尽量减少使用DOM操作来频繁的浪费移动端设备的性能,所以这个无缝轮播图更多的使用了transition和transform,无缝的思想和昨天分享的PC端的无缝轮播的思想是一样的,分别在正常的图片的前面插入了最后一张图片和在正常图片的最后插入了第一张图片,在运动到这两张图片时候瞬间清除transition并把整个图片链拉回到正常图片流的位置,从而从产生了无缝
这个移动端轮播图中还阐述了一个思路:为了更好的考虑用户的体验,当用户滑动屏幕的距离小于一定的值得时候我们图片并不会更换到下一张,这个效果的产生得益于流程控制if判断用户按下手指和抬起手指的坐标差的值
相同的今天的例子中也使用了开关的概念,具体思路昨天的文章中已经阐述
今天的例子以640的分辨率为基准,并在js动态的改变onresize时候值,使我们的代码满足不同手机的尺寸
The best preparation for tomorrow is doing your best today.
过好今天,是对明天最好的准备
html代码:
<div id="tabs">
<ul>
<li style="background:pink;">3</li>
<li style="background:red;">0</li>
<li style="background:green;">1</li>
<li style="background:yellow;">2</li>
<li style="background:pink;">3</li>
<li style="background:red;">0</li>
</ul>
</div>
css代码:
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<meta name="format-detection" content="telephone=no,email=no">
<style>
*{
padding: 0;
margin: 0;
list-style:none;
}
html{
font-size:20px;
}
#tabs ul{
width: 96rem;
height: 100%;
overflow:hidden;
transform:translateX(-16rem);
}
#tabs ul li{
width: 16rem;
height: 7.5rem;
float:left;
font-size:3rem;
color:#fff;
text-align:center;
line-height:7.5rem;
}
js代码:
//以640的分辨率为基准分辨率设置的css模型尺寸,闭包中的代码为实时改变单位尺寸
(function(window,document){
function change(){
var oHTML=document.getElementsByTagName('html')[0];
oHTML.style.fontSize=20*document.documentElement.clientWidth/320+'px';
}
change();
window.addEventListener('resize',change,false);
})(window,document); document.addEventListener('DOMContentLoaded',function(){
var oTab=document.getElementById('tabs');
var oUl=oTab.getElementsByTagName('ul')[0];
var aLi=oUl.children;
var iNow=1;
var x=-aLi[0].offsetWidth*iNow;
//设置开关
var bReady=false; oUl.addEventListener('touchstart',function(ev){
if(bReady){return;}
bReady=true;
oUl.style.transition='none';
//当开始触摸的时候记录按下的坐标
var downX=ev.targetTouches[0].pageX;
var disX=downX-x; function fnMove(ev){
//在move的时候重新计算位移,并给ul赋值
x=ev.targetTouches[0].pageX-disX;
oUl.style.transform='translateX('+x+'px)';
} function fnEnd(ev){
document.removeEventListener('touchmove',fnMove,false);
document.removeEventListener('touchend',fnEnd,false);
//在抬起的时候记录抬起的位置,注意抬起的位置是changedTouches[0]
var upX=ev.changedTouches[0].pageX;
//开启transition
oUl.style.transition='0.4s all ease';
//这里为了用户体验,判断了一个最小移动距离,当移动距离小于这个值得时候并不发生运动
if((Math.abs(upX-downX))>50){
//判断移动方向,是向右还是向左
if(downX>upX){
iNow++;
//设置移动范围
if(iNow==aLi.length) iNow=aLi.length-1;
}else{
//和右面是相反的
iNow--;
if(iNow==-1) iNow=0;
}
}
//进行赋值
x=-aLi[0].offsetWidth*iNow;
oUl.style.transform='translateX('+x+'px)'; //设置ul的变化
function tEnd(){
//为了不让瞬间拉回被发现,首先要清除transition
oUl.style.transition='none';
//进行无缝判断,当图片到右面倒数第二张的时候拉回到第二张
if(iNow==aLi.length-1){
iNow=1;
}else if(iNow==0){
//当图片运动到第一张的时候瞬间拉回到倒数第三张
iNow=aLi.length-2;
}
x=-aLi[0].offsetWidth*iNow;
oUl.style.transform='translateX('+x+'px)';
bReady=false;
}
oUl.addEventListener('transitionend',tEnd,false);
}
document.addEventListener('touchmove',fnMove,false);
document.addEventListener('touchend',fnEnd,false);
ev.preventDefault();
},false);
},false);
</script>
js原生选项卡(包含移动端无缝选项卡)三的更多相关文章
- js原生选项卡(包含无缝滚动轮播图)一
原生js选项卡的几种写法,整片文章我会由简及难的描述几种常用的原生选项卡的写法: Improve little by little every day! 1>基本选项卡: 思路:循环中先清除再添 ...
- tab选项卡切换(js原生、jQuery )
思路: ① 遍历Tab选项 ② 然后给每个Tab选项绑定点击事件 ③ 每次点击时清除所有Tab选项及Tab选项内容的样式,然后给当前Tab选项添加标记样式,给当前Tab选项添加显示样式 <!DO ...
- JS原生ajax
原文链接:http://caibaojian.com/ajax-jsonp.html 一.JS原生ajax ajax:一种请求数据的方式,不需要刷新整个页面: ajax的技术核心是 XMLHttpRe ...
- js原生高逼格插件
如何定义一个高逼格的原生JS插件 作为一个前端er,如果不会写一个小插件,都不好意思说自己是混前端界的.写还不能依赖jquery之类的工具库,否则装得不够高端.那么,如何才能装起来让自己看起来逼格更高 ...
- js原生代码实现轮播图案例
一.轮播图是现在网站网页上最常见的效果之一,对于轮播图的功能,要求不同,效果也不同! 我们见过很多通过不同的方式,实现这一效果,但是有很多比较麻烦,而且不容易理解,兼容性也不好. 在这里分享一下,用j ...
- 基于zepto的插件之移动端无缝向上滚动并上下触摸滑动
该插件乃本博客作者所写,目的在于提升作者的js能力,也给一些js菜鸟在使用插件时提供一些便利,老鸟就悠然地飞过吧. 公司的移动端项目是基于zepto的,有一个页面要求文字能够无缝地不停向上滚动,但查了 ...
- js原生事件系统与坐标系统
今天来实现一个可兼容的js原生拖拽,在这里面我将会讲到: 1.封装兼容性的事件系统. 2.封装得到鼠标当前位置的系统. 3.完成拖拽的实现. 首先,我们要讲到鼠标位置的获取,讲到这个,就离不开js的w ...
- 15、js 原生基础总结
Day1 一.什么是JS? ==基于对象==和==事件驱动==的客户端脚本语言 二.哪一年?哪个公司?谁?第一个名字是什么? 1995,NetScape(网景公司),布兰登(Brendan Eic ...
- js原生实现轮播图效果(面向对象编程)
面向对象编程js原生实现轮播图效果 1.先看效果图 2.需要实现的功能: 自动轮播 点击左右箭头按钮无缝轮播 点击数字按钮切换图片 分析:如何实现无缝轮播? 在一个固定大小的相框里有一个ul标签,其长 ...
随机推荐
- 类型“GridView”的控件“GridView1”必须放在具有 runat=server 的窗体标记内。
错误的写法: if (this.GridView1.Rows.Count > 0) { string style = @"<style& ...
- 2015年第11本:代码整洁之道Clean Code
前一段时间一直在看英文小说,在读到<Before I fall>这本书时,读了40%多实在看不下去了,受不了美国人啰啰嗦嗦的写作风格,还是读IT专业书吧. 从5月9日开始看<代码整洁 ...
- yii url美化 urlManager组件
yii的官方文档对此的解释如下: urlSuffix 此规则使用的url后缀,默认使用CurlManger::urlSuffix,值为null.例如可以将此设置为.html,让url看起来“像”是一 ...
- Objective-C之优雅的命名
There are only two hard things in Computer Science: cache invalidation and naming things.在计算机科学中只有两件 ...
- animation of android (3)
视图动画,只有view可以使用. 在android3.0以后,属性动画. ValueAnimation 可以记录属性变化的过程,所以他的对象是任何object. 所以ValueAnimation 的真 ...
- Method threw 'org.hibernate.exception.SQLGrammarException' exception. Cannot evaluate com.hotel.Object_$$_jvst485_15.toString()
数据库字段和类Object属性不匹配,Method threw 'org.hibernate.exception.SQLGrammarException' exception. Cannot eval ...
- SPC.NET,为5年的开发做个结尾
从08年到如今从事asp.net开发已五年,起初只是一个简单的喜好,想做个东西出来.于是SPC.NET的前生诞生了,直至今日. 不得不说,一个人开发一个软件是很辛苦的事情,以下是SPC.NET的一些特 ...
- 五种开源协议的比较(BSD,Apache,GPL,LGPL,MIT)
当Adobe.Microsoft.Sun等一系列巨头开始表现出对”开源”的青睐时,”开源”的时代即将到来!现今存在的开源协议很多,而经过Open Source Initiative组织通过批准的开源协 ...
- 解决log4j:WARN Error initializing output writer. log4j:WARN Unsupported encoding?的问题
异常名:log4j:WARN Error initializing output writer. log4j:WARN Unsupported encoding? 异常截图: 在一般的javaweb项 ...
- Effective Java 27 Favor generic methods
Static utility methods are particularly good candidates for generification. The type parameter list, ...