【第五部分 | JS WebAPI】6:PC端网页特效与本地存储

news2024/11/29 4:46:05

目录

| 概述

| PC端网页特效之三大系列

1-1 elementObj . offsetXXX 属性

1-2 elementObj . style 和 offset 的区别

1-3 案例:获取鼠标在某个盒子内的位置

2-1 elementObj . clientXXX 属性

3-1 elementObj . scrollXXX 属性

三大系列总结

| 动画函数封装

mouseover 和 mouseenter 的区别

动画原理

动画的缓动、变速效果

回调函数

把动画文件装入 js 内

| 本地存储

概述

window.sessionStorage

window.localStorage

案例:记住用户名


| 概述

  • 学习本章后,可以通过JS制作一些网页变化的动画、特效等

  • 案例:PC、PE端轮播图(请参考资源代码及课件)

  • 网页特效分为 PC、PE端网页特效

  • 目前这部分知识点实用性并不高,因此只做简单介绍,日后有需要再回来学

在此,仅简介一下这一章内容的目录


| PC端网页特效之三大系列

1-1 elementObj . offsetXXX 属性

作用1:获取该元素相对于【有定位的父元素】的偏移量(位置) offsetTop oddsetLeft

作用2:获取元素自身的宽度和高度 offsetWidth offsetHeight

作用3:获取有定位的父元素对象 offsetParent

语法

 

代码示例

<!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>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        
        .father {
            /* position: relative; */
            width: 200px;
            height: 200px;
            background-color: pink;
            margin: 150px;
        }
        
        .son {
            width: 100px;
            height: 100px;
            background-color: purple;
            margin-left: 45px;
        }
        
        .w {
            height: 200px;
            background-color: skyblue;
            margin: 0 auto 200px;
            padding: 10px;
            border: 15px solid red;
        }
    </style>
</head>

<body>
    <div class="father">
        <div class="son"></div>
    </div>
    <div class="w"></div>
    <script>
        // offset 系列
        var father = document.querySelector('.father');
        var son = document.querySelector('.son');
        // 1.可以得到元素的偏移 位置 返回的不带单位的数值  
        console.log(father.offsetTop);
        console.log(father.offsetLeft);
        // 它以带有定位的父亲为准  如果么有父亲或者父亲没有定位 则以 body 为准
        console.log(son.offsetLeft);
        var w = document.querySelector('.w');
        // 2.可以得到元素的大小 宽度和高度 是包含padding + border + width 
        console.log(w.offsetWidth);
        console.log(w.offsetHeight);
        // 3. 返回带有定位的父亲 否则返回的是body
        console.log(son.offsetParent); // 返回带有定位的父亲 否则返回的是body
        console.log(son.parentNode); // 返回父亲 是最近一级的父亲 亲爸爸 不管父亲有没有定位
    </script>
</body>

</html>

 


1-2 elementObj . style 和 offset 的区别


1-3 案例:获取鼠标在某个盒子内的位置

思路

 

代码

var box = document.querySelector('.box');
box.addEventListener('mousemove', function(e) {
	var x = e.pageX - this.offsetLeft;
	var y = e.pageY - this.offsetTop;
	this.innerHTML = 'x坐标是' + x + ' y坐标是' + y;
})

2-1 elementObj . clientXXX 属性

作用1:获取【元素可视区】的相关信息。 clientTop clientLeft clientWidth clientHeight(后两个用的最多)

区别:clientWidth 、 clientHieght 和 offsetWidth、offsetHeight 的最大区别:获得的偏移量【不包含边框!!】(但是包含padding)


3-1 elementObj . scrollXXX 属性

作用:若内容超出了盒子,则添加overflow: auto会有滚动条。 scroll最主要的作用就是:得到被滚去的内容的距离。 因此 scrollTop scrollLeft 用的最多

 

scrollHeight、scrollWidth、scrollTop 的区别:(红色为实际盒子大小,添加了 overflow: auto 滚动条)

 

说明一下:scrollWidth 和 clientWidth 都能得到自身的宽度和高度,但是它们有区别

scrollHeight 返回的是自身实际的宽度:若内容超出了盒子,则会计算内容实际的高度;而clientHeight 只返回盒子本身的高度。 宽度同理


三大系列总结

  • offset、client、scroll 三大系列的作用:均可以获取自身的一些属性,并且也有自己特色的方法

  • 首先,总结一下三者获取自身属性时的区别

然后,总结一下三者各自特色的方法

 


| 动画函数封装

mouseover 和 mouseenter 的区别

 

示例:

 

鼠标经过粉色盒子(父盒子),触发了事件;经过紫色盒子(子盒子),没触发事件。

可以验证,若把 mouseenter 换成 mouseover,则会 鼠标经过粉色盒子(父盒子),会触发事件;经过紫色盒子(子盒子),也触发事件。


动画原理

原理

  • 通过定时器,绘制每一个关键帧,每一帧变一点点位置

  • 需要确定的有:动画移动的对象元素、以及元素要移动的终点(目标位置)

  • 注意:一定要给子元素加定位(子绝父相),否则 div.style.left = div.offsetLeft + x + 'px' 会报错

  • 需要注意:div.offsetLeft 得到的只是一个数值,不带单位,需要我们自己加上

代码示例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .box {
            /* 一定要有定位,才能使用left属性 */
            position: absolute;
            
            width: 100px;
            height: 100px;
            background-color: pink;
        }
    </style>
    <script>
        window.addEventListener('load',function(){

            var box = document.querySelector('.box');
            var time = window.setInterval(function(){
                box.style.left = box.offsetLeft + 1 + 'px';
            },10)

        })
    </script>
</head>
<body>
    <div class="box"></div>
</body>
</html>

 上述代码可以封装成动画函数 animate(obj , target)

 <script>
        // 简单动画函数封装obj目标对象 target 目标位置
        function animate(obj, target) {
            var timer = setInterval(function() {
                if (obj.offsetLeft >= target) {
                    // 停止动画 本质是停止定时器
                    clearInterval(timer);
                }
                obj.style.left = obj.offsetLeft + 1 + 'px';

            }, 30);
        }

        var div = document.querySelector('div');
        var span = document.querySelector('span');
        // 调用函数
        animate(div, 300);
        animate(span, 200);
    </script>

 

 上述函数,可以优化一下,利用【JS的对象可以动态添加属性】这一特点,省去了因声明计数器而导致的内存占用

 <script>
        // 简单动画函数封装obj目标对象 target 目标位置
        function animate(obj, target) {
     		//把 var times 改为 obj.times 动态添加属性
            obj.times = setInterval(function() {
                if (obj.offsetLeft >= target) {
                    // 停止动画 本质是停止定时器
                    clearInterval(timer);
                }
                obj.style.left = obj.offsetLeft + 1 + 'px';

            }, 30);
        }

        var div = document.querySelector('div');
        var span = document.querySelector('span');
        // 调用函数
        animate(div, 300);
        animate(span, 200);
    </script>

 


动画的缓动、变速效果

变速效果

  • 关键在于我们每一次 obj.style.left = XXX 的表达式是如何设置的

  • 比如运动越来越慢的表达式: obj.style.left = obj.offsetLeft + (target - obj.offsetLeft) / 10

  • 更多公式请去百度

元素在某个位置往返运动

  • 添加 if 判断,如果大于某个位置则 obj.style.left 减少,反之则增加


回调函数

应用场景

有时候想让动画(即计时器)结束之后,再执行某些函数

方法:关键代码:定义函数f,然后作为参数传入animate封装动画函数,当动画结束的时候 再在结束的方法内调用函数

			//动画(封装函数)
			//关键代码:定义函数f,然后作为参数传入animate封装动画函数,当动画结束的时候 再在结束的方法内调用函数
            function animate(obj , target , f){
                obj.times = window.setInterval(function(){
                    if(obj.offsetLeft > target){
                        window.clearInterval(obj.times);
                        //动画结束之后,再调用函数
                        f();
                    }else{
                        obj.style.left = box.offsetLeft + 1 + 'px';
                    }
                },10)
            }

 

 代码示例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>

        .box {
            /* 一定要有定位,才能使用left属性 */
            position: absolute;
            
            
            width: 100px;
            height: 100px;
            background-color: pink;
        }

        button {
            display: block;
            margin: 20px 0;
        }
    </style>
    <script>
        window.addEventListener('load',function(){

            //动画(封装函数)
            function animate(obj , target , f){
                obj.times = window.setInterval(function(){
                    if(obj.offsetLeft > target){
                        window.clearInterval(obj.times);
                        //动画结束之后,再调用函数
                        f();
                    }else{
                        obj.style.left = box.offsetLeft + 1 + 'px';
                    }
                },10)
            }

            //按钮
            var btn = document.querySelector('button');
            var box = document.querySelector('.box');
            btn.addEventListener('click',function(){
                animate(box , 300 , function(){
                    //回调函数
                    alert('动完啦');
                })
            })

        })
    </script>
</head>
<body>
    <button>动起来</button>
    <div class="box"></div>
    
    
    
    
</body>
</html>

把动画文件装入 js 内

| 本地存储

概述

 


window.sessionStorage

数据会被存放在当前窗口,只要不关闭,则数据都会存在(如刷新等,数据也不会消失)

特点和语法

 

代码示例 


window.localStorage

数据会被永久保存在用户本地浏览器中,除非手动删除,否则无论是刷新、关闭页面,数据都会保留

需要注意:这个数据是保存在浏览器中,只在同一浏览器中才共享。若用户换了浏览器,则数据就无法获取啦


 

代码示例

 


案例:记住用户名

思路:

① 把数据存起来,用到本地存储

② 关闭页面,也可以显示用户名,所以用到localStorage

③ 打开页面,先判断是否有这个用户名,如果有,就在表单里面显示用户名,并且勾选复选框

④ 当复选框发生改变的时候 change事件

⑤ 如果勾选,就存储,否则就移除

代码:

<!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>Document</title>
</head>

<body>
    <input type="text" id="username"> <input type="checkbox" name="" id="remember"> 记住用户名
    <script>
        var username = document.querySelector('#username');
        var remember = document.querySelector('#remember');
		//页面进入的时候自动执行。如果已经存储了用户数据,则执行这个代码
        if (localStorage.getItem('username')) {
            username.value = localStorage.getItem('username');
            remember.checked = true;
        }
		//如果用户点击了复选框,则进行判断:用户是取消”记住“,还是勾选”记住“
        remember.addEventListener('change', function() {
            if (this.checked) {
                localStorage.setItem('username', username.value)
            } else {
                localStorage.removeItem('username');
            }
        })
    </script>
</body>

 

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

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

相关文章

LeetCode1005. K 次取反后最大化的数组和

1 题目描述 给你一个整数数组 nums 和一个整数 k &#xff0c;按以下方法修改该数组&#xff1a; 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。 重复这个过程恰好 k 次。可以多次选择同一个下标 i 。 以这种方式修改数组后&#xff0c;返回数组 可能的最大和 。 示例 1&a…

弹簧(压簧)力度计算与设计

弹簧&#xff08;压簧&#xff09;力度计算与设计弹簧的种类什么是弹性系数弹簧的材料常用材料与用途弹性系数与哪些因素有关弹簧力度设计与计算弹簧收尾设计弹簧是一种利用弹性来工作的机械零件。一般用弹簧钢制成。利用它的弹性可以控制机件的运动、缓和冲击或震动、储蓄能量…

[附源码]java毕业设计校园疫情防控管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

BMN:Boundary-matching network for temporal action proposal generation

Video Analysis 相关领域解读之Temporal Action Detection(时序行为检测) - 知乎本文投稿于 极视角 公众号&#xff0c;链接为 文章链接. 上一篇 Video Analysis相关领域解读之Action Recognition(行为识别) - 知乎专栏介绍了 Action Recognition 领域的研究进展。Action Recog…

转铁蛋白修饰纳米载体(纳米颗粒,介孔硅,四氧化三铁,二氧化硅等)

转铁蛋白又名运铁蛋白&#xff08;Transferrin&#xff0c;TRF、Tf&#xff09;&#xff0c;负责运载由消化管吸收的铁和由红细胞降解释放的铁。以三价铁复合物&#xff08;Tf-Fe3&#xff09;的形式进入骨髓中&#xff0c;供成熟红细胞的生成。转铁蛋白主要存在于血浆中&#…

vue 动态表单优秀案例

不同的下拉框 就会显示不同的表单&#xff0c;表单配置是灵活匹配的&#xff0c;还有就是 一定要知道都有哪些类型的数据做到兼容起来。 app.vue <template><a-select v-model:value"FormDataSelect" :options"FormDataSelectList" /><a-fo…

相控阵天线(五):稀疏阵列(概率密度稀疏法、多阶密度加权法、迭代傅里叶(IFT)法)

目录简介稀疏线阵概率密度稀疏法多阶密度加权法迭代傅里叶(IFT)综合法对称分布稀疏阵列建模仿真简介 稀疏阵是在不明显改变阵列波束宽度的情况下去掉一些阵元&#xff0c;可以用满阵列的几分之一的阵元构造一个减低了增益的高方向性阵列&#xff0c;符合大型阵列设计中降低成本…

【C++】哈希算法

目录 1.哈希映射 1.1哈希的概念 1.2哈希冲突 1.3哈希函数 1.31直接定值法 1.32除留余数法 2.解决哈希冲突 2.1闭散列法 2.11线性探测 2.12二次探测 3代码实现 3.1状态&#xff1a; 3.2创建哈希节点类 3.21哈希表扩容&#xff1a; 3.3数据插入 3.4查找与删除 3.…

数据可视化之设计经验分享:轻松三步教你学会制作数据可视化大屏思路

当看到屏幕上一个个炫酷&#xff0c;具有科技感的数据大屏时&#xff0c;很多人都会好奇这是怎么做出来的。自己在制作大屏时明明按着需求做了&#xff0c;可是做出来后总是觉得画面不好看&#xff0c;不够炫&#xff0c;感觉很糟糕。 那要如何才能设计那样的数据可视化大屏呢…

JS 的新一代日期/时间 API Temporal

众所周知&#xff0c;JS的Date是出了名的难用&#xff0c;一直以来我们都在使用momentjs&#xff0c;dayjs等第三方库来处理日期和时间格式&#xff0c;于是 TC39 组织开始了对 Date 的升级改造&#xff0c;他们找到了 moment.js 库的作者&#xff0c;Maggie &#xff0c;由她来…

【深度学习】实验5答案:滴滴出行-交通场景目标检测

DL_class 学堂在线《深度学习》实验课代码报告&#xff08;其中实验1和实验6有配套PPT&#xff09;&#xff0c;授课老师为胡晓林老师。课程链接&#xff1a;https://www.xuetangx.com/training/DP080910033751/619488?channeli.area.manual_search。 持续更新中。 所有代码…

代码随想录刷题| 01背包理论基础 LeetCode 416. 分割等和子集

目录 01背包理论基础 二维dp数组 1、确定dp数组以及下标的含义 2、确定递推公式 3、dp数组如何初始化 4、确定遍历顺序 5、打印dp数组 最终代码 一维dp数组 1、确定dp数组的定义 2、确定递推公式 3、初始化dp数组 4、遍历顺序 5、打印dp数组 最终代码 416. 分割…

一次搞懂SpringBoot核心原理:自动配置、事件驱动、Condition

前言 SpringBoot是Spring的包装&#xff0c;通过自动配置使得SpringBoot可以做到开箱即用&#xff0c;上手成本非常低&#xff0c;但是学习其实现原理的成本大大增加&#xff0c;需要先了解熟悉Spring原理。如果还不清楚Spring原理的&#xff0c;可以先查看博主之前的文章&…

Vue实现简易购物车功能

用Vue写一个列表案例&#xff0c;页面布局什么的dom&#xff0c;不需要自己事先全部排好&#xff0c;而是通过li遍历&#xff0c;把数据遍历出来&#xff1b;先定义好div标签&#xff0c;li根据数组的长度datalist进行遍历&#xff0c;图片的链接要用“&#xff1a;”&#xff…

算法设计与分析 SCAU8597 石子划分问题

8597 石子划分问题 时间限制:1000MS 代码长度限制:10KB 提交次数:0 通过次数:0 题型: 编程题 语言: G;GCC;VC;JAVA Description 给定n个石子&#xff0c;其重量分别为a1,a2,a3,…,an。 要求将其划分为m份&#xff0c;每一份的划分费用定义为这份石子中最大重量与最小重量差…

nRF52832闪存FDS使用(SDK17.1.0)

陈拓 2022/10/29-2022/11/22 1. 简介 对于Nordic芯片内部FLASH存储管理有两种方式&#xff0c;FS (Flash Storage)和FDS (Flash Data Storage) 。FS是FDS的底层实现&#xff0c;FDS是对FS的封装&#xff0c;使用更容易。 Flash Data Storage&#xff08;FDS&#xff09;模块是…

容器与容器编排系统

Docker公司发明的「容器镜像」技术&#xff0c;创造性地解决了应用打包的难题。改变了一大批诸如容器编排、服务网格和云原生等技术&#xff0c;深刻影响了云计算领域的技术方向。 一、Docker 容器技术 概括起来&#xff0c;Docker 容器技术有3个核心概念容器、镜像和镜像仓库…

当3A射击游戏遇上Play to Earn,暴躁兔带你了解MetalCore

MetalCore是一款具有机甲风格的战斗射击类的Play to Earn & Free to Play游戏&#xff0c;暴躁兔对这款游戏之前也有做过分析&#xff0c;MetalCore在近期启动了alpha开放世界测试&#xff0c;之前有NFT的玩家获得key code之后可以在PC端下载后进行体验。alpha阶段在10月20…

如何使IOT2050成为PN设备

Profinet Driver&#xff08;PNDriver&#xff09;从V2.3开始支持IO设备(IOD)功能&#xff0c;支持通用网络接口和Linux操作系统&#xff0c;最小支持2ms的通讯周期。本文介绍如何编译PNDriver并运行在IOT2050上。 1. 编译PNDriver 因为PNDriver只支持32位模式&#xff0c;因…

TiDB ——TiKV

TiDB ——TiKV TiKV持久化 TiKV架构和作用TiKV数据持久化和读取TiKV如何提供MVCC和分布式事务支持TiKV基于Raft算法的分布式一致性TiKV的coprocessor TiKV架构和作用 数据持久化分布式一致性MVCC分步式事务Coprocessor RocksDB 单机持久化引擎&#xff0c;单机key-value的…