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

news2024/10/23 20:28:03

一、触屏事件

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.coloradmin.cn/o/2221850.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从0到1实现你自己的AI Chat应用

目标 基于大语言模型的 Chat 应用&#xff0c;是一种利用自然语言处理技术来进行对话交互的智能应用。 大语言模型通过大量数据的学习和训练&#xff0c;能够理解自然语言表达的语义&#xff0c;具备智能对话的能力。当用户向 Chat 应用提出问题时&#xff0c;Chat 应用就会利…

理解TypeScript模块-声明-配置

目录 模块化内置类型导入命名空间类型查找内置类型外部定义声明第三方库自定义声明 tsconfig.json文件在Vue项目中应用在React项目中应用 模块化 在TypeScript中最主要使用的模块化方案就是ES Module&#xff0c;先理解 TypeScript 认为什么是一个模块&#xff1a; JavaScript…

如何利用 Python抓取网页数据 其他方式抓取网页数据列举

在 Python 中可以使用多种方法抓取网页数据&#xff0c;以下是一种常见的方法&#xff0c;使用requests和BeautifulSoup库。 一、安装所需库 在命令提示符或终端中执行以下命令安装requests和BeautifulSoup库&#xff1a; pip install requests pip install beautifulsoup4二…

Spring Boot论坛网站开发:最佳实践指南

3系统分析 3.1可行性分析 通过对本论坛网站实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本论坛网站采用SSM框架&#xff0c;JAVA作为开发语言&#xff0c;是…

使用 Cursor 和 Devbox 快速开发并上线 Gin 项目

作为开发者&#xff0c;最让我们头疼的事情是什么&#xff1f;那必须是环境配置、版本控制以及各种部署配置等等繁琐的工作。 想象一下&#xff0c;如果你只需点击几下鼠标&#xff0c;就能拥有一个完全配置好的开发环境&#xff0c;支持从 Java 到 Python&#xff0c;从 Reac…

[实时计算flink]作业开发上线流程及规范

随着数据量的爆炸性增长和业务需求的日益复杂化&#xff0c;企业对实时数据处理能力的需求愈发迫切。Flink作为一种强大的流处理框架已经成为实时计算标准&#xff0c;其规范化的开发和运维流程对于企业提升数据处理效率、确保系统稳定性至关重要&#xff0c;旨在提升研发效率&…

电商大数据获取渠道分享--官方接口、爬虫、第三方如何选择?

在当今大数据驱动的商业环境中&#xff0c;电商企业越来越依赖数据分析来洞察市场、优化运营和提升竞争力。本文将分享几种常见的电商大数据获取渠道&#xff0c;帮助电商从业者更有效地收集和利用数据资源。 一、电商平台官方接口 各大电商平台如淘宝、京东、拼多多等&#…

DML语言

DML&#xff08;数据操作语言&#xff09; 用于操作数据库对象中所包含的数据 包括&#xff1a; INSERT ( 添加数据语句 ) UPDATE ( 更新数据语句 ) DELETE ( 删除数据语句 ) INSERT ( 添加数据语句 ) INSERT INTO 表名 [ ( 字段1, 字段2, 字段3, … ) ] VALUES ( 值1, 值2,…

计算机网络-RSTP工作过程与原理

前面我们已经学习了RSTP的一些基础概念以及对于STP的改进之处&#xff0c;因为RSTP兼容STP&#xff0c;所以实际上两者工作原理是一致的&#xff0c;这里只简单过一遍&#xff0c;然后进行一些基础实验即可&#xff0c;大致还是遵循选举根桥、确定端口角色与状态、全网收敛的思…

CentOS 8 Stream环境下通过yum安装Mysql

1.在Mysql下载页面MySQL :: Download MySQL Community Server页尾 点击 “MD5 checksums and GnuPG signatures” 进入下一页面 2.打开下载yum repo文件页面 (MySQL :: Download MySQL Yum Repository) 3.点击"DownLoad"按钮&#xff0c;打开下载页面&#xff0c; 4.…

GB/T28181-2022规范解读、应用场景和技术实现探究

GB/T28181-2022和GB/T28181-2016区别 GB/T28181-2022《公共安全视频监控联网系统信息传输、交换、控制技术要求》与 GB/T28181-2016 相比&#xff0c;主要有以下区别&#xff1a; 术语和定义方面&#xff1a; 术语删减&#xff1a;GB/T28181-2022 删除了 “联网系统信息”“数…

大模型LLM学习路线图2024年最新版!全面掌握学习路径,非常详细,零基础想学大模型收藏这一篇就够了

ChatGPT的出现在全球掀起了AI大模型的浪潮&#xff0c;2023年可以被称为AI元年&#xff0c;AI大模型以一种野蛮的方式&#xff0c;闯入你我的生活之中。 从问答对话到辅助编程&#xff0c;从图画解析到自主创作&#xff0c;AI所展现出来的能力&#xff0c;超出了多数人的预料&…

【redis】redis的多线程和IO多路复用

【redis】redis的多线程和IO多路复用 【一】前言【二】Redis单线程和多线程问题的背景【1】Redis的单线程【2】Redis为什么选择单线程&#xff1f;【3】Redis为什么开始利用多核&#xff1f;【4】Redis当前的性能瓶颈【5】Redis的主线程如何和IO线程协同 【三】IO多路复用的理解…

【Trick】IOS系统解决“未受信任的企业级开发者”问题

问题&#xff1a; 本人通过扫码下载了一个软件&#xff0c;下载完毕后出现以下提示&#xff1a; 解决方法&#xff1a; 这个主要是操作系统的问题&#xff0c;需要在设置里面更改&#xff0c;具体步骤如下&#xff1a; 【1】打开设置&#xff0c;选择【通用】 【2】选择【VP…

千鹿 AI ——AI一键生成模特上身图,零成本制作服装电商图片,AI换模特/背景/批量抠图,一个网站就够了!

前言 在电商行业&#xff0c;卖产品主要是卖图片。拍一套产品图加上美工费用&#xff0c;基本要大几百上千&#xff0c;对新手卖家是不小的支出。服装类目的 SKU 很多&#xff0c;一个链接下有几十个款式很常见。 AI 出现对跨境电商有好处是大家都知道的。现在看看电商领域的…

rust aarch64开发-编译

1. 实验代码下载 本实验基于github或gitee上的开源实现。 // 无法访问github可以通过如下地址下载 git clone https://gitee.com/yang_jun_yi/armv8-rust-hypervisor.git // github下载 git clone https://github.com/Comet959/armv8-rust-hypervisor.git2. 编译 make start…

PG实践|数学函数及其操作(一)

文章目录 引言1.1 ABS() - 取绝对值1.2 CEIL() 或 CEILING() - 向上取整1.3 FLOOR() - 向下取整1.4 ROUND() - 四舍五入1.5 TRUNC() - 截断/截取小数总结 &#x1f4eb; 作者简介&#xff1a;「六月暴雪飞梨花」&#xff0c;专注于研究Java&#xff0c;就职于科技型公司后端工程…

Spring配置/管理bean-IOC(控制反转) 非常详细!基于XML及其注解!案例分析! 建议复习收藏!

目录 1.Spring配置/管理bean介绍 2.基于XML配置bean 2.1基于id来获取bean对象 2.2基于类型获取bean对象 2.3通过指定构造器配置bean对象 2.4通过p名称空间配置bean 2.5通过ref配置bean(实现依赖注入) 2.6注入内部Bean对象&#xff0c;依赖注入另一种方式 2.7 注入集合…

AWD的复现

学习awd的相关资料&#xff1a;速成AWD并获奖的学习方法和思考记录- Track 知识社区 - 掌控安全在线教育 - Powered by 掌控者&#xff08;包含使用脚本去批量修改密码&#xff09; 在复现之前去了解了以下AWD的相关脚本 资料&#xff1a;AWD批量攻击脚本使用教程-CSDN博客 …

网络安全有关法律法规

1. 前言 在当今数字化高速发展的时代&#xff0c;网络安全已成为关乎国家、企业和个人的重要议题。为了应对日益复杂的网络安全挑战&#xff0c;一系列网络安全法律法规应运而生&#xff0c;它们如同坚实的盾牌&#xff0c;守护着我们的数字世界。现在是2024年10月&#xff0c…