使用原生JS定位网页元素

摘要:
当用户的浏览器窗口太小而无法完全显示时,添加滚动条;当用户的浏览器窗口太大时,将vp宽度放大到浏览器窗口宽度的大小,然后将网页渲染为vp。对于具有百分比的元素,不要放大具有绝对单位值的元素,最后将vp放入浏览器窗口,这是布局意义上的放大。)此外,在手机上,如果网页的宽度大于wdw设置的值,则vp的宽度将等于网页的宽度。渲染后,将其放置在浏览器窗口中并添加水平滚动条。
约定:1.<meta name="viewport" content="width=device-width">这种标记简称"wdw"="width=device-width"
约定:2.viewport简称vp
约定:3.常用的属性会有“★”标志
都是只读属性!
其中Chrome或FF没通过的属性标记(未实现)
window对象:
1.★innerHeight:文档(网页)显示区的高度,以像素计。(这里的宽度和高度不包括菜单栏、工具栏以及滚动条等的高度)
2.★innerWidth
对于手机浏览器来说,innerWidth计算的是vp宽度,当没有wdw时候,iphone7的默认vp是980px,所以其innerWidth也是980px;而当加上wdw时,innerWidth值会变成375px,这个值就是wdw的值。(我们认为PC浏览器的vp是个不固定的值,它随着网页宽高的变化而1:1地变化,例如网页900*750px,那么浏览器自动把vp变成900*750px,然后在vp中渲染这个网页,再把vp放入浏览器窗口中给用户看。遇到用户浏览器窗口太小不能完全显示时,则加上滚动条;遇到用户浏览器窗口过大时,放大vp宽至浏览器窗口宽度大小,然后把网页渲染进vp,对于那些百分数的元素放大,对于那些绝对单位值的元素不做放大,最后把vp放入浏览器窗口中,这是布局意义上的放大)
另外,在手机上,如果一网页宽大于wdw设置的值,那么vp的width会等于该网页的宽,渲染完成之后,放入浏览器窗口,会加上水平滚动条。

所以总结一下wdw的所有情况:(约定:网页实际宽简称wtw = webpage true width;不存在wdw时vp宽 = 默认值,如980px;手机浏览器窗口 = mbw = mobile browser window)
一定要时刻记得,wdw用来设置vp的宽,但最后不一定相等!
wtw = wdw:网页刚好完全渲染到vp中,然后vp以1:1放到mbw中
wtw > wdw:vp宽将不等于wdw,它会按照wtw宽适当增加,然后以新宽度渲染网页,最后放入mbw中,但是因为mbw的宽比vp小,所以会加上水平滚动条
wtw < wdw:网页完全渲染到vp中,对于那些设置百分数之类属性的元素会占有更多的空间来补满多出的vp宽,而绝对单位的值的那些元素不做任何放大

3.outerHeight:整个浏览器的高度
4.★pageXOffset pageYOffset(对于整个窗口来说,要对于具体某个元素请看DOMElement对象中的有关属性)

screen对象:
1.availHeight:浏览器可用的屏幕高度,不包括底部任务栏
2.availWidth
3.(未实现)deviceXDPI:屏幕的每英寸水平点数
4.(未实现)deviceYDPI
5.height:屏幕的总高度,相对于availHeight来说这个属性包含了任务栏
6.其值和availWidth一样
7.colorDepth:色彩深度,即俗称的颜色多少位(24位就是真彩色)
8.pexelDepth:像素深度
9.(未实现)updateInterval屏幕的刷新率

DOMElement对象:
1.★clientHeight:元素的显示高度(包括内边距,不含边框和外边距)
2.★clientWidth:
对于PC浏览器,它对于网页显示都是1:1的,所以clientWidth获取的总是元素实际的宽度,但是手机浏览器实际上是把网页渲染在vp上再放入浏览器的可见区域中,所以你获取的是元素的实际宽度,但事实上显示出来的宽度要小,因为他已经被缩放过了。
有如下案例:(页面只存在一个div元素,宽高都为40px)
对于iphone7默认vp的宽为980px,那么
不加wdw:document.body.clientWidth=980-8*2=974px(这个获取的是vp宽!),这时获取div的clientWidth是40px,这个值是不会变的,因为就是元素本身的宽度,但是手机上显示出来的显示宽度为22px
加上wdw:document.body.clientWidth=375-8*2=359px,说明这个手机的网页窗口显示宽度为375px,这时候的div显示的宽度是40px(你要知道为什么要设置vp == 手机浏览器窗口大小,就是为了不缩放网页)
3.offsetHeight:clientHeight + 边框
4.offsetWidth
5.offsetTop:元素的上外边框至offsetParent的上内边框之间的像素
6.offsetLeft
7.offsetParent:返回该元素最近的定位父元素
前言:对于一个绝对定位元素,如果一直到body(包括body)都没有在它所有父元素中发现定位(绝对和相对)属性,即该元素不存在定位父元素,那么他将会按照浏览器窗口左上角定位。一般body不设置定位属性(绝对、相对和固定),所以对于offsetParent来说如果返回body,那该元素没有定位父元素,实际上对于没有定位父元素的元素其值应该返回null而不是body。

1.fixed定位元素,返回null(但在ff中返回body,这不符合标准),因为它相对于浏览器窗口定位,对于fixed元素获取的offsetTop和offsetLeft其实就是它的top和left值
2.body的offsetParent永远是null(chrome和ff都是null,测试通过),对body获取其offsetTop和offsetLeft获取的值是相对于浏览器窗口左上角定位
3.static元素永远是最近的拥有relative或absolute的父元素,如果父元素都不存在定位则返回body(实际上应该返回null,表示没有定位父元素,要按照浏览器窗口定位,但是chrome和ff都返回body),这时(这里指如果时的情况)该元素的offsetTop和offsetLeft值是相对于浏览器窗口左上角定位而不是根据返回的body元素进行定位,否则如果存在父元素有定位属性,那么offsetTop和offsetLeft返回的是该父元素左上角定位的值(以自己的边框外部到定位父元素的包括内部)
3.absolute定位元素遵循css定位布局,即最近的拥有relative或absolute的父元素,如果不存在,那么返回body,offsetTop和offsetLeft以浏览器窗口左上角定位
4.relative在css定位布局中不存在定位父元素,但是这里它的offsetParent还是最近的父级定位元素(relative和absolute),如果不存在,返回body,并且offsetTop和offsetLeft以浏览器窗口左上角定位
5.对于absolute & relative,如果父元素都没有定位(绝对和相对)那么就是body,并且offsetTop和offsetLeft以浏览器窗口左上角定位

总结:对于DOMObj.offsetParent返回的值,浏览器不会管DOMObj是static还是absolute还是relative,如果它有定位父元素,那么按照定位父元素左上角定位,否则没有定位父元素的话,那么返回body,并且按照浏览器左上角定位;对于fixed,offsetTop和offsetLeft就是其top和left值。
8.scrollHeight:元素的实际高度(包括内边距,不含边框和外边距)(与clientHeight区别在于:例如一个textarea,宽度为100px,边框宽度1px,当文字太多时显示水平滚动条,这时clientWidth=102px,而scrollWidth=102px + 滚动条滚出去的宽度)
9.scrollWidth
10.scrollLeft:元素(滚动条)滚出的像素
11.scrollTop:scrollHeight=scrollTop+clientHeight

总结:
获取一个元素在窗口左上角定位的信息:
(JS)getBoundingClientRect()
(JQ)offset()
获取一个元素的宽高信息:
(JS)clientWidth clientHeight
说明:包含内边距,不含边框和外边距
(JQ)width() height() innerWidth() innerHeight() outerWidth(false) outerHeight(false)
说明:前两个不含内边距、边框、外边距;中间两个包含内边距,不含边框,外边距;后两个包含内边距,边框,如果为真也会包含外边距
获取鼠标点击位置:
(JS)event.pageX pageY clientX clientY screenX screenY x y
获取触摸点位置:
(JS)event.touches[0].pageX pageY clientX clientY screenX screenY

免责声明:文章转载自《使用原生JS定位网页元素》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Java实现 LeetCode 30 串联所有单词的子串Qt刷新机制的一些总结(Qt内部画的时候是相当于画在后台一个对象里,然后在刷新的时候调用bitblt统一画,调用window的api并不会影响到后面的那个对象)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

浏览器滚动条的参数总结

有朋友常提关于IE滚动条的问题,特总结该贴。简单地介绍一下涉及浏览器滚动条的样式表内容(某些样式需ie5.5+才能支持):1.overflow内容溢出时的设置(设定被设定对象是否显示滚动条)    overflow-x水平方向内容溢出时的设置    overflow-y垂直方向内容溢出时的设置    以上三个属性设置的值为visible(默认值)、scro...

Scrollbar中滚动条的设置

  insideOverlay  默认值,表示在padding区域内并且覆盖在view上 insideInset 表示在padding区域内并且插入在view后面 outsideOverlay 表示在padding区域外并且覆盖在view上,推荐这个 outsideInset 表示在padding区域外并且插入在view后面 out...

CSS3自定义滚动条样式

自定义滚动条实现 此部分针对webkit内核的浏览器,使用伪类来改变滚动条的默认样式,详情如下: 滚动条组成部分 1. ::-webkit-scrollbar 滚动条整体部分 2. ::-webkit-scrollbar-thumb 滚动条里面的小方块,能向上向下移动(或向左向右移动) 3. ::-webkit-scrollbar-track 滚动条的轨...

CSS3 制作一个边框向周围散开的按钮效果

分析 主要还是运用CSS3的transition, animation, transform还有渐变背景等特性。 由于按钮在鼠标进入时有不同的样式,所以要对其:hover状态运用另外的背景样式 通过对按钮的:after状态添加一个内容为空的元素,并给其一个边框,这样在鼠标进入后我们让这个隐藏的空元素变大直到淡出,就得到我们看到的效果了 构建基本按钮样...

DIV Scroll属性

DIV Scroll属性详解,为DIV层打造不同的滚动条。 一、scrollbar属性、样式详解1.overflow内容溢出时的设置(设定被设定对象是否显示滚动条) overflow-x水平方向内容溢出时的设置 overflow-y垂直方向内容溢出时的设置 以上三个属性设置的值为visible(默认值)、scroll(出现滚动条)、hidden(隐藏)、a...

js的style.left与style.offsetLeft解析

一,对于offsetLeft累属性: offsetLeft:元素的左外边框至包含元素的左内边框之间的像素距离。 offsetTop:元素的上外边框至包含元素的上内边框之间的像素距离。 二,如果父div的position定义为relative,子div的position定义为absolute,那么子div的style.left的值是相对于父div的值。 这同...