当前位置: 首页 > article >正文

webAPI中的触屏事件、轮播图、插件以及本地存储

一、触屏事件

1.触屏事件概述

移动端浏览器兼容性比较好,我们不需要考虑以前js的兼容性问题,我们可以放心的使用原生js写书效果,但是移动端也有自己的独特的地方。比如:触屏事件(touch) Android和ios都有

touch对象代表是一个触摸点,触摸点可以是一根手指,也可以是一根触摸笔,触屏事件可以响应手指(触控笔)对屏幕或者触控操作

2.常见的触屏事件

触屏事件说明
touchstart手指触摸到一个DOM元素的时候触发
touchmove手指在一个DOM元素上滑动的时候出发
touchend手指从一个dom元素上移开的时候触发

3.触摸事件对象(touchEvent)

TouchEvent是一类描述手指在触摸平面(触摸屏、触摸板)的状态变化事件。这类事件用于描述一个或多个触点,使得开发者可以检车触点的移动,触点的增加或减少等等

触摸列表说明
touches正在触摸屏幕的所有手指的一个列表
targetTouches正在触摸当前DOM元素上的手指的一个列表
changedTouches手指状态发生了改变的列表,从无到有,从有到无的变化

因为平时我们都是给元素注册触摸事件,所以注意targetTouches

二、移动端常见特效

1.移动轮播图

移动端轮播图功能和pc基本一致

  • 可以自动播放图片
  • 手指可以拖动播放轮播图
window.addEventListener('load', function () {
    //alert(1);
    //1.获取元素
    var focus = document.querySelector('.focus');
    var ul = focus.children[0];   //这是第一个子元素
    var ol = focus.children[1];     //第二个子元素
    //获赠个div的宽度
    var w = focus.offsetWidth;
    var index = 0; //图片的索引
    //2.利用定时器自动轮播图片
    var timer = setInterval(function(){
        index++;//索引加1
        var translateX = -index * w; //移动的距离
        ul.style.transition = 'all .3s'  //动画持续时间
        ul.style.transform = 'translateX('+translateX+'px)'; //移动的距离
    },2000);
    //等着我们过渡完成后,再去判断是否超过索引 
    // transitionend 事件在 CSS 完成过渡后触发。
    ul.addEventListener('transitionend',function(){
        if(index >= 3){
            index = 0; //如果超过了最大索引回到0所以,就是第一张图片
            ul.style.transition = 'none'  //动画持续时间
            var translateX = -index * w; //移动的距离
            ul.style.transform = 'translateX('+translateX+'px)'; //移动的距离
        } else if(index < 0){
            index = 2;  //如果小于最小的索引,就到最后一张图片
            ul.style.transition = 'none'  //动画持续时间
            var translateX = -index * w; //移动的距离
            ul.style.transform = 'translateX('+translateX+'px)'; //移动的距离
        }
        //3.小圆点跟着变化
        //把ol里面li带有current的类名选出来去掉类名,给当前的加上current
        ol.querySelector('.current').classList.remove('current');  //大家也可以用排他,全部干掉
        //让当前的索引号的小li加上current
        ol.children[index].classList.add('current');
    });

    //4.手指滑动轮播图
    //通过触摸元素(touchstart):获取手指初始位置坐标
    var startX = 0;
    var startY = 0;
    //添加手指触摸事件
    ul.addEventListener('touchstart',function(e){
        startX = e.targetTouches[0].pageX;
        //手指摸到轮播图,那么就该停止轮播(停止定时器)
        clearInterval(timer);
    });
    var moveX = 0; //在手指离开后我们要用这个距离做计算
    var flag = false;//如果用户手指移动过,我们再去判断是否要做判断效果
    //移动手指touchmove,计算手指的滑动距离,并且移动盒子
    ul.addEventListener('touchmove',function(e){
        //计算移动距离
        moveX = e.targetTouches[0].pageX - startX;
        //移动盒子,盒子原来位置+手指移动的距离
        var translateX = -index * w + moveX;
        //手指拖动的时候,不许哟动画效果,所以要取消过渡动画效果
        ul.style.transition = 'none'  //动画持续时间
        ul.style.transform = 'translateX('+translateX+'px)'; //移动的距离
        flag = true; //表示用户的手指动过轮播图
        //阻止屏幕滚动行为
        e.preventDefault();
    });
    //手指离开,根据移动距离去判断是回弹还是播放上一张,下一张
    ul.addEventListener('touchend',function(e){
        if(flag){ //用户的手指拖动过轮播图
            //(1)如果移动的距离大于50像素,我们就播放上一张或一张
            if(Math.abs(moveX) > 50){
                //如果用户是右滑播放的就是上一张,moveX是正值
                if(moveX > 0){
                    index--;
                } else {
                    //如果是左滑就播放下一张,moveX就是负值
                    index++;
                }
                var translateX = -index * w; //移动的距离
                ul.style.transition = 'all .3s'  //动画持续时间
                ul.style.transform = 'translateX('+translateX+'px)'; //移动的距离
            } else {
                //(2)如果移动的距离小于50像素我们就弹回去
                var translateX = -index * w; //移动的距离
                ul.style.transition = 'all .3s'  //动画持续时间
                ul.style.transform = 'translateX('+translateX+'px)'; //移动的距离
            }
        }
        //手指离开的时候重新开启定时器
        clearInterval(timer);
        timer = setInterval(function(){
            index++;//索引加1
            var translateX = -index * w; //移动的距离
            ul.style.transition = 'all .3s'  //动画持续时间
            ul.style.transform = 'translateX('+translateX+'px)'; //移动的距离
        },2000);
    });
});

2.返回顶部

//返回顶部模块
var goBack = this.document.querySelector('.goBack');
var nav = this.document.querySelector('nav');
window.addEventListener('scroll',function(){
    if(window.pageYOffset >= nav.offsetTop){
        goBack.style.display = 'block'
    } else {
        goBack.style.display = 'none'
    }
});
//点击后返回顶部
goBack.addEventListener('click',function(){
    window.scrollTo(0,0);
});

3.classList属性

classList属性是HTML5新增的一个属性,返回元素的类名

该属性用于元素中添加、移除以及切换css类

3.1 添加类

//语法
element.classList.add('类名');
//如:
focus.classList.add('current');

3.2 移除类

//语法
element.classList.remove('类名');
//如:
focus.classList.remove('current');

3.3 切换类

//语法
element.classList.toggle('类名');
//如:
focus.classList.toggle('current');
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>02classList属性</title>
    <style>
        .bg{
            background-color: black;
        }
    </style>
</head>
<body>
    <div class="one two three">123</div>
    <button>开关灯</button>
    <script>
        //classList返回的是元素的类名
        var div = document.querySelector('div');
        console.log(div.classList[1]);
        //1.添加类选择器
        div.classList.add('abc');
        //2.删除类名
        div.classList.remove('one');
        //3.切换类
        var btn = document.querySelector('button');
        btn.addEventListener('click',function(){
            document.body.classList.toggle('bg');
        })
    </script>
</body>
</html>

4.click延时解决方案

移动端click事件都会有300ms的延时。原因是移动端屏幕双击会缩放页面。

解决方案:

  • 进制缩放,浏览器禁用默认双击缩放行为可以去掉300ms的点击延迟

    • <meta name="viewport" content="user-scalable=no">
      
  • 利用touch事件自己封装这个事件解决300ms延迟

    • 原理:
      • 当我们手指触摸屏幕,记录当前触摸事件
      • 当我们的手指离开屏幕,用离开的事件减去触摸的事件
      • 如果时间小于150ms,并且没有滑动过屏幕,那我们就定义为点击
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>03使用插件解决延迟300ms问题</title>
    <script src="fastclick.js"></script>
</head>
<body>
    <div>123</div>
    <script>
        if('addEventListener' in document){
            document.addEventListener('DOMContentLoaded',function(){
                FastClick.attach(document.body);
            },false);
        }
        var div = document.querySelector('div');
        div.addEventListener('click',function(){
            alert(1111111);
        });
    </script>
</body>
</html>

三、移动端开发常用开发插件

1.什么是插件

移动端要求的是快速开发,所以我们经常借助一些插件来帮助我们完成操作。

JS插件就是js文件,它遵循一定规则编写,方便程序展示效果,拥有特定功能且方便调用,如:轮播图、瀑布流。

特点:它一般是为了解决某个问题而专门存在,其功能单一,并且比较小

fastclick.js就属于一个插件

2.插件的使用

  • 第一步:引入js文件
  • 按照规定的语法使用
if('addEventListener' in document){
    document.addEventListener('DOMContentLoaded',function(){
        FastClick.attach(document.body);
    },false);
}

3.Swiper

官网:https://swiper.com.cn/

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>04swiper轮播图</title>
    <link rel="stylesheet" href="swiper/swiper-bundle.css">
    <style>
        .swiper {
            width: 600px;
            height: 300px;
        }  
        .swiper img{
            width: 100%;
            height: 100%;
        }
        .swiper-slide{
            width:300px;/*设为固定值*/
            width:auto;/*根据内容调整宽度*/
        }
    </style>
</head>
<body>
    <div class="swiper">
        <div class="swiper-wrapper">
            <div class="swiper-slide"><img src="images/focus1.jpg" alt=""></div>
            <div class="swiper-slide"><img src="images/focus2.jpg" alt=""></div>
            <div class="swiper-slide"><img src="images/focus3.jpg" alt=""></div>
            <div class="swiper-slide"><img src="images/focus4.jpg" alt=""></div>
        </div>
        <!-- 如果需要分页器 -->
        <div class="swiper-pagination"></div>
        
        <!-- 如果需要导航按钮 -->
        <div class="swiper-button-prev"></div>
        <div class="swiper-button-next"></div>
        
        <!-- 如果需要滚动条 -->
        <div class="swiper-scrollbar"></div>
    </div>    


    <script src="swiper/swiper-bundle.min.js"></script>
    <script>        
        var mySwiper = new Swiper ('.swiper', {
          autoplay:{  //自动播放相关
            delay: 1000,
            stopOnLastSlide: false
          },
          //slidesPerView : 3, 
          effect: 'coverflow',
            slidesPerView: 3,
            centeredSlides: true, 
          //direction: 'vertical', // 垂直切换选项
          loop: true, // 循环模式选项
          
          // 如果需要分页器
          pagination: {
            el: '.swiper-pagination',
          },
          
          // 如果需要前进后退按钮
          navigation: {
            nextEl: '.swiper-button-next',
            prevEl: '.swiper-button-prev',
          },
          
          // 如果需要滚动条
          scrollbar: {
            el: '.swiper-scrollbar',
          },
        })        
        </script>
</body>
</html>

4.media

移动端视频框架

framework:框架。它会基于自身的特点向用户提供一套较为完整的解决方案。框架的控制权在框架本身,使用者要按照框架所规定的某种规范进行开发。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>05视频插件</title>
    <link rel="stylesheet" href="media/zy.media.min.css">
 
</head>
<body>
    <div class="playvideo">
        <div class="zy_media">
            <video poster="bx.png" data-config='{"mediaTitle": "《疯狂动物城》--腾讯视频"}'>
                <source src="media/mov.mp4" type="video/mp4">
                    您的浏览器不支持HTML5视频
            </video>
        </div>
    </div>
    <script src="media/zy.media.min.js"></script>
    <script>
        zymedia('video',{
            autoplay:true,
            alwaysShowControls: false
        });
    </script>
</body>
</html>

四、本地存储

1.概念

随着互联网的快速发展,基于网页的应用越来越多,同时也变得复杂,为了满足各种各样的需求,会经常在本地存储大量的数据,HTML5规范提出了相应的解决方案

  • 数据存储在用户的浏览器中
  • 设置、读取方便、甚至页面刷新都不丢失数据
  • 容量较大。sessionStroage约5M,localStorage约20M
  • 只能存储字符串,可以将对象JSON.stringif() 编码后存储

2.sessionStorage

  • 生命周期为关闭浏览器窗口
  • 在同一个窗口(页面)下数据可以共享
  • 以键值对的形式存储使用 (name:‘张三’)

2.1 存储数据的语法

sessionStorage.setItem(key,value);

2.2 获取数据的语法

sessionStorage.getItem(key);

2.3 删除数据

sessionStorage.removeItem(key);

2.4 清空所有数据

sessionStorage.clear()
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>06本地存储-sessionStorage</title>
</head>
<body>
    <input type="text">
    <button class="set">存储数据</button>
    <button class="get">获取数据</button>
    <button class="remove">删除数据</button>
    <button class="removeAll">删除全部数据</button>

    <script>
        var input = document.querySelector('input');
        var set = document.querySelector('.set');
        var get = document.querySelector('.get');
        var remove = document.querySelector('.remove');
        var removeAll = document.querySelector('.removeAll');


        //添加数据
        set.addEventListener('click',function(){
            //点击按钮后,将数据存储到sessionStorage中
            var val = input.value;
            sessionStorage.setItem('username',val);
        });

        //获取数据
        get.addEventListener('click',function(){
            //点击按钮后,将数据从sessionStorage中取出
            var val = sessionStorage.getItem('username');
            console.log('从sesisonStorage中取出的key是username的值:' + val);
        });

        //删除数据
        remove.addEventListener('click',function(){
            //点击按钮后,将数据从sessionStorage中删除
            sessionStorage.removeItem('username');
        });

        //删除全部数据
        removeAll.addEventListener('click',function(){
            //点击按钮后,将数据从sessionStorage中全部数据删除
            sessionStorage.clear();
        });
    </script>
</body>
</html>

3.localStorage

  • 生命周期永久生效,除非手动删除,否则关闭页面也会存在
  • 可以多个窗口(页面)共享同一个数据(同一个浏览器的多个窗口可以共享数据)
  • 以键值对的形式存储数据

3.1 存储数据

localStorage.setItem(key,value);

3.2 获取数据

localStorage.getItem(key);

3.3删除数据

localStorage.removeItem(key);
//清空所有数据
localStorage.clear();
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>07本地存储-localStorage</title>
</head>
<body>
    <div>
        用户名:<input type="text" id="username">
        <br/>
        密码:<input type="text" id="pwd">
    </div>
    
    <button class="set">存储数据</button>
    <button class="get">获取数据</button>
    <button class="remove">删除数据</button>
    <button class="removeAll">删除全部数据</button>

    <script>
        var username = document.querySelector('#username');
        var password = document.querySelector('#pwd');
        var set = document.querySelector('.set');
        var get = document.querySelector('.get');
        var remove = document.querySelector('.remove');
        var removeAll = document.querySelector('.removeAll');


        //添加数据
        set.addEventListener('click',function(){
            //点击按钮后,将数据存储到localStorage中
            var name = username.value;
            var pwd = password.value;
            localStorage.setItem('username',name);
            localStorage.setItem('pwd',pwd);
        });
        
        //获取数据
        get.addEventListener('click',function(){
            //点击按钮后,将数据从localStorage中取出
            var name = localStorage.getItem('username');
            console.log('从localStorage中取出的key是username的值:' + name);
            var pwd = localStorage.getItem('pwd');
            console.log('从localStorage中取出的key是pwd的值:' + pwd);
        });
        
        //删除数据
        remove.addEventListener('click',function(){
            //点击按钮后,将数据从localStorage中删除
            localStorage.removeItem('pwd');
        });

        //删除全部数据
        removeAll.addEventListener('click',function(){
            //点击按钮后,将数据从localStorage中全部数据删除
            localStorage.clear();
        });
    </script>
</body>
</html>

http://www.kler.cn/news/362079.html

相关文章:

  • Docker 安装Postgres和PostGIS,并制作镜像
  • VMware下安装Centos 7.6
  • 活体人脸识别技术总结及实践
  • Python | Leetcode Python题解之第486题预测赢家
  • SD-WAN企业组网的应用场景
  • Hadoop 踩坑汇总
  • 鸿蒙系统 VS 安卓系统,谁将引领未来移动操作系统?
  • 十九、Python基础语法(字典(dict))
  • Tftpd.exe源代码分析----TftpdIoPostReceiveBuffer函数分析
  • 10月22日,每日信息差
  • 基础学习-centos修改本地语言
  • 【C++】vector(1)
  • Linux中文件的读写过程
  • 制造企业数字化转型顶层规划案例(55页满分PPT)
  • Vue学习笔记(四、v-bind指令)
  • 复旦大学全球供应链研究中心揭牌,合合信息共话大数据赋能
  • VMware通过Vcenter升级Esxi
  • 人工智能技术的应用与未来展望
  • 电子电气架构---中央/准中央+区域架构已成为OEM主机厂降本利器
  • 059_基于python智能文献管理系统
  • MySQL 创新版9.1.0有哪些功能?
  • 摩熵数科数据产品阵容BCPM
  • docker 微服务实践
  • springboot jackson 数据脱敏
  • json键值对组成的数组去重。
  • 13.3 Linux_网络编程_多路复用I/O接入多客户端