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>

  

时间: 2024-12-30 00:58:17

js原生选项卡(包含移动端无缝选项卡)三的相关文章

js原生选项(自动播放无缝滚动轮播图)二

今天分享一下自动播放轮播图,自动播放轮播图是在昨天分享的轮播图的基础上添加了定时器,用定时器控制图片的自动切换,函数中首先封装一个方向的自动播放工能的小函数,这个函数中添加定时器,定时器中可以放向右走的代码,也可以放向左走的代码,然后在js加载的时候先执行一次,保证页面加载的时候轮播图是自动播放的,当然在鼠标悬停在遮罩层的时候我们需要清除这个定时器,让自动播放功能关闭,然后在鼠标再次移出遮罩层的时候再次开启定时器,这样就实现了自动播放的功能.然后今天的轮播图中我添加了开关的功能,这个开关是为了避

js原生选项(包含无缝滚动轮播图)一

原生js选项卡的几种写法,整片文章我会由简及难的描述几种常用的原生选项卡的写法: Improve little by little every day! 1>基本选项卡: 思路:循环中先清除再添加,注意this的指向和自定义属性的应用 html代码: <div id="tab"> <input class="on" type="button" value="aaa"> <input type

告别组件之教你使用原生js和css写移动端轮播图

在工作中由于项目需要要写一个轮播图,本想使用组件直接调用实现快速开发,但是一想到自己经常使用组件但是让自己手写的话确实一点都不会. 一个不会手写组件的前端程序员不是一个好程序员!于是打算自己手写一个. 老规矩,首先看一下最终效果,这个最终可以实现定时自动播放,触摸滑动,手动修改下面横条效果等功能. 项目中使用到的HTML代码如下 <div class="banner"> <ul class="clearfix"> <li><

JS案例之5——移动端触屏滑动

移动端触屏滑动的效果其实就是图片轮播,在PC的页面上很好实现,绑定click和mouseover等事件来完成.但是在移动设备上,要实现这种轮播的效果,就需要用到核心的touch事件.处理touch事件能跟踪到屏幕滑动的每根手指. 以下是四种touch事件 touchstart:     //手指放到屏幕上时触发 touchmove:      //手指在屏幕上滑动式触发 touchend:    //手指离开屏幕时触发 touchcancel:     //系统取消touch事件的时候触发,这个

基于zepto的插件之移动端无缝向上滚动并上下触摸滑动

该插件乃本博客作者所写,目的在于提升作者的js能力,也给一些js菜鸟在使用插件时提供一些便利,老鸟就悠然地飞过吧. 公司的移动端项目是基于zepto的,有一个页面要求文字能够无缝地不停向上滚动,但查了网上的资料,大多都是基于jquery的,虽然稍作修改就可以用于移动端,但不能实现触摸上下翻滚.所以就去了zepto的官网查看其API,却发现如果要使用zepto的swipe()方法,需要引用其已经封装好的touch.js文件,我就赶紧引用了这个js文件,可在实际测试中,官网给出的touch.js文件

dr-helper项目设计介绍(一个包含移动端和Web端的点餐管理系统)

一.源码路径 https://github.com/weiganyi/dr-helper 二.界面 通过浏览器访问Web服务,可以看到界面如下: ADT-Bundle编译工程生成dr-helper.apk,安装后可以看到应用界面如下: 三.背景 Java诞生后主要就是用于Web开发,随着Android的兴起,其在移动领域也应用广泛.我在学习了Java相关的一系列技术后,想找个项目来实际运用一下.因此我考虑可以基于Java相关的技术来构建一个包括移动端和Web端的餐厅管理系统,在这个项目里我会综合

js原生方式实现jquery中的append()方法

一.在使用jquery时, append() 方法在被选元素的结尾(仍然在内部)插入指定内容 使用方法:$(selector).append(content),content为必需的.规定要插入的内容(可包含 HTML 标签) 二.在使用原生js时,使用appendChild() 方法可向节点的子节点列表的末尾添加新的子节点, 用法:parent.appendChild(child); child没有引号包住,child参数,是node类型.给一个空文档里面动态创建元素,要使用document.

Js原生Ajax和Jquery的Ajax

一.Ajax概述 1.什么是同步,什么是异步 同步现象:客户端发送请求到服务器端,当服务器返回响应之前,客户端都处于等待卡死状态 异步现象:客户端发送请求到服务器端,无论服务器是否返回响应,客户端都可以随意做其他事情,不会被卡死 2.Ajax的运行原理 页面发起请求,会将请求发送给浏览器内核中的Ajax引擎,Ajax引擎会提交请求到服务器端,在这段时间里,客户端可以任意进行任意操作,直到服务器端将数据返回给Ajax引擎后,会触发你设置的事件,从而执行自定义的js逻辑代码完成某种页面1 功能. 二

认识JQuery,JQuery的优势、语法、多库冲突、JS原生对象和JQuery对象之间相互转换和DOM操作,常用的方法

(一)认识JQuery  JQuery是一个JavaScript库,它通过封装原生的JavaScript函数得到一套定义好的方法    JQuery的主旨:以更少的代码,实现更多的功能 (二)JQuery的优势 1)可以像CSS一样访问和操作DOM 2)修改CSS控制页面外观 3)简化JS代码操作 4)事件代理更加容易 5)动画效果使用方便 6) Ajax技术更加完美 7)大量的基于Jquery的插件 8)可以自定义扩展功能插件 (三)JQuery的语法 格式:$(selector).actio