JS5-PC端网页特效
常见offset系列属性作用
常见client系列属性作用
常见scroll系列属性作用
封装简单动画函数
写出网页轮播图案例
offset
偏移量,使用offset相关属性可以动态的得到该元素的位置、大小等
- 获得元素距离带有定位父元素的位置
- 获得元素自身的大小
- 注意:返回的数值不带单位
offsetParent: 返回作为该元素带有定位的父级元素,如果父级都没有定位则返回body
offsetWidth:获取元素的宽,包括内边距、边框、内容
offsetHeight:获取元素的高,包括内边距、边框、内容
offsetLeft:获取元素距离左边位置的值,以带有定位的父亲为准,如果没有父亲或者父亲没有定位则相对body
offsetTop;获取元素距离上面位置的值,以带有定位的父亲为准,如果没有父亲或者父亲没有定位则相对body
offset与style区别
- offset可以得到任意样式表的样式值 style只能得到内嵌样式的样式值
- offset得到的是数字型,不带单位 style是字符串带单位
- offset包含整个盒子,style得到的只是width,不包括padding和border
- offset只能读不能写,而width可以赋值
- 因此,读属性值一般用offset,写属性一般用width
案例:获取鼠标在盒子里的坐标
- 获取鼠标在页面内的坐标
- 获取盒子在页面内的坐标
- 相减
var box=document.querySelector('.box');
box.addEventListener('mousemove',function(){//鼠标移动事件
var x=e.pageX-this.offsetLeft;
var y=e.pageY-this.offsetTop;
this.innerHTML='X坐标是'+x+'y坐标是'+y;
})
元素可视区client系列
client是客户端,可动态得到元素边框大小,元素大小等,与offset最大的区别就是不包含边框
clientTop 上边框
clientLeft 左边框
clientWidth
clientHeight 包括padding、内容,不包括边框,返回数值不带单位
立即执行函数
不需要调用立马能够自己执行的函数
(function(){})() 或者 (function(){}())
- 第二个小括号可以看做是调用函数,可以传递参数,外面括号是实参,里面小括号是形参
- 两种方法使用方法一致
- 最大的作用就是独立创建了一个作用域,所有变量都是局部变量,不会有命名冲突
淘宝源码分析
(function flexible(window, document) {
var docEl = document.documentElement
var dpr = window.devicePixelRatio || 1
// adjust body font size
function setBodyFontSize() {
if (document.body) {
document.body.style.fontSize = (12 * dpr) + 'px'
} else {
document.addEventListener('DOMContentLoaded', setBodyFontSize)
}
}
setBodyFontSize();
// set 1rem = viewWidth / 10
function setRemUnit() {
var rem = docEl.clientWidth / 10
docEl.style.fontSize = rem + 'px'
}
setRemUnit()
// reset rem unit on page resize
window.addEventListener('resize', setRemUnit)
window.addEventListener('pageshow', function(e) {
if (e.persisted) {
setRemUnit()
}
})
// detect 0.5px supports
if (dpr >= 2) {
var fakeBody = document.createElement('body')
var testElement = document.createElement('div')
testElement.style.border = '.5px solid transparent'
fakeBody.appendChild(testElement)
docEl.appendChild(fakeBody)
if (testElement.offsetHeight === 1) {
docEl.classList.add('hairlines')
}
docEl.removeChild(fakeBody)
}
}(window, document))
- 前进后退、a标签、刷新都会触发load,但是火狐浏览器使用load事件时存在往返缓存,后退按钮不能刷新页面,可以使用pageshow事件触发,这个事件在页面显示时触发,无论页面是否来自缓存,可以根据事件对象的persisted判断是否缓存中页面触发的pageshow事件,这个事件要给window添加
元素滚动scroll系列
scrollTop: 返回被卷去的上侧距离,返回数值不带单位(隐藏的高度)
scrollLeft: 左侧距离,同上
scrollWidth: 返回自身实际宽度,不含边框,返回数值不带单位,包含内容超出盒子的部分
scrollHeight:高度 同上
scroll事件:
'scroll' 滚动触发的事件
window.pageXOffset:页面被卷曲的头部
兼容性问题:
- 声明了DTD,使用document.documentElement.scrollTop
- 未声明DTD,使用document.body.scrollTop
- 新方法window.pageYOffset和window.pageXOffset,IE9开始支持
兼容性方案(了解)
function getScroll() {
return {
left: window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0,
top: window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0
};
}
三大系列总结
offset包含边框,scroll包括文字超出部分
offset一般用于获取元素位置,client常用与获取元素大小,获取滚动距离一般用scroll
mouseenter和mouseover
mouseover:经过自身盒子会触发,经过子盒子还会触发一次
mouseenter只有经过自身盒子才会触发,因为mouseenter不会冒泡
动画函数封装
动画实现原理
通过定时器setInterval()不断移动盒子位置
- 获取盒子当前位置
- 在盒子当前位置上加移动距离
- 利用定时器不断重复操作
- 加一个结束定时器的条件
- 此元素一定要加定位,因为要使用element.left实现移动
动画函数简单封装
需要传递两个参数,动画对象和移动的距离
可以实现某个对象右移移动到某个位置
function animate(obj,target){
clearInterval(obj.timer)//
obj.timer=setInterval(function(){
if(obj.offsetLeft>=target){
clearInterval(obj.timer);
}
obj.style.left=obj.offsetLeft+1+'px';
},30);
}
- var timer=每次开辟空间浪费资源,且使用obj.timer避免不同调用使用相同的变量timer,因此通过添加属性实现给不同元素添加不同定时器
- 注意要先清除原来的定时器,只保留当前定时器,避免多次触发动画时创建很多定时器造成不正常现象
缓动动画
让元素的运动速度有所变化,最常见的是让速度慢慢减下来
思路:
- 让盒子每次移动的距离慢慢变小
- (目标值-现在的位置)/10 作为每次移动的距离步长即可
- 停止的条件:让当前盒子位置等于目标位置时停止定时器
把每次+1的步长改为慢慢变小的值 即
function animate(obj,target){
clearInterval(obj.timer)//
obj.timer=setInterval(function(){
var step=target-obj.offsetLeft)/10;//计算步长,要注意不要出现小号,还要考虑负值
step>0?Math.ceil(step):Math.floor(step)
if(obj.offsetLeft==target){//修改为等于号
clearInterval(obj.timer);
}
obj.style.left=obj.offsetLeft+step+'px';
},30);
}
为了实现在多个目标间移动,需要考虑步长正负
动画函数添加回调函数(重要)
回调函数原理:函数可以作为一个参数,将这个参数传到另一个函数里,当那个函数执行完之后再执行传进去的这个函数,这个过程称为回调
操作方法:输入添加一个函数作为参数,函数执行写在计时器停止的内容里,即可实现执行完动画后执行回调函数
if(callback){
callback()}
如下代码即可实现运动完毕后盒子变颜色
function animate(obj, target, callback) {
// console.log(callback); callback = function() {} 调用的时候 callback()
// 先清除以前的定时器,只保留当前的一个定时器执行
clearInterval(obj.timer);
obj.timer = setInterval(function() {
// 步长值写到定时器的里面
// 把我们步长值改为整数 不要出现小数的问题
// var step = Math.ceil((target - obj.offsetLeft) / 10);
var step = (target - obj.offsetLeft) / 10;
step = step > 0 ? Math.ceil(step) : Math.floor(step);
if (obj.offsetLeft == target) {
// 停止动画 本质是停止定时器
clearInterval(obj.timer);
// 回调函数写到定时器结束里面
if (callback) {
// 调用函数
callback();
}
}
// 把每次加1 这个步长值改为一个慢慢变小的值 步长公式:(目标值 - 现在的位置) / 10
obj.style.left = obj.offsetLeft + step + 'px';
}, 15);
}
var span = document.querySelector('span');
var btn500 = document.querySelector('.btn500');
var btn800 = document.querySelector('.btn800');
btn500.addEventListener('click', function() {
// 调用函数
animate(span, 500);
})
btn800.addEventListener('click', function() {
// 调用函数
animate(span, 800, function() {
// alert('你好吗');
span.style.backgroundColor = 'red';
});
})
返回顶部
window.scroll(0, 0);//x,y不跟单位直接写数字就好
快速滚动到顶端
编写垂直运动的动画函数,点击后目标设为0(y坐标)
goBack.addEventListener('click', function () {
animate(window, 0);//窗口动画,对象是window
});
function animate(obj, target, callback) {
// console.log(callback); callback = function() {} 调用的时候 callback()
// 先清除以前的定时器,只保留当前的一个定时器执行
clearInterval(obj.timer);
obj.timer = setInterval(function () {
// 步长值写到定时器的里面
// 把我们步长值改为整数 不要出现小数的问题
// var step = Math.ceil((target - obj.offsetLeft) / 10);
var step = (target - window.pageYOffset) / 10;
step = step > 0 ? Math.ceil(step) : Math.floor(step);
if (window.pageYOffset == target) {
// 停止动画 本质是停止定时器
clearInterval(obj.timer);
// 回调函数写到定时器结束里面
callback && callback();//如果有参数传入才会调用callback
}
// 把每次加1 这个步长值改为一个慢慢变小的值 步长公式:(目标值 - 现在的位置) / 10
// obj.style.left = obj.offsetLeft + step + 'px';
window.scroll(0, window.pageYOffset + step);
}, 15);
}
JS5-PC端网页特效的更多相关文章
- offset 、 client 和 scroll - PC端网页特效
1.元素偏移量 offset 系列 1.1 offset 就是偏移量,使用 offset 系列相关属性可以 动态 得到该元素的位置(偏移).大小等. 注意: 1.获得元素距离带有定位父元素的位置 2 ...
- PC端网页特效
元素偏移量offset系列 offset翻译过来就是偏移量,我们使用offset系列相关属性可以动态的得到该元素的位置(偏移),大小等 获得元素距离带有定位父元素的位置 获得元素自身的大小(宽度高度) ...
- JS pc端网页特效
offset offset翻译就是偏移量,可以使用他相关的属性可以动态的得到该元素的位置.大小等等 获得元素距离带有定位父元素的位置 获得元素自己的大小(宽度高度) 注 ...
- 【Javascript Demo】移动端访问PC端网页时跳转到对应的移动端网页
不想通过CSS自适应在PC端和移动端分别显示不同的样式,那么只能通过在移动端访问PC端网页时跳转到对应的移动端网页了,那么怎么跳转呢,网上也有很多文章说明,下面是本人测试有效的方式. 1.效果图 PC ...
- 网络爬虫中Fiddler抓取PC端网页数据包与手机端APP数据包
1 引言 在编写网络爬虫时,第一步(也是极为关键一步)就是对网络的请求(request)和回复(response)进行分析,寻找其中的规律,然后才能通过网络爬虫进行模拟.浏览器大多也自带有调试工具可以 ...
- Java SpringMVC实现PC端网页微信扫码支付完整版
一:前期微信支付扫盲知识 前提条件是已经有申请了微信支付功能的公众号,然后我们需要得到公众号APPID和微信商户号,这个分别在微信公众号和微信支付商家平台上面可以发现.其实在你申请成功支付功能之后,微 ...
- 自适应PC端网页制作使用REM
做一个PC端的网页,设计图是1920X1080的. 要在常见屏上显示正常(比例正确可) 1280X720 1366X768 1440X900 1920X1080 使用了几种办法 1.内容在一屏内显示的 ...
- pc端网页,移动端网页(andorid、ios)离开页面做一个时间存储
如图所示:在一个页面中做了一个倒计时,然后用户想离开页面做其他事情,需求是离开页面之后把时间保存,下一次进来继续的时候时间还是上次离开的时间 第一次我用的事件是: // window.onbefor ...
- 使PC端网页宽度自适应手机屏幕大小
有时候我们会纠结PC页面在手机页面上无法正常显示,超出屏幕,有些内容看不到,现在又了下面的代码,可以做到自适应手机端的屏幕宽度: 在html的<head>中增加一个meta标签: < ...
- PC端网页的基本构成
首先,一个前端最基本的就是排网页,有人会看不起拍页面,认为不就是排一个页面嘛,有啥的,分分钟的事,可是他不知道的是,一个网页中也包含了很多内容,像我们如果不理解margin,padding,会经常对我 ...
随机推荐
- 【1】VScode 中文界面方法-------超简单教程
相关文章: [一]tensorflow安装.常用python镜像源.tensorflow 深度学习强化学习教学 [二]tensorflow调试报错.tensorflow 深度学习强化学习教学 [三]t ...
- Java连接kubernates集群最优雅的两种方式
创建maven工程,pom.xml中引入连接k8s的客户端jar包: <properties> <maven.compiler.source>8</maven.compi ...
- 5个前端开源项目带你在Web上体验Windows
本文来分享五个 yyds 的开源项目,这些项目把 Windows 带到了 Web 平台上.让我们一起感受这些项目带来的回忆和创新,重温 Windows 93.98.XP 和 7 的经典界面,甚至探索现 ...
- 戴尔全球首款6K IPS Black显示器上市:配4K摄像头
戴尔的全球首款6K IPS Black显示器--U3224KB,目前已经上架,价格为3199.99美元(约合人民币22186元). 据介绍,这款显示器采用IPS Black面板,刷新率为60Hz,对比 ...
- 从TF-IDF 到BM25, BM25+,一文彻底理解文本相关度
相关性描述的是⼀个⽂档和查询语句匹配的程度.我们从搜索引擎召回时,肯定希望召回相关性高的数据,那么如何来量化相关度呢. 首先,我们定义,一个文档doc,由多个词语 term 组成. 最早,通过最简单的 ...
- 洛谷P2415 集合求和(数学问题,使用集合子集求和公式)
可以知道对于一个有n个数据的集合,其子集个数有2^n个 至于证明可以这样理解,对于n个数据,其子集就是对数据进行组和,而对于每个位置上的数据,组合时仅有两种状态即有此数据或无此数据,也就是有两种可能, ...
- .NET Core开发实战(第2课:内容综述)--学习笔记
02 | 内容综述 课程目标 掌握 .NET Core 微服务架构的最佳实践 成长为一个具备良好架构设计能力的架构师 课程内容 第一部分 .NET Core 的必备知识 第二部分 .NET Core ...
- 转载洛谷:23.08.19 普及模拟1 T1
Past 题目描述 所有人,都有一段支离破碎的过去. 你有\(n\)段过去的经历,有时顺利,有时不顺,于是你用一个评价值\(a_i\)来描述你的第\(i\)段经历,它们构成了长度为\(n\)的序列\( ...
- RedHat Enterprise Linux 8.0终端命令界面字体放大缩小
一.打开RedHat的终端命令界面. 二.放大界面中字体,Ctrl + Shit + "+" 三.缩小界面中字体,Ctrl + "-"
- [SpringBoot][Maven]关于maven pom文件的packaging属性
关于maven pom文件的packaging属性 前几天在调试源码运行程序的时候,因为将项目中pom文件的packaging属性用错导致源码包无法引入使用而报Bean注入错误,在此进行总结整理记录. ...