澳门新萄京官方网站-www.8455.com-澳门新萄京赌场网址

澳门新萄京官方网站js实现仿手机QQ空间的大图查

2019-07-07 作者:澳门新萄京赌场网址   |   浏览(155)

H5单页面手势滑屏切换原理

2016/03/22 · HTML5 · 2 评论 · 滑屏

原来的文章出处: 一像素   

H5单页面手势滑屏切换是采用HTML5 触摸事件(Touch) 和 CSS3卡通(Transform,Transition)来促成的,效果图如下所示,本文轻易说一下其完结原理和严重性思路。

澳门新萄京官方网站 1

1、达成原理

假如有5个页面,每一个页面占显示器100%宽,则创造叁个DIV容器viewport,将其调幅(width) 设置为500%,然后将5个页面装入容器中,并让那5个页面平分整个容器,最终将容器的私下认可地点设置为0,overflow设置为hidden,那样显示屏就暗许呈现第一个页面。

<div id="viewport" class="viewport"> <div class="pageview" style="background: #3b76c0" > <h3 >页面-1</h3> </div> <div class="pageview" style="background: #58c03b;"> <h3>页面-2</h3> </div> <div class="pageview" style="background: #c03b25;"> <h3>页面-3</h3> </div> <div class="pageview" style="background: #e0a718;"> <h3>页面-4</h3> </div> <div class="pageview" style="background: #c03eac;"> <h3>页面-5</h3> </div> </div>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<div id="viewport" class="viewport">
    <div class="pageview" style="background: #3b76c0" >
        <h3 >页面-1</h3>
    </div>
    <div class="pageview" style="background: #58c03b;">
        <h3>页面-2</h3>
    </div>
    <div class="pageview" style="background: #c03b25;">
        <h3>页面-3</h3>
    </div>
    <div class="pageview" style="background: #e0a718;">
        <h3>页面-4</h3>
    </div>
    <div class="pageview" style="background: #c03eac;">
        <h3>页面-5</h3>
    </div>
</div>

CSS样式:

.viewport{ width: 500%; height: 100%; display: -webkit-box; overflow: hidden; pointer-events: none; -webkit-transform: translate3d(0,0,0); backface-visibility: hidden; position: relative; }

1
2
3
4
5
6
7
8
9
10
.viewport{
   width: 500%;
   height: 100%;
   display: -webkit-box;
   overflow: hidden;
   pointer-events: none;
   -webkit-transform: translate3d(0,0,0);
   backface-visibility: hidden;
   position: relative;
}

挂号touchstart,touchmove和touchend事件,当手指在荧屏上海滑稽剧团动时,使用CSS3的transform来实时设置viewport的岗位,比方要来得第1个页面,就设置viewport的transform:translate3d(百分百,0,0) 就可以, 在此处大家使用translate3d来取代translateX,translate3d能够主动敞开手提式有线电话机GPU加速渲染,页面滑动更通畅。

2、首要思路

从指尖放在荧屏上、滑动操作、再到距离荧屏是三个完好无缺的操作进程,对应的操作会触发如下事件:

手指放在显示器上:ontouchstart

手指在显示器上海滑稽剧团动:ontouchmove

手指离开显示器:ontouchend

大家必要捕获触摸事件的那多少个品级来达成页面包车型地铁滑动:

ontouchstart: 早先化变量, 记录手指所在的地方,记录当今天子

/*手指放在显示器上*/ document.addEventListener("touchstart",function(e){ e.preventDefault(); var touch = e.touches[0]; startX = touch.pageX; startY = touch.pageY; initialPos = currentPosition; //此番滑动前的上马地点 viewport.style.webkitTransition = ""; //撤废动画成效 startT = new Date().getTime(); //记录手指按下的初叶时间 isMove = false; //是或不是发生滑动 }.bind(this),false);

1
2
3
4
5
6
7
8
9
10
11
/*手指放在屏幕上*/
document.addEventListener("touchstart",function(e){
   e.preventDefault();
   var touch = e.touches[0];
   startX = touch.pageX;
   startY = touch.pageY;
   initialPos = currentPosition;   //本次滑动前的初始位置
   viewport.style.webkitTransition = ""; //取消动画效果
   startT = new Date().getTime(); //记录手指按下的开始时间
   isMove = false; //是否产生滑动
}.bind(this),false);

ontouchmove: 得到当前所在地方,计算手指在显示器上的移位差量deltaX,然后使页面跟随移动

/*手指在荧屏上海好笑剧团动,页面跟随手指运动*/ document.addEventListener("touchmove",function(e){ e.preventDefault(); var touch = e.touches[0]; var deltaX = touch.pageX - startX; var deltaY = touch.pageY - startY; //假如X方向上的位移大于Y方向,则认为是反正滑动 if (Math.abs(deltaX) > Math.abs(deltaY)){ moveLength = deltaX; var translate = initialPos deltaX; //当前急需活动到的岗位 //假使translate>0 或 if (translate = maxWidth){ //移动页面 this.transform.call(viewport,translate); isMove = true; } direction = deltaX>0?"right":"left"; //判别手指滑动的大势 } }.bind(this),false);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/*手指在屏幕上滑动,页面跟随手指移动*/
document.addEventListener("touchmove",function(e){
   e.preventDefault();
   var touch = e.touches[0];
   var deltaX = touch.pageX - startX;
   var deltaY = touch.pageY - startY;
   //如果X方向上的位移大于Y方向,则认为是左右滑动
   if (Math.abs(deltaX) > Math.abs(deltaY)){
       moveLength = deltaX;
       var translate = initialPos deltaX; //当前需要移动到的位置
       //如果translate>0 或
       if (translate = maxWidth){
           //移动页面
           this.transform.call(viewport,translate);
           isMove = true;
       }
       direction = deltaX>0?"right":"left"; //判断手指滑动的方向
   }
}.bind(this),false);

ontouchend:手指离开显示器时,总括荧屏最后停留在哪一页。首先计算手指在屏幕上的停留时间deltaT,假诺deltaT

(1)假设是飞速度滑冰动,则让眼下页面完整的滞留在显示屏中央(必要计算当前页面还也可能有稍稍要求滑动)

(2)如若是慢速度滑冰动,还必要看清手指在荧屏上海滑稽剧团动的相距,假诺滑动的距离未有当先显示屏宽度四分之二,则要回落到上一页,相反则要停留在现阶段页面

/*手指离开显示屏时,总计最终供给逗留在哪一页*/ document.add伊夫ntListener("touchend",function(e){ e.preventDefault(); var translate = 0; //统计手指在显示屏上停留的岁月 var deltaT = new Date().get提姆e() - startT; if (isMove){ //发生了左右滑动 //使用动画片过渡让页面滑动到终极的职责 viewport.style.webkitTransition = "0.3s ease -webkit-transform"; if(deltaT //假诺停留时间小于300ms,则感到是神速度滑冰动,无论滑动距离是不怎么,都停留到下一页 translate = direction == 'left'? currentPosition-(pageWidth moveLength):currentPosition pageWidth-moveLength; //假设最后地点抢先界限地点,则停留在边际位置 translate = translate > 0 ? 0 : translate; //左边界 translate = translate //侧面界 }else { //若是滑动距离小于显示屏的一半,则退回到上一页 if (Math.abs(moveLength)/pageWidth moveLength; }else{ //要是滑动距离当先荧屏的八分之四,则滑动到下一页 translate = direction == 'left'? currentPosition-(pageWidth moveLength):currentPosition pageWidth-moveLength; translate = translate > 0 ? 0 : translate; translate = translate maxWidth : translate; } } //试行滑动,让页面完整的体现到显示器上 this.transform.call(viewport,translate); } }.bind(this),false);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/*手指离开屏幕时,计算最终需要停留在哪一页*/
document.addEventListener("touchend",function(e){
   e.preventDefault();
   var translate = 0;
   //计算手指在屏幕上停留的时间
   var deltaT = new Date().getTime() - startT;
   if (isMove){ //发生了左右滑动
        //使用动画过渡让页面滑动到最终的位置
        viewport.style.webkitTransition = "0.3s ease -webkit-transform";
        if(deltaT //如果停留时间小于300ms,则认为是快速滑动,无论滑动距离是多少,都停留到下一页
            translate = direction == 'left'?
            currentPosition-(pageWidth moveLength):currentPosition pageWidth-moveLength;
            //如果最终位置超过边界位置,则停留在边界位置
            translate = translate > 0 ? 0 : translate; //左边界
            translate = translate //右边界
        }else {
            //如果滑动距离小于屏幕的50%,则退回到上一页
            if (Math.abs(moveLength)/pageWidth moveLength;
            }else{
                //如果滑动距离大于屏幕的50%,则滑动到下一页
                translate = direction == 'left'?
                currentPosition-(pageWidth moveLength):currentPosition pageWidth-moveLength;
                translate = translate > 0 ? 0 : translate;
                translate = translate  maxWidth : translate;
            }
        }
        //执行滑动,让页面完整的显示到屏幕上
        this.transform.call(viewport,translate);
    }
}.bind(this),false);

而外,还要总计当前页面是第几页,并设置当前页码

//总计当前的页码 pageNow = Math.round(Math.abs(translate) / pageWidth) 1; setTimeout(function(){ //设置页码,DOM操作须要安放子线程中,不然会出现卡顿 this.setPageNow(); }.bind(this),100);

1
2
3
4
5
6
7
//计算当前的页码
pageNow = Math.round(Math.abs(translate) / pageWidth) 1;
 
setTimeout(function(){
    //设置页码,DOM操作需要放到子线程中,否则会出现卡顿
    this.setPageNow();
}.bind(this),100);

着力的笔触就这几个,当然在实操进程中还会有一点点细节要求注意,这里就不详细说了,都在代码里能展示出来,源代码已传至Git:https://github.com/git-onepixel/guesture, 风乐趣的同学招待一齐谈谈,(由于岁月原因,本示例未有参与history路由),你也能够点击或扫描上面二维码来查看示例效果:

澳门新萄京官方网站 2

 

3 赞 24 收藏 2 评论

澳门新萄京官方网站 3

HTML5单页面手势滑屏切换原理,html5页面手势原理

H5单页面手势滑屏切换是行使HTML5 触摸事件(Touch) 和 CSS3动画(Transform,Transition)来促成的,效果图如下所示,本文轻巧说一下其完成原理和要害思路。
1、完成原理 万一有5个页面,每一种页面占荧屏百分之百宽,则成立三个DIV容器viewport,将其调幅(width) 设置为500%,然后将5个页面装入容器中,并让那5个页面平分整个容器,最终将容器的私下认可地方设置为0,overflow设置为hidden,那样显示屏就私下认可显示第一个页面。

XML/HTML Code复制内容到剪贴板

  1. <div id="viewport" class="viewport">    
  2. <div class="pageview" style="background: #3b76c0" >    
  3. <h3 >页面-1</h3>    
  4. </div>    
  5. <div class="pageview" style="background: #58c03b;">    
  6. <h3>页面-2</h3>    
  7. </div>    
  8. <div class="pageview" style="background: #c03b25;">    
  9. <h3>页面-3</h3>    
  10. </div>    
  11. <div class="pageview" style="background: #e0a718;">    
  12. <h3>页面-4</h3>    
  13. </div>    
  14. <div class="pageview" style="background: #c03eac;">    
  15. <h3>页面-5</h3>    
  16. </div>    
  17. </div>   

CSS样式:

XML/HTML Code复制内容到剪贴板

  1. .viewport{    
  2. width: 500%;    
  3. height: 100%;    
  4. display: -webkit-box;    
  5. overflow: hidden;    
  6. pointer-events: none;    
  7. -webkit-transform: translate3d(0,0,0);    
  8. backface-visibility: hidden;    
  9. position: relative;    
  10. }  

登记touchstart,touchmove和touchend事件,当手指在显示屏上海好笑剧团动时,使用CSS3的transform来实时设置viewport的岗位,比如要显得第1个页面,就设置viewport的transform:translate3d(百分之百,0,0) 就能够, 在此间大家运用translate3d来代替translateX,translate3d能够主动敞开手提式有线话机GPU加快渲染,页面滑动更通畅。
2、首要思路
从手指放在显示屏上、滑动操作、再到离开显示屏是一个完完全全的操作进程,对应的操作会触发如下事件:
手指放在荧屏上:ontouchstart
手指在显示器上海滑稽剧团动:ontouchmove
手指离开荧屏:ontouchend
我们必要捕获触摸事件的那多少个级次来成功页面的滑行:
ontouchstart: 初叶化变量, 记录手指所在的职位,记录当前岁月

XML/HTML Code复制内容到剪贴板

  1. /*手指放在显示器上*/    
  2. document.addEventListener("touchstart",function(e){    
  3. e.preventDefault();    
  4. var touch = e.touches[0];    
  5. startX = touch.pageX;    
  6. startY = touch.pageY;    
  7. initialPos = currentPosition; //这一次滑动前的始发地点    
  8. viewport.style.webkitTransition = ""; //撤除动画功用    
  9. startT = new Date().getTime(); //记录手指按下的开首时间    
  10. isMove = false; //是或不是发生滑动    
  11. }.bind(this),false);   

ontouchmove: 得到当前所在地方,计算手指在荧屏上的活动差量deltaX,然后使页面跟随移动

XML/HTML Code复制内容到剪贴板

  1. /*手指在荧屏上海好笑剧团动,页面跟随手指运动*/    
  2. document.addEventListener("touchmove",function(e){    
  3. e.preventDefault();    
  4. var touch = e.touches[0];    
  5. var deltaX = touch.pageX - startX;    
  6. var deltaY = touch.pageY - startY;    
  7. //要是X方向上的位移大于Y方向,则以为是左右滑行    
  8. if (Math.abs(deltaX) > Math.abs(deltaY)){    
  9. moveLength = deltaX;    
  10. var translate = initialPos   deltaX; //当前内需活动到的职位    
  11. //假使translate>0 或 < maxWidth,则代表页面凌驾边界    
  12. if (translate <=0 && translate >= maxWidth){    
  13. //移动页面    
  14. this.transform.call(viewport,translate);    
  15. isMove = true;    
  16. }    
  17. direction = deltaX>0?"right":"left"; //剖断手指滑动的动向    
  18. }    
  19. }.bind(this),false);   

ontouchend:手指离开显示屏时,计算显示屏最后停留在哪一页。首先总结手指在荧屏上的停留时间deltaT,要是deltaT<300ms,则感到是快速度滑冰动,相反则是慢速度滑冰动,连忙度滑冰动和慢速度滑冰动的管理是不一样的:
(1)假若是便捷滑动,则让眼下页面完整的驻留在显示器大旨(需求总结当前页面还应该有稍稍供给滑动)
(2)假使是慢速度滑冰动,还亟需看清手指在荧屏上海滑稽剧团动的离开,假若滑动的离开未有超过显示器宽度50%,则要回落到上一页,相反则要停留在近来页面

XML/HTML Code复制内容到剪贴板

  1. /*手指离开显示器时,总括最后须求逗留在哪一页*/    
  2. document.addEventListener("touchend",function(e){    
  3. e.preventDefault();    
  4. var translate = 0;    
  5. //总括手指在荧屏上驻留的命宫    
  6. var deltaT = new Date().getTime() - startT;    
  7. if (isMove){ //发生了左右滑动    
  8. //使用动画片过渡让页面滑动到终极的职责    
  9. viewport.style.webkitTransition = "0.3s ease -webkit-transform";    
  10. if(deltaT < 300){ //要是停留时间小于300ms,则感到是全速度滑冰动,无论滑动距离是多少,都停留到下一页    
  11. translate = direction == 'left'?    
  12. currentPosition-(pageWidth moveLength):currentPosition pageWidth-moveLength;    
  13. //假设最后地方超过界限地点,则停留在分界地方    
  14. translatetranslate = translate > 0 ? 0 : translate; //左边界    
  15. translatetranslate = translate < maxWidth ? maxWidth : translate; //右边界    
  16. }else {    
  17. //假设滑动距离小于显示屏的百分之五十,则退回到上一页    
  18. if (Math.abs(moveLength)/pageWidth < 0.5){    
  19. translate = currentPosition-moveLength;    
  20. }else{    
  21. //要是滑动距离超过显示屏的二分之一,则滑动到下一页    
  22. translate = direction == 'left'?    
  23. currentPosition-(pageWidth moveLength):currentPosition pageWidth-moveLength;    
  24. translatetranslate = translate > 0 ? 0 : translate;    
  25. translatetranslate = translate < maxWidth ? maxWidth : translate;    
  26. }    
  27. }    
  28. //试行滑动,让页面完整的彰显到显示器上    
  29. this.transform.call(viewport,translate);    
  30. }    
  31. }.bind(this),false);   

除了,还要总结当前页面是第几页,并设置当前页码

XML/HTML Code复制内容到剪贴板

  1. //计算当前的页码    
  2. pageNow = Math.round(Math.abs(translate) / pageWidth)   1;    
  3. setTimeout(function(){    
  4. //设置页码,DOM操作须求停放子线程中,不然会冒出卡顿    
  5. this.setPageNow();    
  6. }.bind(this),100);   

着力的思路就这个,当然在实操进度中还或许有一点点细节须要细心,这里就不详细说了,都在代码里能显示出来。关于HTML5单页面手势滑屏切换原理 我就给我们介绍这么多,希望对大家有着帮助!

H5单页面手势滑屏切换是利用HTML5 触摸事件(Touch) 和 CSS3卡通(Transform,Transition)来促成的,效...

澳门新萄京官方网站 4// 进度条
澳门新萄京官方网站 5//<input type="button" value="start" onclick="processBar.changeMode();if(processBar.isMoving){this.value='Stop';}else{this.value='Start';}">
澳门新萄京官方网站 6//---------------------------
澳门新萄京官方网站 7//<script language="javascript" src="ProcessBar.js"></script>
澳门新萄京官方网站 8//<input type="button" value="start" onclick="(new ProcessBar()).changeMode();">
澳门新萄京官方网站 9//可完毕情势:doProcessBarAction()
澳门新萄京官方网站 10//---------------------------
澳门新萄京官方网站 11
澳门新萄京官方网站 12
澳门新萄京官方网站 13澳门新萄京官方网站 14function ProcessBar()澳门新萄京官方网站 15{
澳门新萄京官方网站 16    var divG =document.createElement("<div style="background: url('../image/0.gif') no-repeat;margin:0 auto;text-align:center;width:256px;height:18px;position:absolute;top:45%;left:40%;font-size:13px;z-index:1000;"></div>");
澳门新萄京官方网站 17    var proc =document.createElement("<div id='proc' style="background: url('../image/1.gif');position:absolute;top:0;left:0;width:0px;height:18px;font-size:13px;z-index:1000;"></div>");
澳门新萄京官方网站 18    var div2 =document.createElement("<div style='position:absolute;top:2;left:0;width:256px;height:18px;text-align:center;font-size:13px;background:transparent'> </div>");
澳门新萄京官方网站 19    divG.appendChild(proc);
澳门新萄京官方网站 20    //divG.appendChile(div2);
澳门新萄京官方网站 21    document.body.appendChild(divG);
澳门新萄京官方网站 22    document.execCommand("BackgroundImageCache",false,true);
澳门新萄京官方网站 23    
澳门新萄京官方网站 24    var obj = proc;
澳门新萄京官方网站 25    this.isMoving = false;
澳门新萄京官方网站 26    this.maxLength = parseInt(obj.parentNode.style.width.replace("px",""));
澳门新萄京官方网站 27    this.nowLength = parseInt(obj.style.width.replace("px",""));
澳门新萄京官方网站 28    this.moveInterval = 100;
澳门新萄京官方网站 29    this.moveRange = 1;
澳门新萄京官方网站 30    this.timer;
澳门新萄京官方网站 31    this.obj = obj;
澳门新萄京官方网站 32
澳门新萄京官方网站 33    ProcessBar.nowObj = this;  
澳门新萄京官方网站 34
澳门新萄京官方网站 35澳门新萄京官方网站 36   this.changeMode = function()澳门新萄京官方网站 37{
澳门新萄京官方网站 38                this.isMoving = !this.isMoving;
澳门新萄京官方网站 39                
澳门新萄京官方网站 40澳门新萄京官方网站 41                if(this.isMoving)澳门新萄京官方网站 42{
澳门新萄京官方网站 43                        createBgDiv(); //创立页面蒙版
澳门新萄京官方网站 44                        this.timer = window.setInterval(ProcessBar.nowObj.moving, this.moveInterval);
澳门新萄京官方网站 45澳门新萄京官方网站 46                }else澳门新萄京官方网站 47{
澳门新萄京官方网站 48                        window.clearInterval(this.timer);
澳门新萄京官方网站 49                }
澳门新萄京官方网站 50   }
澳门新萄京官方网站 51
澳门新萄京官方网站 52澳门新萄京官方网站 53   this.moving = function()澳门新萄京官方网站 54{
澳门新萄京官方网站 55        ProcessBar.nowObj.nowLength  = ProcessBar.nowObj.moveRange;
澳门新萄京官方网站 56                ProcessBar.nowObj.obj.style.width = ProcessBar.nowObj.nowLength;
澳门新萄京官方网站 57
澳门新萄京官方网站 58                //ProcessBar.nowObj.obj.parentNode.lastChild.firstChild.data = Math.ceil((ProcessBar.nowObj.nowLength/ProcessBar.nowObj.maxLength)*100)   "%";
澳门新萄京官方网站 59
澳门新萄京官方网站 60澳门新萄京官方网站 61                if(ProcessBar.nowObj.nowLength >= ProcessBar.nowObj.maxLength)澳门新萄京官方网站 62{
澳门新萄京官方网站 63                        window.clearInterval(ProcessBar.nowObj.timer);
澳门新萄京官方网站 64                        //ProcessBar.nowObj.obj.parentNode.lastChild.firstChild.data = "Complete!";
澳门新萄京官方网站 65                        //推行事件
澳门新萄京官方网站 66澳门新萄京官方网站 67                        try澳门新萄京官方网站 68{
澳门新萄京官方网站 69                           doProcessBarAction();
澳门新萄京官方网站 70                        }
澳门新萄京官方网站 71                        catch(e)
澳门新萄京官方网站 72澳门新萄京官方网站 73                        澳门新萄京官方网站 74{}
澳门新萄京官方网站 75                        delBgDiv(); //清除页面蒙版
澳门新萄京官方网站 76                }
澳门新萄京官方网站 77   }
澳门新萄京官方网站 78   
澳门新萄京官方网站 79}
澳门新萄京官方网站 80
澳门新萄京官方网站 81//var processBar = new ProcessBar(proc);
澳门新萄京官方网站 82
澳门新萄京官方网站 83//页面蒙版
澳门新萄京官方网站 84function createBgDiv()
澳门新萄京官方网站 85澳门新萄京官方网站 86澳门新萄京官方网站 87{
澳门新萄京官方网站 88    var h=document.body.clientHeight;
澳门新萄京官方网站 89    var w=document.body.clientWidth;
澳门新萄京官方网站 90    var div=document.createElement("<div id='divDialogBg' style='position:absolute;visibility:visible;background:gray;filter:alpha(opacity=30);z-index:1000;left:0;top:0;width:" w "px;height:" h "px;'></div>");
澳门新萄京官方网站 91    //div.appendChild(document.createTextNode("xxxxxxxxxxxxxxxxxxxx"));
澳门新萄京官方网站 92    document.body.appendChild(div);        
澳门新萄京官方网站 93}
澳门新萄京官方网站 94function delBgDiv()
澳门新萄京官方网站 95澳门新萄京官方网站 96澳门新萄京官方网站 97{
澳门新萄京官方网站 98    document.body.removeChild(document.getElementById("divDialogBg"));        
澳门新萄京官方网站 99}    

1.设施事件

调用格局 :ImageView(index,imgData)  --index参数 为图片暗中认可呈现的索引值,类型 为Number  --imaData参数 为图片url数组 ,类型为Array

澳门新萄京官方网站 100澳门新萄京官方网站 101

配备事件能够让开垦人士明显用户在什么样使用设备

使用此前要先引进 zepto.js 文件

挪动Safari增添了orientationchange事件,以便开辟职员能够规定用户何时将配备横向查看方式转化为纵向查看格局。

ImageView.js具体代码如下:

属性有五个值:0--代表肖像格局  90--左转向情势  -90--右转向方式

复制代码 代码如下:

设若用户改变了配备的查看方式,就能够触发orientationchange事件

/*
 * ImageView v1.0.0
 * --基于zepto.js的大图查看
 * --调用艺术 ImageView(index,imgDada)
 * --index 图片暗中同意值突显索引,Number  --imgData 图片url数组,Array
 * */
var ImageView=(function(window,$){
    var _this=$("#slideView"),_ImgData=[],_index=0,_length=0,
        _start=[],_org=[],_orgTime=null,
        _lastTapDate=null,
        _zoom=1,_zoomXY=[0,0],_transX=null,
        _advancedSupport = false,
        _doubleDistOrg=1,_doubleZoomOrg=1,isDoubleZoom = false,
        isSlide=true,isDrag=false,timer=null,
        winW=window.innerWidth,winH=window.innerHeight;
    /**
     * 事件对象 event
     */
    var Event={
        touchstart:function(e){
            e.preventDefault();
            if (_advancedSupport && e.touches && e.touches.length >= 2) {
                var img = getImg();
                $(img).css({"-webkit-transitionDuration": "0ms","transitionDuration": "0ms"});
                _doubleZoomOrg = _zoom;
                _doubleDistOrg = getDist(e.touches[0].pageX, e.touches[0].pageY, e.touches[1].pageX, e.touches[1].pageY);
                isDoubleZoom = true;
                return
            }
            e = e.touches ? e.touches[0] : e;
            isDoubleZoom = false;
            _start = [e.pageX, e.pageY];
            _org = [e.pageX, e.pageY];
            _orgTime = Date.now();
            _transX = -_index * winW;
            if(_zoom!=1){
                _zoomXY = _zoomXY || [0, 0];
                _orgZoomXY = [_zoomXY[0], _zoomXY[1]];
                var img = getImg();
                img&&($(img).css({"-webkit-transitionDuration": "0ms","transitionDuration": "0ms"}));
                isDrag = true
            }else{
                _this.find(".pv-inner").css({"-webkit-transitionDuration":"0ms","transitionDuration":"0ms"});
                isSlide = true
            }
        },
        touchmove:function(e){
            e.preventDefault();
            if (_advancedSupport && e.touches && e.touches.length >= 2) {
                var newDist = getDist(e.touches[0].pageX, e.touches[0].pageY, e.touches[1].pageX, e.touches[1].pageY);
                _zoom = (newDist/_doubleDistOrg) * _doubleZoomOrg
                var img = getImg();
                $(img).css({"-webkit-transitionDuration": "0ms","transitionDuration": "0ms"});
                if (_zoom < 1) {
                    _zoom = 1;
                    _zoomXY = [0, 0];
                    $(img).css({"-webkit-transitionDuration": "200ms","transitionDuration": "200ms"})
                } else if (_zoom >getScale(img) * 2){
                     _zoom = getScale(img) * 2;
                }
                $(img).css({"-webkit-transform": "scale(" _zoom ") translate(" _zoomXY[0] "px," _zoomXY[1] "px)","transform": "scale(" _zoom ") translate(" _zoomXY[0] "px," _zoomXY[1] "px)"});
                return
            }
            if (isDoubleZoom){
                return;
            }
            e = e.touches ? e.touches[0] : e;
            if (_zoom != 1) {
                var deltaX = (e.pageX - _start[0]) / _zoom;
                var deltaY = (e.pageY - _start[1]) / _zoom;
                _start = [e.pageX, e.pageY];
                var img = getImg();
                var newWidth = img.clientWidth *_zoom,
                    newHeight = img.clientHeight * _zoom;
                var borderX = (newWidth - winW) / 2 / _zoom,
                    borderY = (newHeight - winH) / 2 / _zoom;
                (borderX >= 0)&&(_zoomXY[0] < -borderX || _zoomXY[0] > borderX)&&(deltaX /= 3);
                (borderY > 0)&&(_zoomXY[1] < -borderY || _zoomXY[1] > borderY)&&(deltaY /= 3);
                _zoomXY[0] = deltaX;
                _zoomXY[1] = deltaY;
                (_length == 1 && newWidth < winW||newWidth < winW)&&(_zoomXY[0] = 0);
                (_length == 1 && newHeight < winH||newHeight < winH)&&(_zoomXY[1] = 0);
                $(img).css({"-webkit-transform": "scale(" _zoom ") translate(" _zoomXY[0]
                    "px," _zoomXY[1] "px)","transform": "scale("

eventUtil.addHandle(Window,orirntationchange,function(){

  • _zoom ") translate(" _zoomXY[0]
                        "px," _zoomXY[1] "px)"})
                }else{
                    if (!isSlide) return;
                    var deltaX = e.pageX - _start[0];
                    (_transX > 0 || _transX < -winW * (_length - 1))&&(deltaX /= 4);
                    _transX = -_index * winW deltaX;
                    _this.find(".pv-inner").css({"-webkit-transform":"translate(" _transX "px,0px) translateZ(0)"});
                }
            },
            touchend:function(e){
                if (isDoubleZoom) {
                    return;
                }
                if (_zoom != 1) {
                    if (!isDrag){return;}
                    var img = getImg();
                    var newWidth = img.clientWidth *_zoom,
                        newHeight = img.clientHeight * _zoom;
                    var borderX = (newWidth - winW) / 2 / _zoom,
                        borderY = (newHeight - winH) / 2 / _zoom;
                    if (_length > 1 && borderX >= 0) {
                        var updateDelta = 0;
                        var switchDelta = winW / 6;
                        if (_zoomXY[0] < -borderX - switchDelta / _zoom && _index < _length - 1){
                            updateDelta = 1;
                        }else if (_zoomXY[0] > borderX switchDelta / _zoom && _index > 0){
                            updateDelta = -1;
                        }
                        if (updateDelta != 0) {
                            scaleDown(img);
                            changeIndex(_index updateDelta);
                            return
                        }
    澳门新萄京官方网站js实现仿手机QQ空间的大图查看组件ImageView,H5单页面手势滑屏切换原理。                }
                    var delta = Date.now() - _orgTime;
                    if (delta < 300) {
                        (delta <= 10)&&(delta = 10);
                        var deltaDis = Math.pow(180 / delta, 2);
                        _澳门新萄京官方网站,澳门新萄京官方网站js实现仿手机QQ空间的大图查看组件ImageView,H5单页面手势滑屏切换原理。zoomXY[0] = (_zoomXY[0] - _orgZoomXY[0]) * deltaDis;
                        _zoomXY[1] = (_zoomXY[1] - _orgZoomXY[1]) * deltaDis;
                        $(img).css({"-webkit-transition": "400ms cubic-bezier(0.08,0.65,0.79,1)","transition": "400ms cubic-bezier(0.08,0.65,0.79,1)"})
                    } else{
                        $(img).css({"-webkit-transition": "200ms linear","transition": "200ms linear"});
                    }
                    if (borderX >= 0){
                        if (_zoomXY[0] < -borderX){
                            _zoomXY[0] = -borderX;
                        }else if (_zoomXY[0] > borderX){
                            _zoomXY[0] = borderX;
                        }
                    }
                    if (borderY > 0){
                        if (_zoomXY[1] < -borderY){
                            _zoomXY[1] = -borderY;
                        }else if (_zoomXY[1] >borderY){
                            _zoomXY[1] = borderY;
                        }
                    }
                    if (Math.abs(_zoomXY[0]) < 10) {
                        $(img).css({"-webkit-transform": "scale(" _zoom ") translate(0px," _zoomXY[1] "px)","transform": "scale(" _zoom ") translate(0px," _zoomXY[1] "px)"});
                        return
                    } else{
                        $(img).css({"-webkit-transform": "scale(" _zoom ") translate(" _zoomXY[0] "px," _zoomXY[1] "px)","transform": "scale(" _zoom ") translate(" _zoomXY[0] "px," _zoomXY[1] "px)"});
                    }
                    isDrag = false
                }else{
                    if (!isSlide){ return;}
                    var deltaX = _transX - -_index * winW;
                    var updateDelta = 0;
                    if (deltaX > 50){
                        updateDelta = -1;
                    }else if(deltaX < -50){
                        updateDelta = 1;
                    }
                    _index=_index updateDelta;
                    changeIndex(_index);
                    isSlide =false
                }
            },
            click:function(e){
                _zoom=1;
                _zoomXY=[0,0];
                _this.css("opacity","0");
                timer=setTimeout(function(){
                    _this.css({"display":""}).html("");
                    unbind();
                },150)
            },
            dobelTap:function(e){
                clearTimeout(timer);
                var now = new Date;
                if (now - _lastTapDate < 500){
                    return;
                }
                _lastTapDate = now;
                var img = getImg();
                if (!img){
                    return;
                }
                if (_zoom != 1){
                    scaleDown(img);
                }else{
                    scaleUp(img);
                }
            },
            setView:function(e){
                winW=window.innerWidth;
                winH=window.innerHeight;
                _this.width(window.innerWidth).height(window.innerHeight);
                translate((-_index*window.innerWidth),0,0,$(".pv-inner")[0]);
                scaleDown(getImg())
            }
        };
        var handleEvent=function(e){
            switch (e.type){
                case "touchstart":
                    Event.touchstart(e);
                    break;
                case "touchmove":
                    Event.touchmove(e);
                    break;
                case "touchcancel":
                case "touchend":
                    Event.touchend(e);
                    break;
                case "orientationchange":
                case "resize":
                    Event.setView(e);
                    break
            }
        };
        /**
         * 绑定事件
         */
        var bind=function(){
            _this.on("singleTap",function(e){
                e.preventDefault();
                var now = new Date;
                if (now - _lastTapDate < 500){
                    return;           
                }
                _lastTapDate = now;
                Event.click(e);
                return false;
            }).on("doubleTap", function(e) {
                e.preventDefault();
                Event.dobelTap(e);
                return false;
            });
            _this.on("touchstart touchmove touchend touchcancel", function(e) {
                handleEvent(e);
            });
            Event.setView();
            "onorientationchange" in window ? window.addEventListener("orientationchange",Event.setView,false) : window.addEventListener("resize",Event.setView,false);
        };
        /**
         * 解除事件
         */
        var unbind= function() {
             _this.off();
            "onorientationchange" in window ? window.removeEventListener("orientationchange",Event.setView, false) : window.removeEventListener("resize",Event.setView, false)
        };
        var getDist= function(x1, y1, x2, y2) {
            return Math.sqrt(Math.pow(x2 - x1, 2) Math.pow(y2 - y1, 2), 2)
        }
        /**
         * 图片缩放
         */
        var getScale=function(img) {
            var h = img.naturalHeight, w = img.naturalWidth,
            Scale=w*h/(img.clientHeight*img.clientWidth);
            return Scale;
        };
        var scaleUp=function(img) {
            var scale = getScale(img);
            if (scale > 1)
                $(img).css({"-webkit-transform": "scale(" scale ")","transform": "scale(" scale ")","-webkit-transition": "200ms","transition": "200ms"});
            _zoom = scale;
        };
        var scaleDown=function(img) {
            _zoom = 1;
            _zoomXY = [0, 0];
            _doubleDistOrg = 1;
            _doubleZoomOrg = 1;
            $(img).css({"-webkit-transform": "scale(1)","transform": "scale(1)","-webkit-transition": "200ms","transition": "200ms"});
        };
        /**
         * 滑动作效果果
         * dist
         */
        var translate = function( distX,distY,speed,ele) {
            if( !!ele ){ ele=ele.style; }else{ return; }
            ele.webkitTransitionDuration =  ele.MozTransitionDuration = ele.msTransitionDuration = ele.OTransitionDuration = ele.transitionDuration =  speed 'ms';
            ele.webkitTransform = 'translate(' distX 'px,' distY 'px)' 'translateZ(0)';
            ele.msTransform = ele.MozTransform = ele.OTransform = 'translateX(' distX 'px) translateY(' distY 'px)';
        };
        /**
         * 改换索引值 _index
         */
        var changeIndex=function(index,force){
            if (index < 0){
                index = 0;
            }else if(index >= _length){
                index =_length - 1;
            }
            _index = index;
            translate((-_index*window.innerWidth),0,force? "0" : "200" ,$(".pv-inner")[0]);
            $("#J_index").html(_index 1 "/" _length);
            imgLoad();
        }
        /**
         * 图片获取
         */
        var getImg=function(index) {
            var img = _this.find("li").eq(index || _index).find("img");
            if (img.size() == 1){
                return img[0];
            }else{
                return null
            }
        }
        /**
         * 图片加载
         */
        var imgLoad=function(){
            if($(".pv-img").eq(_index).find("img")[0]){
                $("#J_loading").css("display","");
                return;
            }else{
                $("#J_loading").css("display","block");
                var tempImg=new Image(),w,h,set;
                tempImg.src=_ImgData[_index];
                $(".pv-img").eq(_index)[0].appendChild(tempImg);
                tempImg.onload=function(){
                    $("#J_loading").css("display","");
                }
            }
        };
        /**
         * 创建大图查看Dome结构
         */
        var Create=function(){
            _this.append("<ul class='pv-inner'></ul>").append("<p class='counts'><span class='value' id='J_index'>" (_index 1) "/" _length "</span></p>").append("<span class='ui-loading' id='J_loading' ><i class='t1'></i><i class='t2'></i><i class='t3'></i></span>")
            for(var i=0;i<_length;i ){
                $(".pv-inner").append("<li class='pv-img'></li>")
            }
            imgLoad();
        };
        /**
         * 大图查看发轫化
         */
        var init=function(){
            !!_this[0]||$("body").append("<div class='slide-view' id='slideView'></div>");
            _this=$("#slideView");
            ($.os.iphone || $.os.android && parseFloat($.os.version) >= 4)&&(_advancedSupport = true);
        }();
        /**
         * 大图查看重返接口函数
         * ImageView(index,data)
         * index 开端索引值 nubmer
         * data 图片数组 array
         */
        var ImageView=function(index,data){
            _ImgData=data;
            _index=index;
            _length=data.length;
            //创建dom结构
            Create();
            //dom结构突显
            _this.css("display","block");
            //绑定事件
            bind();
        }
        return ImageView;
    })(window,Zepto);

div.innerHTML='Currentorientation is " window.orientation;

  

});

ImageView.js用到的css代码如下:

2.px像素知识

复制代码 代码如下:

iphone5分辨率640*1136

/*大图查看*/
.slide-view {background: #000;position: fixed;width: 100%;height: 100%;overflow: hidden;top: 0;left: 0;z-index: 100;opacity:0;display: none;-webkit-animation:fadeIn .2s linear forwards;animation:fadeIn .2s linear forwards;-webkit-touch-callout: none;-webkit-transform-style: preserve-3d; }
.slide-view .counts {position: absolute;top: 5%;left: 0;right: 0;text-align: center;font-size: 0;-webkit-transform-style: preserve-3d; }
.slide-view .counts .value {border-radius: 9px;line-height: 18px;padding: 0 6px;font-size: 11px;display: inline-block;background-color: rgba(102,102,102,.6);color: #f1f1f1;}
.pv-inner {position: relative;z-index: -1;display: -webkit-box;display: box;width: 100%;height: 100%;-webkit-transition: all 350ms linear;-webkit-backface-visibility: hidden;transition: all 350ms linear;backface-visibility: hidden;-webkit-touch-callout: none;-webkit-transform-style: preserve-3d; }
.pv-inner li {text-align: center;display: -webkit-box;display: box;-webkit-box-align: center;overflow: hidden;width: 100%;height: 100%;-webkit-touch-callout: none;backface-visibility: hidden;-webkit-transform-style: preserve-3d; }
.pv-inner img {max-width: 97%;max-height: 100%;-webkit-transform: scale(1) translate(0px,0px);transform: scale(1) translate(0px,0px);visibility: visible;-webkit-transition: 200ms;transition: 200ms;-webkit-user-select: none;user-select: none;display: block;margin: 0 auto;backface-visibility: hidden;-webkit-transform-style: preserve-3d; }
@-webkit-keyframes fadeIn{
    0%{opacity:0;}
    100%{opacity:1;}
}
@keyframes fadeIn{
    0%{opacity:0;}
    100%{opacity:100%;}
}
/*--------------------loading-----------------------*/
.ui-loading {position: absolute;left: 50%;top: 50%;display: none;vertical-align: middle;font: 0/0 arial;margin: -5px 0 0 -10px;}
.ui-loading i {display: inline-block;width: 5px;height: 12px;background: #fff;vertical-align: top;-webkit-animation: loading-spin 1s infinite linear;animation: loading-spin 1s infinite linear;}
.ui-loading i {-webkit-animation: loading-spin 1s infinite linear;animation: loading-spin 1s infinite linear}
.ui-loading i.t2 {margin: 0 3px;-webkit-animation-name: loading-spin-one;animation-name: loading-spin-one}
.ui-loading i.t3 {-webkit-animation-name: loading-spin-two;animation-name: loading-spin-two}
@-webkit-keyframes loading-spin {
    0% {opacity: 0}
    30% {opacity: 1;-webkit-transform: scale(1,1.2)}
    60% {opacity: 0;-webkit-transform: scale(1)}
    100% {opacity: 0}
}
@-webkit-keyframes loading-spin-one {
    0% {opacity: 0}
    20% {opacity: 0}
    50% {opacity: 1;-webkit-transform: scale(1,1.2)}
    80% {opacity: 0;-webkit-transform: scale(1)}
    100% {opacity: 0}
}
@-webkit-keyframes loading-spin-two {
    0% {opacity: 0}
    40% {opacity: 0}
    70% {opacity: 1;-webkit-transform: scale(1,1.2)}
    100% {opacity: 0;-webkit-transform: scale(1)}
}
@keyframes loading-spin {
    0% {opacity: 0}
    30% {opacity: 1;transform: scale(1,1.2)}
    60% {opacity: 0;transform: scale(1)}
    100% {opacity: 0}
}
@keyframes loading-spin-one {
    0% {opacity: 0}
    20% {opacity: 0}
    50% {opacity: 1;transform: scale(1,1.2)}
    80% {opacity: 0;transform: scale(1)}
    100% {opacity: 0}
}
@keyframes loading-spin-two {
    0% {opacity: 0}
    40% {opacity: 0}
    70% {opacity: 1;transform: scale(1,1.2)}
    100% {opacity: 0;transform: scale(1)}
}
/*--------------------loading-end----------------------*/

逻辑像素与物理像素的关联

ps:代码成效相比轻松,只怕会存在许多标题。但也能勉强使用了

dpr:设备像素缩放比

下用是使用ImageView.js的叁个事例:

总结公式:1px=(dpr)^2*dp;

复制代码 代码如下:

iphone5的dpr=2;

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no">
        <title>移动端大图查看</title>
        <script type="text/javascript" src="test_files/zepto.min.js" ></script>
        <script type="text/javascript" src="test_files/ImageView.js" ></script>
    </head>
    <body>
        <!--以上为HTML页面结构 -->
        <!--以下为ImageView使用例子 -->
        <script>
            ;(function(){
                //获取 html 中的图片成分
                var aImg=document.querySelectorAll("img"),
                    aImgSrc=[];
                //为图片绑定单击事件
                for(var i=0,l=aImg.length;i<l;i ){
                    aImg[i].index=i;
                    aImg[i].className =" conPic";
                    aImgSrc.push(aImg[i].src);
                }
                for(var i=0;i<$(".conPic").length;i ){
                    if($(".conPic")[i].complete){
                        addTap($(".conPic")[i])
                    }else{
                        $(".conPic")[i].onload=function(){
                            addTap(this);
                        }
                    }
                }
                function addTap(obj){
                    $(obj).on("tap",function(){
                        //调用ImageView
                        ImageView($(obj)[0].index,aImgSrc);
                    })
                }
            })();
        </script>
    </body>

3.viewport

上述就是本文的全部内容了,希望大家能够喜欢

手提式有线电话机浏览器以为我们做了两件业务:

你或然感兴趣的小说:

  • 浅谈移动端之js touch事件 手势滑动事件
  • 移步端js触摸事件详解
  • touch.js 拖动、缩放、旋转 (平底足势)功能代码
  • 依靠touch.js手势库 zepto.js插件开辟图片查看器(滑动、缩放、双击缩放)
  • 移动端脚本框架哈默.js
  • 哈默.js 轮播原理实现简洁的滑屏成效
  • zepto.js中tap事件阻止冒泡的兑现方式
  • 逸事zepto.js轻易达成上传图片
  • jQuery插件zepto.js轻便达成tab切换
  • js移动端事件基础及常用事件库详解

页面渲染在一个980px(ios)的viewport

缩放

一个300px的显示屏,放三个一千px的页面,会混杂,所以要先虚拟一个980px的页面,然后开始展览缩放。

4.meta标签

最佳viewport设置:布局viewport=device-width,initial-scale=1,user-scalable=no">

5.flexbox弹性布局

position:absolute;

top:50%;

left:50%;

transform:translate(-50%,-50%);

6.响应式布局

传播媒介询问:@media screen and(max-width:100px){}

比例搭架子

唯有使用媒体询问来适应不一致定位宽度设计

7.相对单位rem

em:是依附父节点的font-size为相对单位

rem:是依靠html的font-size为相对单位

8.终端交互优化

对click事件say no

弹性滚动

上拉刷新

tap事件基础

touch触摸事件

下拉加载

9.touch基础事件

touchstart:手指触摸显示屏触发

touchmove:手指在荧屏上海搞笑剧团动,接二连三触发

touchend:手指离开显示屏时接触

10.自身封装rem.js

window.onload=function(){

//设计员给的设计稿宽度

getRem(720,100)

};

window.onresize=function(){

getRem(720,100)

};

functiongetRem(pwidth,prem){

let html=document.getElementsByTagName("html")[0];

let oWidth=document.body.clientWidth||document.documentElement.clientWidth;

html.style.fontSize=oWidth/pwidth*prem "px";

}

两栏布局,侧边固定,左边自适应

*{

margin:0;

padding:0;

}

先是种方式

.left{

width:120px;

background:#4f8fd6;

float:left;

}

.right{

margin-left:120px;

background:#8d8d8d;

}

第三种办法

.wrapper-flex{

display:flex;

align-items:flex-start;

}

.wrapper-flex.left{

flex:0 0auto;

background:yellowgreen;

}

.wrapper-flex.right{

flex:1 1auto;

background:red;

}

第一种艺术

<div class="wrapper">

    <div class="left">

    </div>

<div class="right"></div>

</div>

第两种方法

<div class="wrapper-flex">

<div class="wrapper-flex left"></div>

<div class="wrapper-flex right"></div>

</div>

本文由澳门新萄京官方网站发布于澳门新萄京赌场网址,转载请注明出处:澳门新萄京官方网站js实现仿手机QQ空间的大图查

关键词: