• Web API—移动端端网页特效


    移动端端网页特效

    代码下载

    触屏事件

    触屏事件概述

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

    touch 对象代表一个触摸点。触摸点可能是一根手指,也可能是一根触摸笔。触屏事件可响应用户手指(或触控笔)对屏幕或者触控板操作。常见的触屏事件如下:

    触屏touch事件说明
    touchstart手指触摸到一个 DOM 元素时触发
    touchmove手指在一个 DOM 元素上滑动时触发
    touchend手指从一个 DOM 元素上移开时触发
    触摸事件对象(TouchEvent)

    TouchEvent 是一类描述手指在触摸平面(触摸屏、触摸板等)的状态变化的事件。这类事件用于描述一个或多个触点,使开发者可以检测触点的移动,触点的增加和减少,等等。touchstart、touchmove、touchend 三个事件都会各自有事件对象。

    触摸事件对象重点我们看三个常见对象列表:

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

    因为平时都是给元素注册触摸事件,所以重点记住 targetTocuhes

            let touch = document.querySelector('.touch');
            touch.addEventListener('touchstart', function(e) {
                console.log('我要摸了');
                console.log(e);
            });
            touch.addEventListener('touchmove', function(e) {
                console.log('我继续摸');
                console.log(e);
            });
            touch.addEventListener('touchend', function(e) {
                console.log('我摸完了');
                console.log(e);
            });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    移动端拖动元素
    1. touchstart、touchmove、touchend可以实现拖动元素
    2. 但是拖动元素需要当前手指的坐标值,可以使用 targetTouches[0] 里面的pageX 和 pageY
    3. 移动端拖动的原理:手指移动中,计算出手指移动的距离。然后用盒子原来的位置 + 手指移动的距离
    4. 手指移动的距离:手指滑动中的位置 减去 手指刚开始触摸的位置

    拖动元素三步曲:

    • 触摸元素 touchstart:获取手指初始坐标,同时获得盒子原来的位置
    • 移动手指 touchmove:计算手指的滑动距离,并且移动盒子
    • 离开手指 touchend:

    注意: 手指移动也会触发滚动屏幕所以这里要阻止默认的屏幕滚动 e.preventDefault();

            let drag = document.querySelector('.drag');
            var startX = 0;
            var startY = 0;
            var x = 0;
            var y = 0;
            let l = drag.offsetLeft;
            let t = drag.offsetTop;
            drag.addEventListener('touchstart', function(e) {
                startX = e.targetTouches[0].pageX;
                startY = e.targetTouches[0].pageY;
                x = this.offsetLeft - l;
                y = this.offsetTop - t;
            });
            drag.addEventListener('touchmove', function(e) {
                let currentX = e.targetTouches[0].pageX;
                let currentY = e.targetTouches[0].pageY;
                this.style.left = x + currentX - startX + 'px';
                this.style.top = y + currentY - startY + 'px';
                
                e.preventDefault();
            });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    移动端常见特效

    移动端轮播图案例

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

    1. 可以自动播放图片
    2. 手指可以拖动播放轮播图
                // 1、获取元素
                let rotation = document.querySelector('.rotation');
                let ul = rotation.children[0];
                let ol = rotation.children[1];
                let lis = ul.querySelectorAll('li');
    
                // 2、创建前后图片以及小原点
                for (let index = 0; index < lis.length; index++) {
                    let e = document.createElement('li');
                    if (index == 0) {
                        e.className = 'current';
                    }
                    ol.appendChild(e);
                }
                var fLi = lis[0];
                var lLi = lis[lis.length - 1];
                ul.appendChild(fLi.cloneNode(true));
                ul.insertBefore(lLi.cloneNode(true), fLi);
                ul.appendChild(document.createElement('div'));
                
                // 3、滚动动画
                var index = 1;
                function scrollUl(animate, time) {
                    console.log(time);
                    let current = ol.querySelector('.current');
                    let next = ol.children[(index + 2)%ol.children.length];
                    if (animate && time) {
                        ul.style.transition = 'transform ' + time + ' ease-in-out';
                        current.style.transition = 'width ' + time + ' ease-in-out';
                        next.style.transition = 'width ' + time + ' ease-in-out';
                    } else {
                        ul.style.transition = 'none';
                        current.style.transition = 'none';
                        next.style.transition = 'none';
                    }
                    let x = -index*rotation.offsetWidth;
                    ul.style.transform = 'translateX(' + x + 'px)';
                    current.classList.remove('current');
                    next.classList.add('current');
                }
                scrollUl(false);
    
                // 4、自动滚动
                var timer = null;
                function autoScroll() {
                    clearInterval(timer);
                    timer = setInterval(function() {
                        index++;
                        scrollUl(true, '0.35s');
                    }, 3000);
                }
                autoScroll();
    
                // 5、无缝滚动
                ul.addEventListener('transitionend', function() {
                    if (index > lis.length) {
                        index = 1;
                        scrollUl(false);
                    } else if (index <= 0) {
                        index = lis.length;
                        scrollUl(false);
                    }
                });
    
                // 滑动滚动
                var startX = 0;
                var moveX = 0;
                ul.addEventListener('touchstart', function(e) {
                    startX = e.targetTouches[0].pageX;
                    clearInterval(timer);
                    ul.style.transition = 'none';
    
                    e.preventDefault();
                });
                var flag = false;
                ul.addEventListener('touchmove', function(e) {
                    flag = true;
                    moveX = e.targetTouches[0].pageX - startX;
                    let x = -index*rotation.offsetWidth + moveX;
                    ul.style.transform = 'translateX(' + x + 'px)';
    
                    e.preventDefault();
                });
                ul.addEventListener('touchend', function(e) {
                    autoScroll();
                    if (flag) {
                        flag = false;
                        if (Math.abs(moveX) > 50) {
                            moveX > 0 ? index-- : index++;
                            console.log('index: ' + index);
                            scrollUl(true, '0.35s');
                        } else {
                            scrollUl(true, '0.15s');
                        }
                    }
                });
    
    • 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
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    classList 属性

    classList属性是HTML5新增的一个属性,返回元素的类名。但是ie10以上版本支持。

    该属性用于在元素中添加,移除及切换 CSS 类。有以下方法

    添加类:

    element.classList.add(‘类名’);

    focus.classList.add('current');
    
    • 1

    移除类:

    element.classList.remove(‘类名’);

    focus.classList.remove('current');
    
    • 1

    切换类(有就移除,没有就添加):
    element.classList.toggle(‘类名’);

    focus.classList.toggle('current');
    
    • 1

    判断元素是否包含指定名称的的样式,返回true/fals:

    element.classList.contains(‘类名’);

    focus.classList.contains('current');
    
    • 1

    注意:以上方法里面,所有类名都不带点

            let div = document.querySelector('.cl').querySelector('div');
            console.log(div.classList);
            div.classList.add('three');
            console.log(div.classList);
            div.classList.remove('one');
            console.log(div.classList);
            let lamp = document.querySelector('.lamp');
            lamp.addEventListener('click', function() {
                document.body.classList.toggle('dark');
                console.log(document.body.classList);
            });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    返回顶部案例:

    当页面滚动某个地方,就显示,否则隐藏,点击可以返回顶部。

    1. 滚动某个地方显示
    2. 事件:scroll页面滚动事件
    3. 如果被卷去的头部(window.pageYOffset)大于某个数值
    4. 点击,window.scroll(0,0)返回顶部
            let header = document.querySelectorAll('h3')[2];
            let back = document.querySelector('.back');
            window.addEventListener('scroll', function() {
                if (window.pageYOffset > header.offsetTop) {
                    back.style.display = 'block';
                } else {
                    back.style.display = 'none';
                }
            });
            back.addEventListener('click', function() {
                window.scroll(0, 0);
            });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    click 延时解决方案

    移动端 click 事件会有 300ms 的延时,原因是移动端屏幕双击会缩放(double tap to zoom) 页面。

    解决方案:
    一、禁用缩放。 浏览器禁用默认的双击缩放行为并且去掉300ms 的点击延迟。

      <meta name="viewport" content="user-scalable=no">
    
    • 1

    二、利用touch事件自己封装这个事件解决300ms 延迟。
    原理就是:

    1. 当手指触摸屏幕,记录当前触摸时间
    2. 当手指离开屏幕, 用离开的时间减去触摸的时间
    3. 如果时间小于150ms,并且没有滑动过屏幕, 那么我们就定义为点击
      代码如下:
    //封装tap,解决click 300ms 延时
    function tap (obj, callback) {
            var isMove = false;
            var startTime = 0; // 记录触摸时候的时间变量
            obj.addEventListener('touchstart', function (e) {
                startTime = Date.now(); // 记录触摸时间
            });
            obj.addEventListener('touchmove', function (e) {
                isMove = true;  // 看看是否有滑动,有滑动算拖拽,不算点击
            });
            obj.addEventListener('touchend', function (e) {
                if (!isMove && (Date.now() - startTime) < 150) {  // 如果手指触摸和离开时间小于150ms 算点击
                    callback && callback(); // 执行回调函数
                }
                isMove = false;  //  取反 重置
                startTime = 0;
            });
    }
    //调用  
      tap(div, function(){   // 执行代码  });
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    三、使用插件。
    fastclick 插件解决300ms 延迟。

    移动端常用开发插件

    移动端要求的是快速开发,所以经常会借助于一些插件来帮助完成操作,那么什么是插件呢?

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

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

    fastclick 插件解决 300ms 延迟。 使用延时

    GitHub官网地址: https://github.com/ftlabs/fastclick

    插件的使用
    1. 引入 js 插件文件。

    2. 按照规定语法使用。

    3. fastclick 插件解决 300ms 延迟。 使用延时

    4. GitHub官网地址: https://github.com/ftlabs/fastclick

          if ('addEventListener' in document) {
              document.addEventListener('DOMContentLoaded', function() {
                  FastClick.attach(document.body);
              }, false);
          }
          let fastclick = document.querySelector('.fastclick');
          fastclick.addEventListener('click', function() {
              alert('你好啊');
          });
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
    Swiper 插件的使用

    中文官网地址: https://www.swiper.com.cn/

    1. 引入插件相关文件。
    2. 按照规定语法使用

    Swiper 轮播图

        
        
    
    • 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
    其他移动端常见插件
    • superslide: http://www.superslide2.com/
    • iscroll: https://github.com/cubiq/iscroll

    插件的使用总结

    1. 确认插件实现的功能
    2. 去官网查看使用说明
    3. 下载插件
    4. 打开demo实例文件,查看需要引入的相关文件,并且引入
    5. 复制demo实例文件中的结构html,样式css以及js代码
    移动端视频插件 zy.media.js

    H5 给我们提供了 video 标签,但是浏览器的支持情况不同。

    不同的视频格式文件,可以通过source解决。但是外观样式,还有暂停,播放,全屏等功能我们只能自己写代码解决。这个时候可以使用插件方式来制作。可以通过 JS 修改元素的大小、颜色、位置等样式。

        
        
    
    • 1
    • 2
    • 3
    • 4

    移动端常用开发框架

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

    插件一般是为了解决某个问题而专门存在,其功能单一,并且比较小。

    前端常用的框架有 Bootstrap、Vue、Angular、React 等。既能开发PC端,也能开发移动端

    前端常用的移动端插件有 swiper、superslide、iscroll等。

    框架: 大而全,一整套解决方案

    插件: 小而专一,某个功能的解决方案

    Bootstrap

    Bootstrap 是一个简洁、直观、强悍的前端开发框架,它让 web 开发更迅速、简单。它能开发PC端,也能开发移动端 Bootstrap JS插件使用步骤:

    1. 引入相关js 文件
    2. 复制HTML 结构
    3. 修改对应样式
    4. 修改相应 JS 参数

    Bootstrap 轮播图

        
    
    • 1
    • 2
    • 3
    • 4
    • 5

    阿里百秀轮播图案例

    本地存储

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

    本地存储特性

    1. 数据存储在用户浏览器中
    2. 设置、读取方便、甚至页面刷新不丢失数据
    3. 容量较大,sessionStorage约5M、localStorage约20M
    4. 只能存储字符串,可以将对象JSON.stringify() 编码后存储
    window.sessionStorage
    1. 生命周期为关闭浏览器窗口
    2. 在同一个窗口(页面)下数据可以共享
    3. 以键值对的形式存储使用
      存储数据:
    sessionStorage.setItem(key, value)
    
    • 1

    获取数据:

    sessionStorage.getItem(key)
    
    • 1

    删除数据:

    sessionStorage.removeItem(key)
    
    • 1

    清空数据:(所有都清除掉)

    sessionStorage.clear()
    
    • 1
    window.localStorage
    1. 声明周期永久生效,除非手动删除 否则关闭页面也会存在
    2. 可以多窗口(页面)共享(同一浏览器可以共享)
    3. 以键值对的形式存储使用
      存储数据:
    localStorage.setItem(key, value)
    
    • 1

    获取数据:

    localStorage.getItem(key)
    
    • 1

    删除数据:

    localStorage.removeItem(key)
    
    • 1

    清空数据:(所有都清除掉)

    localStorage.clear()
    
    • 1

    本地存储:

            let key = document.querySelector('.key');
            let value = document.querySelector('.value');
            let set = document.querySelector('.set');
            set.addEventListener('click', function() {
                if (key.value && value.value) {
                    sessionStorage.setItem(key.value, value.value);
                    localStorage.setItem(key.value, value.value);
                } else {
                    alert('请输入键和值');
                }
            });
            let get = document.querySelector('.get');
            get.addEventListener('click', function() {
                if (key.value) {
                    alert(sessionStorage.getItem(key.value))
                    alert(localStorage.getItem(key.value))
                } else {
                    alert('请输入键和值');
                }
            });
            let remove = document.querySelector('.remove');
            remove.addEventListener('click', function() {
                if (key.value) {
                    sessionStorage.removeItem(key.value);
                    localStorage.removeItem(key.value);
                } else {
                    alert('请输入键和值');
                }
            });
            let clear = document.querySelector('.clear');
            clear.addEventListener('click', function() {
                sessionStorage.clear();
                localStorage.clear();
            });
    
    • 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
    • 31
    • 32
    • 33
    • 34
    记住用户名案例

    如果勾选记住用户名, 下次用户打开浏览器,就在文本框里面自动显示上次登录的用户名

    案例分析

    1. 把数据存起来,用到本地存储
    2. 关闭页面,也可以显示用户名,所以用到localStorage
    3. 打开页面,先判断是否有这个用户名,如果有,就在表单里面显示用户名,并且勾选复选框
    4. 当复选框发生改变的时候change事件
    5. 如果勾选,就存储,否则就移除
            let username = document.querySelector('#username');
            let checkbox = document.querySelector('#remember');
            if (localStorage.getItem('username')) {
                checkbox.checked = true;
                username.value = localStorage.getItem('username');
            }
            checkbox.addEventListener('change', function() {
                if (this.checked && username.value) {
                    localStorage.setItem('username', username.value);
                } else {
                    localStorage.removeItem('username');
                }
            });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
  • 相关阅读:
    【C语言】指针详解(3)
    redis学习四redis消息订阅、pipeline、事务、modules、布隆过滤器、缓存LRU
    矩池云快速安装torch-sparse、torch-geometric等包
    深度干货!一篇Paper带您读懂HTAP | StoneDB学术分享会第①期
    HTTP静态文件服务器gohttpserver
    浅谈语义分割、图像分类与目标检测中的TP、TN、FP、FN
    C# 常用数据类型转换
    【kernel exploit】CVE-2022-34918 nftable堆溢出漏洞利用(list_head任意写)
    JVM第十四讲:调试排错 - Java 内存分析之堆内存和MetaSpace内存
    离散数学_第8章 图__平面图
  • 原文地址:https://blog.csdn.net/jiuchabaikaishui/article/details/132685701