Web APIs——M端事件、JS插件

news2024/11/25 20:49:09

1、M端事件

移动端也有自己独特的地方。比如触屏事件touch(也称触摸事件),Android 和 IOS都有。

  • 触屏事件touch(也称触摸事件),Android和IOS都有。
  • touch对象代表一个触摸点。触摸点可能是一根手指,也可能是一根触摸笔。触屏事件可响应用户手指(或触控笔)对屏幕或者触控板操作。
  • 常见的触屏事件如下:
触屏touch事件说明
touchstart手机触摸到一个DOM元素时触发
touchmove手指在一个DOM元素上滑动时触发
touchend手指从一个DOM元素上移开时触发
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        div {
            width: 300px;
            height: 300px;
            background-color: blueviolet;
        }
    </style>
</head>
<body>
    <div></div>
    <script>
        // 要在移动端才有效果
        const div = document.querySelector('div')
        // 1. 触摸
        div.addEventListener('touchstart',function () {
            console.log('开始了')
        })
        // 2. 离开
        div.addEventListener('touchend',function () {
            console.log('离开了')
        })
        // 3. 移动
        div.addEventListener('touchmove',function () {
            console.log('一直在里面移动')
        })
    </script>
</body>
</html>

2、JS插件

插件:就是别人写好的一些代码,我们只需要复制对应的代码,就可以直接实现对应的效果

学习插件的基本过程:

  • 熟悉官网,了解这个插件可以完成什么需求  https://www.swiper.com.cn/
  • 看在线演示,找到符合自己需求的demo   https//www.swiper.com.cn/demo/index.html
  • 查看基本使用流程  https://www.swiper.com.cn/usage/index.html
  • 查看API文档,去配置自己的插件 https://www.swiper.com.cn/api/index.html
  • 注意:多个swiper同时使用的时候,类名需要注意区分

进入 https://www.swiper.com.cn/该网址,然后点击获取Swiper,下载Swiper,

也可以通过选择中文教程来使用

 

可以看到下面是swiper不同版本的压缩包,想下载那个就点击那个就可以了

下载6.8.4以下的版本,可以找到css和js文件在这里,其他版本的找到后缀名为css,js的就可以。直接把他们复制到需要的项目里面就行

想知道怎么使用,可以查文档,进入Swiper,点击在线演示,选择对应的演示教程,然后选择自己需要的,我选择的是基础演示,选择的是分页器(030),

 

在有网的情况下,就可以直接点击新窗口打开,就可以直接右击查看源代码,然后复制粘贴就可以了

 

没网的情况下,可以直接进入刚刚下载的按照压缩包, 找到demos文档,找到前面排序为030的html文件就可以

可以发现这个不能自己播放,可以查看API文档,我们现在需要的是它自动切换,可以找到Auto play(自动切换)

这里使用delay,让它一秒播放一次

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel = "stylesheet" href = "./css/swiper.min.css">
    <style>
        .box {
            position: relative;
            width: 800px;
            height: 300px;
            background-color: blueviolet;
            margin: 100px auto;
        }
        html,
        body {
            position: relative;
            height: 100%;
        }

        body {
            background: #eee;
            font-family: Helvetica Neue, Helvetica, Arial, sans-serif;
            font-size: 14px;
            color: #000;
            margin: 0;
            padding: 0;
        }

        .swiper {
            overflow: hidden;
            width: 100%;
            height: 100%;
        }

        .swiper-slide {
            text-align: center;
            font-size: 18px;
            background: #fff;
            display: flex;
            justify-content: center;
            align-items: center;
        }

        .swiper-slide img {
            display: block;
            width: 100%;
            height: 100%;
            object-fit: cover;
        }
    </style>
</head>
<body>
    <div class="box">
        <div class="swiper mySwiper">
            <div class="swiper-wrapper">
              <div class="swiper-slide">Slide 1</div>
              <div class="swiper-slide">Slide 2</div>
              <div class="swiper-slide">Slide 3</div>
              <div class="swiper-slide">Slide 4</div>
              <div class="swiper-slide">Slide 5</div>
              <div class="swiper-slide">Slide 6</div>
              <div class="swiper-slide">Slide 7</div>
              <div class="swiper-slide">Slide 8</div>
              <div class="swiper-slide">Slide 9</div>
            </div>
            <div class="swiper-pagination"></div>
          </div>
        
    </div>
    <script src = "./js/swiper.min.js"></script>  
    <script>  
        var swiper = new Swiper(".mySwiper", {
            // 小圆点
            pagination: {
                el: ".swiper-pagination",
            },
            // 自动播放
            autoplay: {
                delay: 1000,//1秒切换一次
                disableOnInteraction: false, //鼠标点击 触摸之后,自动继续播放
            },
            // 可以键盘控制
            keyboard: {
                enabled: true,
                onlyInViewport: true,
            },
        });
    </script>
</body>
</html>

3、学生信息表案例

业务模块:

①:点击录入按钮可以录入数据

②:点击删除可以删除当前数据

说明:

尽量减少dom操作,采取操作数据的形式

增加和删除都是针对数组的操作,然后根据数组数据渲染页面

核心思路

①: 声明一个空的数组
②: 点击录入,根据相关数据,生成对象,追加到数组里面  
        (1). 首先取消表单默认提交事件
        (2). 创建新的对象,里面存储 表单获取过来的数据,格式如右图
        (3). 追加给数组
        (4). 渲染数据。 遍历数组, 动态生成tr, 里面填写对应td数据, 并追加给 tbody
        (5). 重置表单
        (6). 注意防止多次生成多条数据,先清空 tbody
③: 根据数组数据渲染页面-表格的 行
④: 点击删除按钮,删除的是对应数组里面的数据
        (1). 采用事件委托形式,给 tbody 注册点击事件
        (2). 点击链接,要删除的是对应数组里面的这个数据,而不是删除dom节点,如何找到这个数据?
        (3). 前面渲染数据的时候,动态给a链接添加 自定义属性 data-id=“0”,这样点击当前对象就知道索引号了
        (4). 根据索引号,利用 splice 删除这条数据
        (5). 重新渲染
⑤: 点击新增需要验证表单      
        (1). 获取所有需要填写的表单, 他们共同特点都有 name属性
        (2). 遍历这些表单,如果有一个值为空,则return 返回提示输入为空中断程序
        (3). 注意书写的位置,应该放到新增数据的前面, 阻止默认行为的后面

index.css

* {
  margin: 0;
  padding: 0;
}

a {
  text-decoration: none;
  color:#721c24;
}
h1 {
  text-align: center;
  color:#333;
  margin: 20px 0;
 
}
table {
  margin:0 auto;
  width: 800px;
  border-collapse: collapse;
  color:#004085;
}
th {
  padding: 10px;
  background: #cfe5ff;
  
  font-size: 20px;
  font-weight: 400;
}
td,th {
  border:1px solid #b8daff;
}
td {
  padding:10px;
  color:#666;
  text-align: center;
  font-size: 16px;
}
tbody tr {
  background: #fff;
}
tbody tr:hover {
  background: #e1ecf8;
}
.info {
  width: 900px;
  margin: 50px auto;
  text-align: center;
}
.info  input, .info select {
  width: 80px;
  height: 27px;
  outline: none;
  border-radius: 5px;
  border:1px solid #b8daff;
  padding-left: 5px;
  box-sizing: border-box;
  margin-right: 15px;
}
.info button {
  width: 60px;
  height: 27px;
  background-color: #004085;
  outline: none;
  border: 0;
  color: #fff;
  cursor: pointer;
  border-radius: 5px;
}
.info .age {
  width: 50px;
}

学生信息表案例.html

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <meta http-equiv="X-UA-Compatible" content="ie=edge" />
  <title>学生信息管理</title>
  <link rel="stylesheet" href="css/index.css" />
</head>

<body>
  <h1>新增学员</h1>
  <form class="info" autocomplete="off">
    姓名:<input type="text" class="uname" name="uname" />
    年龄:<input type="text" class="age" name="age" />
    性别:
    <select name="gender" class="gender">
      <option value="男">男</option>
      <option value="女">女</option>
    </select>
    薪资:<input type="text" class="salary" name="salary" />
    就业城市:<select name="city" class="city">
      <option value="北京">北京</option>
      <option value="上海">上海</option>
      <option value="广州">广州</option>
      <option value="深圳">深圳</option>
      <option value="曹县">曹县</option>
    </select>
    <button class="add">录入</button>
  </form>

  <h1>就业榜</h1>
  <table>
    <thead>
      <tr>
        <th>学号</th>
        <th>姓名</th>
        <th>年龄</th>
        <th>性别</th>
        <th>薪资</th>
        <th>就业城市</th>
        <th>操作</th>
      </tr>
    </thead>
    <tbody>
      <!-- 
        <tr>
          <td>1001</td>
          <td>欧阳霸天</td>
          <td>19</td>
          <td>男</td>
          <td>15000</td>
          <td>上海</td>
          <td>
            <a href="javascript:">删除</a>
          </td>
        </tr> 
        -->
    </tbody>
  </table>
  <script>
    // 获取元素
    const uname = document.querySelector('.uname')
    const age = document.querySelector('.age')
    const gender = document.querySelector('.gender')
    const salary = document.querySelector('.salary')
    const city = document.querySelector('.city')
    const tbody = document.querySelector('tbody')
    // 获取所有带有name属性的 元素
    const items = document.querySelectorAll('[name]')
    // 声明一个空的数组, 增加和删除都是对这个数组进行操作
    const arr = []

    // 1. 录入模块
    // 1.1 表单提交事件
    const info = document.querySelector('.info')
    info.addEventListener('submit', function (e) {
      // 阻止默认行为  不跳转
      e.preventDefault()
      // console.log(11)

      // 这里进行表单验证  如果不通过,直接中断,不需要添加数据
      // 先遍历循环
      for (let i = 0; i < items.length; i++) {
        if (items[i].value === '') {
          return alert('输入内容不能为空')
        }
      }
      // 创建新的对象
      const obj = {
        stuId: arr.length + 1,
        uname: uname.value,
        age: age.value,
        gender: gender.value,
        salary: salary.value,
        city: city.value
      }
      // console.log(obj)
      // 追加给数组里面
      arr.push(obj)
      // console.log(arr)
      // 清空表单  重置 
      this.reset()
      // 调用渲染函数
      render()
    })


    // 2. 渲染函数 因为增加和删除都需要渲染
    function render() {
      // 先清空tbody 以前的行 ,把最新数组里面的数据渲染完毕 
      tbody.innerHTML = ''
      // 遍历arr数组
      for (let i = 0; i < arr.length; i++) {
        // 生成 tr 
        const tr = document.createElement('tr')
        tr.innerHTML = `
          <td>${arr[i].stuId}</td>
          <td>${arr[i].uname}</td>
          <td>${arr[i].age}</td>
          <td>${arr[i].gender}</td>
          <td>${arr[i].salary}</td>
          <td>${arr[i].city}</td>
          <td>
            <a href="javascript:" data-id=${i}>删除</a>
          </td>
        `
        // 追加元素  父元素.appendChild(子元素)
        tbody.appendChild(tr)
      }
    }


    // 3. 删除操作
    // 3.1 事件委托 tbody
    tbody.addEventListener('click', function (e) {
      if (e.target.tagName === 'A') {
        // 得到当前元素的自定义属性 data-id
        // console.log(e.target.dataset.id)
        // 删除arr 数组里面对应的数据
        arr.splice(e.target.dataset.id, 1)
        console.log(arr)
        // 从新渲染一次
        render()
      }
    })
  </script>

</body>

</html>

4、重绘与回流

4.1 浏览器是如何进行界面渲染的

  • 解析(Parser)HTML,生产DOM树(DOM Tree)
  • 同时解析(Parser)CSS,生成样式规则(Style Rules)
  • 根据DOM树和样式规则,生成渲染树(Render Tree)
  • 进行布局(Layout(回流/重排):根据生成的渲染树,得到节点的几何信息(位置,大小)
  • 进行绘制Painting(重绘):根据计算和获取的信息进行整个页面的绘制
  • Dispaly:展示在页面上

4.2 回流(重排)

        当Render Tree中部分或者全部元素的尺寸、结构、布局等发生改变时,浏览器就会重新渲染部分或全部文档的过程称为 回流。

4.3 重绘

        由于节点(元素)的样式的改变并不影响它在文档流中的位置和文档布局(比如:color、background-color、outline等),称为重绘。

重绘不一定引起回流,而回流一定会引起重绘。

  • 会导致回流(重排)的操作:
    • 页面的首次刷新
    • 浏览器的窗口大小发生改变
    • 元素的大小或位置发生改变
    • 改变字体的大小
    • 内容的变化(如:input框的输入,图片的大小)
    • 激活CSS伪类(如:hover)
    • 脚本操作DOM(添加或者删除可见的DOM元素)

简单理解影响到布局了,就会有回流

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1169811.html

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

相关文章

ChatGLM3设置角色和工具调用的解决方案

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

Leetcode刷题详解——反转链表

1. 题目链接&#xff1a;206. 反转链表 2. 题目描述&#xff1a; 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1…

word文章图片怎么缩小成200kb?看这篇攻略就够了

在编辑word文档的使用&#xff0c;常常会为了增加内容的丰富性去插入一些精美图片&#xff0c;不知道小伙伴有没有发现&#xff0c;其实我们导入的图片也是有大小限制的&#xff0c;如果图片过大就无法使用的&#xff0c;那么遇到这种情况该怎么处理呢&#xff1f;其实可以把图…

C++多态基础

文章目录 1.多态概念2.多态使用3.多态析构4.多态隐藏5.多态原理5.1.单类继承5.1.1.问题一&#xff1a;非指针或引用无法调用多态5.1.2.问题二&#xff1a;同类对象共用虚表5.1.3.问题三&#xff1a;子类对象拷贝父类对象虚表5.1.4.问题四&#xff1a;打印虚表地址和虚表内容 5.…

手写操作系统篇:实现裸机应用程序

文章目录 前言操作系统执行环境创建裸机平台项目Rust的Core库移除标准库依赖Qemu 启动流程内存布局编译流程内核的初始指令调整内核的内存布局手动加载内核可执行文件使用RustSBI提供的服务添加bootloader模块添加Makefile运行停止总体架构 前言 我们既然是手写操作系统&#…

峰回网关数采PLC

1.网络配置 例如&#xff1a;plc地址是192.168.1.56 1.访问网关 峰回网关默认网关地址 192.168.3.18&#xff0c;或者&#xff08;10.10.253.354&#xff09;&#xff0c;本案例按照3.18讲解。 1和1相连&#xff0c;0和电脑相连 本地电脑修改ip为192.168.3.3&#xff08;和3…

一分钟搞定!快速去除图片背景底色的步骤教程

最近不少小伙伴过来咨询&#xff0c;怎么样才能去除公章上的白色背景&#xff0c;一般电子公章很多都带有背景底色&#xff0c;使用起来非常不方便&#xff0c;所以今天就教大家一个不用ps就可以把图片转化透明底的方法&#xff0c;而且这是一款专业的在线ps工具&#xff1b;不…

SoftwareTest4 - 咋设计一个好的测试用例

咋设计一个好的测试用例 一 . 设计测试用例的万能公式功能测试性能测试界面测试兼容性测试易用性测试安全测试案例案例1 : 对水杯设计测试用例案例 2 : 对登录页面设计测试用例 二 . 具体设计测试用例的方法2.1 等价类等价类的概念等价类的用例编写 2.2 边界值2.3 判定表2.4 场…

docker部署MySQL服务

部署 MySQL8.0.35社区版 1.下载镜像 docker pull container-registry.oracle.com/mysql/community-server:8.0.35 查看镜像 docker images 2. 启动MySQL服务器实例 docker run --namemysql8 --restart on-failure -p 3309:3306 -d container-registry.oracle.com/mysql/comm…

2023-11-04 LeetCode每日一题(数组中两个数的最大异或值)

2023-11-04每日一题 一、题目编号 421. 数组中两个数的最大异或值二、题目链接 点击跳转到题目位置 三、题目描述 给你一个整数数组 nums &#xff0c;返回 nums[i] XOR nums[j] 的最大运算结果&#xff0c;其中 0 ≤ i ≤ j < n 。 示例 1&#xff1a; 示例 2&…

【项目管理】项目计划中常见影响进度的风险汇总

哈喽&#xff0c;大家好&#xff0c;我是雷工。 在项目实施过程中针对项目进度的计划常常会有各种各样的的风险&#xff0c;相比出了问题去救火与填坑&#xff0c;能够提前预知风险&#xff0c;并提前调整计划&#xff0c;更能有利于项目的如期交付。 以下为项目计划中影响进度…

周赛369(位运算、分类讨论、记忆化搜索==>动态规划、树形DP)

文章目录 周赛369[2917. 找出数组中的 K-or 值](https://leetcode.cn/problems/find-the-k-or-of-an-array/)位运算模拟 [2918. 数组的最小相等和](https://leetcode.cn/problems/minimum-equal-sum-of-two-arrays-after-replacing-zeros/)分类讨论 [2919. 使数组变美的最小增量…

计算机学院的老师们的实际编程能力如何?

计算机学院的老师们的实际编程能力如何&#xff1f; 国内的多数老师基本上就是学术界&#xff0c;工业界&#xff0c;教育界&#xff0c;这三个领域哪个他们都不沾边&#xff0c;几乎就是混日子&#xff0c;顺便能多混点钱就多混点钱的那种。 最近很多小伙伴找我&#xff0c;…

Day18力扣打卡

打卡记录 寻找重复数&#xff08;双指针&#xff09; 链接 Floyd判圈法&#xff0c;先用快慢指针以不同速率进行移动&#xff0c;最终一定会出现相遇点&#xff0c;然后在使一指针从初始开始&#xff0c;两指针再以同步调移动&#xff0c;再次相遇的点一定为循环开始的点位。 …

mysql 中!= 到底走不走索引?

mysql 中! 到底走不走索引&#xff1f; 很多人疑惑! 到底走不走索引&#xff0c; 这里可以肯定的说该操作是可以走索引的&#xff0c;但实际情况中都为啥都不走索引呢&#xff1f; 首先我们要知道走索引与数据量和数据趋势&#xff08;cardinality&#xff09;有很大的关系&…

用于比例方向控制阀的电控模块

比例方向控制阀电控放大器是一种电子装置&#xff0c;其主要功能是对弱电的控制信号进行整形、运算和功率放大&#xff0c;从而驱动比例方向控制阀。用于无位置传感器的比例方向控制阀。 通过控制PWM脉冲的占空比&#xff0c;可以控制比例阀端口的驱动电流&#xff0c;进而达到…

SelectorsHub插件使用教程

一、安装 进入chrome商店进行安装 二、使用SelectorsHub复制xpath 三、检查复制的xpath是否正确 1、右键检查 2、ctrlf&#xff0c;进行查找 3、复制xpath到查找框内 4、可以看出查找出一个元素 四、复制不同xpath的区别 1、copy relative xpath 相对XPath是相对于当前元素…

memtest86 prosite v10.6

passmark官方的memtest86 v10开始支持颗粒级别的坏内存芯片定位了&#xff0c;对于特定的若干种CPU和芯片组的组合&#xff0c;支持这项功能。 当然支持颗粒定位的site版本售价4800美金&#xff0c;是比较贵的。所以网络上出现了破解版的&#xff0c;人才真是。但是鼓励大家支…

运维基础-Docker容器命令部署

Docker基础知识 安装问题-有podmanCentos8使用yum install docker -y时&#xff0c;默认安装的是podman-docker软件安装docker yum list installed | grep dockeryum -y remove xxxxDocker安装配置下载安装docker启动docker&#xff0c;并设置开机启动下载所需镜像 centos镜像进…

精品基于Python的汽车销售趋势分析-爬虫可视化大屏

《[含文档PPT源码等]精品基于Python的汽车销售趋势分析-爬虫》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;python 使用框架&#xff1a;Django 前端技术&…