JavaScript中的各种宽高以及位置总结

在javascript中操作dom节点让其运动的时候,常常会涉及到各种宽高以及位置坐标等概念,如果不能很好地理解这些属性所代表的意义,就不能理解js的运动原理,同时,由于这些属性概念较多,加上浏览器之间

实现方式不同,常常会造成概念混淆,经过研究之后,这里来进行一个总结。

第一部分:DOM对象

1.1只读属性

所谓的只读属性指的是DOM节点的固有属性,该属性只能通过js去获取而不能通过js去设置,而且获取的值是只有数字并不带单位的(px,em等),如下:

1)clientWidth和clientHeight

该属性指的是元素的可视部分宽度和高度,即padding+content,如果没有滚动条,即为元素设定的高度和宽度,如果出现滚动条,滚动条会遮盖元素的宽高,那么该属性就是其本来宽高减去滚动条的宽高

css:

    <style>.one{width: 200px;height: 200px;background: red;border: 1px solid #000000;overflow: auto;}</style>

HTML

<body>
<div class="one">javascript高级应用<br>javascript高级应用<br>javascript高级应用<br>javascript高级应用<br>javascript高级应用<br>javascript高级应用<br>javascript高级应用<br>javascript高级应用<br>javascript高级应用<br>javascript高级应用<br>javascript高级应用<br>javascript高级应用<br>javascript高级应用<br>javascript高级应用<br>javascript高级应用<br>javascript高级应用<br>javascript高级应用<br>javascript高级应用<br>
</div>
</body>

js

<script>window.onload=function(){var oDiv=document.getElementsByTagName('div')[0];console.log(oDiv.clientWidth+":"+oDiv.clientHeight);}
</script>

结果:

clipboard.png

元素本来设定为宽高都是200,即可视部分宽高都是200,但是由于出现了垂直方向的滚动条,占据了可视部分的宽度,所以clientWidth变成了183,而clientHeight依然是200.

2)offsetWidth和offsetHeight

这一对属性指的是元素的border+padding+content的宽度和高度,该属性和其内部的内容是否超出元素大小无关,只和本来设定的border以及width和height有关

css和HTML部分同上,js部分如下:

 <script>window.onload=function(){var oDiv=document.getElementsByTagName('div')[0];console.log(oDiv.offsetWidth+":"+oDiv.offsetHeight);}
</script>

最终结果:

可以看到该属性和clientWidth以及clientHeight相比,多了设定的边框border的宽度和高度。

3)clientTop和clientLeft

这一对属性是用来读取元素的border的宽度和高度的。

css

<style>body{border: 2px solid #000000;}.one{border: 1px solid red;width: 100px;height: 100px;background: red;}
</style>

html

<body>
<div class="one">
</div>
</body>

js

<script>var oDiv=document.getElementsByClassName('one')[0];console.log(oDiv.clientLeft+":"+oDiv.clientTop);
</script>

最终结果:

clipboard.png

 可以看到div的border被设定了1px的宽,这里显示的就是它的宽度

4)offsetLeft和offsetTop

说到这对属性就需要说下offsetParent,所谓offsetParent指的是当前元素的离自己最近的具有定位的(position:absolute或者position:relative)父级元素(不仅仅指的是直接父级元素,只要是它的父元素都可以),该父级元素就是当前元素的offsetParent,如果从该元素向上寻找,找不到这样一个父级元素,那么当前元素的offsetParent就是body元素。而offsetLeft和offsetTop指的是当前元素,相对于其offsetParent左边距离和上边距离,即当前元素的border到包含它的offsetParent的border的距离如下所示:

css

<style>.two{position: relative;width: 200px;height: 200px;border: 1px solid green;}.one {width: 100px;height: 100px;background: red;margin: 20px;border: 1px solid #000000;position: absolute;top:20px;}</style>

HTML

<body>
<div class="two">
<div class="one">
</div>
</div>
</body>

js

<script>var oDiv=document.querySelector('.one');console.log(oDiv.offsetTop+":"+oDiv.offsetLeft);
</script>

最终结果:

clipboard.png

 这里让div.two相对定位,让div.one绝对定位,所以div.two是one的offsetParent,同时,又给div.one加了一个margin为20px,所以这里它的offsetTop为40,offsetLeft 本来为0,但是加上margin为20之后就变成了20.

5)scrollHeight和scrollWidth

顾名思义,这两个属性指的是当元素内部的内容超出其宽度和高度的时候,元素内部内容的实际宽度和高度,需要注意的是,当元素其中内容没有超过其高度或者宽度的时候,该属性是取不到的。

css

<style>.one{width: 100px;height: 100px;overflow: auto;}
</style>

HTML

<body>
<div class="one">我是内容<br>我是内容<br>我是内容<br>我是内容<br>我是内容<br>我是内容<br>我是内容<br>我是内容<br>我是内容<br>我是内容<br>我是内容<br>我是内容<br>我是内容<br>
</div>
</body>

js

<script>var oDiv=document.querySelector('.one');oDiv.onscroll=function(){console.log(this.scrollHeight+":"+this.scrollWidth);}
</script>

最终结果

clipboard.png

 尽管该div的宽高都是100,但是其scrollheight为234显示的是其中内容的实际高度,scrollWidth为83(由于滚动条占据了宽度)

1.2可读可写属性

所谓的可读可写属性指的是不仅能通过js获取该属性的值,还能够通过js为该属性赋值。

1)scrollTop和scrollLeft

这对属性是可读写的,指的是当元素其中的内容超出其宽高的时候,元素被卷起的高度和宽度。

css和html部分同上,js部分如下:

<script>var oDiv=document.querySelector('.one');oDiv.onscroll=function(){console.log(this.scrollTop+":"+this.scrollLeft);}
</script>

最终结果:

clipboard.png

由于拖动了滚动条,scrollTop的属性值一直在增大,而水平方向没有滚动条,所以scrollLeft一直为0.

该属性还可以通过赋值内容自动滚动到某个位置,js如下:

<script>var oDiv=document.querySelector('.one');oDiv.scrollTop=20;oDiv.onscroll=function(){console.log(this.scrollTop+":"+this.scrollLeft);}
</script>

结果如下:

clipboard.png

通过直接设定div的scrollTop,让它直接显示在滚动条在20垂直方向上20的位置。

2)obj.style.*属性

对于一个dom元素,它的style属性返回的是一个对象,这个对象中的任意一个属性是可读写的。如obj.style.top,obj.style.wdith等,在读的时候,他们返回的值常常是带有单位的(如px),同时,对于这种方式,

它只能够获取到该元素的行内样式,而并不能获取到该元素最终计算好的样式,这就是在读取属性值得时候和以上只读属性的区别,要获取计算好的样式,请使用obj.currentstyle(IE)和getComputedStyle(IE之外的浏览器)。另一方面,这些属性能够被赋值,js运动的原理就是通过不断修改这些属性的值而达到其位置改变的,需要注意的是,给这些属性赋值的时候需要带单位的要带上单位,否则不生效。

第二部分 Event对象

在js中,对于元素的运动的操作通常都会涉及到event对象,而event对象也存在很多位置属性,且由于浏览器兼容性问题会导致这些属性间相互混淆,这里一一讲解。

1)clientX和clientY,这对属性是当事件发生时,鼠标点击位置相对于浏览器(可视区)的坐标,即浏览器左上角坐标的(0,0),该属性以浏览器左上角坐标为原点,计算鼠标点击位置距离其左上角的位置,

不管浏览器窗口大小如何变化,都不会影响点击位置的坐标。

js

<script> var oDiv=document.querySelector('.one'); oDiv.οnclick=function(ev){ var evt=ev||event; console.log(evt.clientX+":"+evt.clientY); } </script>

结果:

clipboard.png

2)screenX和screenY是事件发生时鼠标相对于屏幕的坐标,以设备屏幕的左上角为原点,事件发生时鼠标点击的地方即为该点的screenX和screenY值,如下所示:

clipboard.png

可以看到尽管浏览器窗口被缩到很小,但是坐标值却很大,因为是相对于屏幕坐标而不是浏览器的坐标。

3)offsetX和offsetY

这一对属性是指当事件发生时,鼠标点击位置相对于该事件源的位置,即点击该div,以该div左上角为原点来计算鼠标点击位置的坐标,如下所示:

clipboard.png

可以看到,点击该div的靠近左上角处,它的offsetX和offsetY为1,0,需要注意的是,IE,chrome,opera都支持该属性,唯独Firefox不支持该属性,Firefox中与此属性相对应的概念是,event.layerX和event.layerY,所以需要兼容浏览器时,获取鼠标点击位置相对于事件源的坐标的兼容写法为var disX=event.offsetX||event.layerX.

4)pageX和pageY

顾名思义,该属性是事件发生时鼠标点击位置相对于页面的位置,通常浏览器窗口没有出现滚动条时,该属性和event.clientX及event.clientY是等价的,但是当浏览器出现滚动条的时候,pageX通常会大于clientX,因为页面还存在被卷起来的部分的宽度和高度,如下所示:

clipboard.png

由于浏览器出现了垂直和水平的滚动条,所以pageX和pageY大于clientX和clientY。

当浏览器的滚动条没有被拖动或者浏览器没有滚动条的时候,两者是相等的。

clipboard.png

文章转自js中的各种宽高以及位置总结

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

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

相关文章

C# 制作Com组件:java调用.net DLL的方法

本文将详细为大家介绍一个java调用.net DLL的方法&#xff0c;以实现特殊的客户的特殊要求&#xff1a;“在Java项目中必须使用其提供的用.net写的DLL加密机制&#xff01;” 环境与工具&#xff1a; ◆.net framework 3.5 C# ◆java jdk1.5&#xff0c; Tomcat 5.5 ◆jacob-1.…

MySQL 8.0索引合并

简介参考https://dev.mysql.com/doc/refman/8.0/en/index-merge-optimization.html#index-merge-intersection。索引合并是通过多个range类型的扫描并且合并它们的结果集来检索行的。仅合并来自单个表的索引扫描&#xff0c;而不是跨多个表的索引扫描。合并会产生底层扫描的三种…

linux开通80端口命令,Linux iptables开启80端口

Linux下安装好apache的时候访问IP 发现无法访问!以为安装失败了&#xff0c;于是测试apache 监听的端口80#netstat -lnt |grep 80tcp 0 0 :::80 :::* LISTEN安装成功了&#xff01;想到用本机telnet IP 80不通- - 但…

linux匿名页 文件页,文件页和匿名页

文件页和匿名页文件页内存回收, 也就是系统释放掉可以回收的内存, 比如缓存和缓冲区, 就属于可回收内存. 它们在内存管理中, 通常被叫做文件页 (File-backed Page). 大部分文件页, 都可以直接回收, 以后有需要时, 再从磁盘重新读取就可以了.脏页那些被应用程序修改过, 并且暂时…

第十五周学习总结

学习时间15h      代码行数400行博客数2篇学习内容这周主要做了php大作业的项目&#xff0c;添加了购物车和订单&#xff0c;管理员管理订单的功能&#xff0c;主要运用了session来储存纸&#xff0c;再用session时&#xff0c;必须前面添加session_star();且前面不能有输…

科学家研究:生女有撇步 多钙少碰香蕉

&#xff08;联合早报网讯&#xff09;台湾自由时报报道&#xff0c;科学家研究指出&#xff0c;育龄妇女若想生女孩&#xff0c;应该戒吃香蕉&#xff0c;多吃豆类与硬起司&#xff0c;以及排卵前后数天禁欲&#xff1b;要是能恪守上述规范&#xff0c;日后弄瓦而非弄璋的成功…

服务端配置实现AJAX跨域请求

2019独角兽企业重金招聘Python工程师标准>>> 一直以为AJAX跨域是无法逾越的鸿沟&#xff0c;最近发现原来在服务端可以通过发送header信息来允许AJAX跨域请求。 PHP代码示例&#xff1a; header(Access-Control-Allow-Origin:*); header(Access-Control-Allow-Hea…

linux系统的运行定义在,Linux系统运行级管理

运行级的概念来自SystemV运行级别将启动过程分成不同的集合每个集合包含一组脚本当init程序切换运行级到对应的级别时相应的脚本就被触发切换运行级可以通过执行init[级别号]完成(比如在Linux中runlevel代表reboot所以执行init就会引起系统重新启动)下面是一个标准的Linux的/et…

【翻译】怎样使用css制作迷人的button

英文原文&#xff1a;How to make sexy buttons with css 作者&#xff1a;Alex 这是一个教程&#xff0c;作者Alex一步步地叫我们怎样使用css来制作一个迷人的按钮&#xff0c;看后觉得挺好&#xff0c;很想大家都看看&#xff0c;翻译的可能稍有不妥&#xff0c;望谅解…… 这…

猜数游戏,随机目标数字,直到猜中退出

/* 猜数游戏&#xff08;其三&#xff1a;目标数字是0~999的随机数&#xff09;*/#include <time.h> #include <stdio.h> #include <stdlib.h>int main(void) {int no; /* 读取的值 */int ans; /* 目标数字 */srand(time(NULL)); /* 设定随…

Linux内核分析(三)----初识linux内存管理子系统

原文:Linux内核分析&#xff08;三&#xff09;----初识linux内存管理子系统Linux内核分析&#xff08;三&#xff09; 昨天我们对内核模块进行了简单的分析&#xff0c;今天为了让我们今后的分析没有太多障碍&#xff0c;我们今天先简单的分析一下linux的内存管理子系统&#…

linux交叉编译静态,使用静态链接在Linux上交叉编译Windows的GLUT项目

我正在尝试交叉编译这个最小的GLUT程序&#xff1a;#include int main(int argc, char **argv){glutInit(&argc,argv);glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);glutCreateWindow("Cross-compile testing");glutMainLoop();return 0;}我使用的…

Python笔记(十五)_异常处理

try-except语句 try: 被检测代码 except Exception [as reason]: 出现异常后的处理代码 例&#xff1a; >>>try: sum 11 fopen(未定义文件.txt) print(f.read()) f.close except OSError as reason: print(文件出错啦&#xff01;错误原因&#xff1a; str(reason))…

配置左菜单控制点

IsModuleAdmin!"1"&ISSYSTEMDBA!"1"1.判断是否模块管理员 2.判断是否系统管理员转载于:https://www.cnblogs.com/sheme/archive/2010/10/07/1845196.html

为MFC中的ListBox添加水平滚动条

我们知道&#xff0c;MFC中的水平滚动条并不像垂直滚动条那样的智能。当文字超出ListBox的宽度时&#xff0c;水平滚动条并不会自己出现&#xff0c;我们需要手动的调用CListBox中的函数SetHorizontalExtent设置宽度&#xff0c;单位为像素。 我们可以自己添加智能水平滚动条&a…

linux常用高级命令,Linux常用高级文件操作命令

Linux常用高级文件操作命令 cat 查看文本#cat 文件名 打印文件内容到当前屏幕上#cat -n 文件名 显示行号#cat gt;Linux常用高级文件操作命令cat 查看文本#cat 文件名 打印文件内容到当前屏幕上#cat -n 文件名 显示行号#cat > a.txt 可以用这种方法修改或…

java高并发实战Netty+协程(Fiber)|系列1|事件驱动模式和零拷贝

今天开始写一些高并发实战系列。 本系列主要讲两大主流框架&#xff1a; Netty和Quasar(java纤程库) 先介绍netty吧&#xff0c;netty是业界比较成熟的高性能异步NIO框架。 简单来说&#xff0c;它就是对NIO2的封装&#xff0c;但提供了更好用&#xff0c;bug更少的API。 为什么…

诗歌rails 之rails g

http://www.viget.com/extend/rails-3-generators-the-old-faithful/转载于:https://www.cnblogs.com/orez88/articles/1852408.html

桌面级linux推荐,七大顶级桌面比较!Linux平台自由选择

七大顶级Linux桌面&#xff1a;Unity对于开源Linux平台来说&#xff0c;如何选择就是首要解决的问题。通常Linux发行版都有默认的桌面成为你的首选&#xff0c;但目前可供选择的桌面环境种类繁多。特别是Ubuntu系统一个平台就提供9种正式备选版本&#xff0c;且各自拥有不同的桌…

最大子列和问题

问题陈述&#xff1a; 给定N个整数的序列{A1, A2, ... , AN}&#xff0c;求函数ƒ(i, j) max{0, Ai Ai1 ... Aj}(1<i<j<N)的最大值。 问题分析&#xff1a; 求给定数列的最大子列和。 算法设计&#xff1a; 算法1&#xff1a;计算每个子列的和 时间复杂度: T(N) …