JavaScript中的各种宽高属性的实现


Posted in Javascript onMay 08, 2020

在js中,存在着N多的关于高度和宽度的属性,比如:clientHeight、offsetHeight、scrollHeight、availHeight、scrollLeft、scrollTop、style.height、innerHeight、outerHeight、scree.height等等......这么多,傻傻分不清也正常啊。

本文的目标:

  1. 理清js及jquery的各种width和height
  2. 对width和高度做一些实际的应用

window和document

首先我们来高清两个概念:

  1. window和document的区别是什么?
  2. window.location和document.location是一样吗?

第一个问题:

  1. Window对象表示浏览器中打开的窗口;window对象可以省略。比如alert()、window.alert()。
  2. Document对象是Window对象的一部分。那么document.body 我们可以写成window.document.body;浏览器的HTML文档成为Document对象。

第二问题:
window对象的location属性引用的是Location对象,表示该窗口中当前显示文档的URL。
document的对象的location属性也是引用了Location对象。
那意思是:

window.location === document.location; //true

在通常情况下一样,frame也是一样

与window相关的宽高介绍

与window相关的宽高有一下几个:

  1. window.innerWidth,通过字面意思我们知道这是一个内部的宽度
  2. window.innerHeight,内部的高度
  3. window.outWidth,外部的宽度
  4. window.outHeight,外部的高度

window.innerHeight和window.outHeight

JavaScript中的各种宽高属性的实现

我发现在Windows 10下Chrome和360安全浏览器不一样、、、、(后面代码测试部分)

window.innerWidth和window.outWidth

JavaScript中的各种宽高属性的实现

挂靠在window下的宽高还有window.screen, window.screen包含有关用户屏幕的信息。它包括:

  • window.screen.width
  • window.screen.height
  • window.screen.availHeight
  • window.screen.availWidth
  • window.screenTop
  • window.screenLeft

图解

JavaScript中的各种宽高属性的实现

JavaScript中的各种宽高属性的实现

window相关宽高代码演示

演示代码:

console.log("innerWidth=",innerWidth);
console.log("innerHeight=",innerHeight);
console.log("outerWidth=",outerWidth);
console.log("outerHeight=",outerHeight);

Chrome浏览器下效果

JavaScript中的各种宽高属性的实现

代码:

console.info("screen.width=",screen.width);
console.info("screen.height=",screen.height);
console.info("screen.availWidth=",screen.availWidth);
console.info("screen.availHeight=",screen.availHeight);

在Chrome浏览器下效果

JavaScript中的各种宽高属性的实现

window相关宽高浏览器兼容问题

innerHeight和outerHeight是不支持IE9以下版本的,而screen系列则不存在兼容问题。

document下面client相关宽高介绍

docment下有三类属性:

  • 与client相关的宽高
  • 与offset相关的宽高
  • 与scroll相关的宽高

与client相关的宽高

与client相关的宽高又有如下几个属性:

  • document.body.clientWidth
  • document.body.clientHeight
  • document.body.clientLeft
  • document.body.clientTop

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

我们来看如下代码:

body{
   border: 20px solid #000;
   margin: 10px;
   padding: 40px;
   background: #eee;
   height: 350px;
   width: 500px;
   overflow: scroll;
}

console.log(document.body.clientHeight);  //430(padding*2+height)
console.log(document.body.clientWidth);   //580(padding*2+width)

我们再看下面的代码:

#mydiv{
   width: 200px;
   height: 200px;
   background: red;
   border: 1px solid #000;
   overflow: auto;
}

在DIV中添加文字知道出现滚动轴,这时候

var mydiv = document.getElementById("mydiv");
console.log("mydiv.clientHeight=",mydiv.clientHeight);  // 200
console.log("mydiv.clientWidth=",mydiv.clientWidth);   // 183(减去了滚动条的宽度)

而在Mac系统下,滚动条不占高度,这时候client的宽度还是200.

总结

  • 假入无padding无滚动条,clientWidth=style.width
  • 假如有padding无滚动轴,clientWidth=style.width+style.padding*2
  • 假如有padding有滚动,且滚动是显示的,clientWidth=style.width+style.padding*2-滚动轴宽度

clientLeft和clientTop

这两个返回的是元素周围边框的厚度,如果不指定一个边框或者不定位该元素,他的值就是0.

我们还是以body为例:

body{
   border: 20px solid #000;
   margin: 10px;
   padding: 40px;
   background: #eee;
   height: 350px;
   width: 500px;
   overflow: scroll;
}

console.log(document.body.clientLeft);  //20
console.log(document.body.clientTop);  //20

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

  • clientTop=border-top的border-width
  • clientLeft=border-left的border-width

与offset相关宽高介绍

与offset相关的宽高又有如下几个属性:

  • document.body.offsetWidth
  • document.body.offsetHeight
  • document.offsetLeft
  • document.offsetTop

offsetWidth与offsetHeight

这一对属性指的是元素的border+padding+content的宽度和高度。

该属性和其内部的内容是否超出元素大小无关,只和本来设定的border以及width和height有关。
我们还是以body为例:

body{
   border: 20px solid #000;
   margin: 10px;
   padding: 40px;
   background: #eee;
   height: 350px;
   width: 500px;
   overflow: scroll;
}

console.log("offsetWidth=",document.body.offsetWidth); 
//620(width+margin*2+padding*2+border*2)
console.log("offsetHeight=",document.body.offsetHeight);  
//470(width+margin*2+padding*2+border*2)

总结

假如无padding无滚动条无border:

offsetWidth=clientWidth=style.width

假如有padding无滚动条有border:

offsetWidth=style.width+style.padding2+(border-width)2

offsetWidth=clientWidth+border宽度*2

假如有padding有滚动条,且滚动条是显示的,有border:

offsetWidth=style.width+style.padding2+(border-width)2

offsetWidth=clientWidth+滚动条宽度+border宽度*2

offsetLeft和offsetTop

这两个属性是基于offsetParent的,了解这两个属性我们必须先了解它,什么是offsetParent呢?

  1. 如果当前元素的父级元素没有进行CSS定位(position为absolute或relative),offsetParent为border.
  2. 假如当前元素的父级元素中有CSS定位,offsetParent取最近的那个父级元素。

在IE6/7中:
offsetLeft=(offsetParent的padding-left)+(当前元素的margin-left)

在IE8/9/10及Chrome中:
offsetLeft=(offsetParent的margin-left)+(offsetParent的border宽度)+(offsetParentd的padding-left)+(当前元素的margin-left)

在FireFox中:
offsetLeft=(offsetParent的margin-left)+(当前元素的margin-left)+(offsetParent的padding-left)

、、、、看到这里是不是已经懵逼了?、、、还是举例子吧:

CSS:

body{
  border: 20px solid #000;
  margin: 10px;
  padding: 40px;
  background: #eee;
  height: 350px;
  width: 500px;
}
#mydiv{
  width: 400px;
  height: 200px;
  padding: 20px;
  margin :10px;
  background: #f60;
  border: 20px solid #888;
}

在IE8/910及Chrome中
mydiv.offsetLeft = 80
mydiv.offsetTop = 80

在火狐中
mydiv.offsetLeft = 60
mydiv.offsetTop = 60

在IE低版本IE6/7中是
mydiv.offsetLeft = 50
mydiv.offsetTop = 50

与scroll相关宽高介绍

与scroll相关的宽高属性有如下几个:

  • document.body.scrollWidth
  • document.body.scrollHeight
  • document.body.scrollLeft
  • document.body.scrollTop

scrollWidth和scrollHeight
document.body的scrollWidth和scrollHeight与div的scrollWidth和scrollHeight是有区别的。

我们先来看看document.body的scrollWidth和scrollHeight:

给定宽高小于浏览器窗口

  • scrollWidth通常是浏览器窗口的宽度
  • scrollHeight通常是浏览器窗口的高度

给定宽高大于浏览器窗口,且内容小于给定宽高

  • scrollWidth给定的宽度+其所有padding、margin和border
  • scrollHeight给定的高度+其所有的padding、margin和border

给定宽高大于浏览器窗口,且内容大于给定宽高

  • scrollWidth内容宽度+其所有的padding、margin和border
  • scrollHeight内容高度+其所有的padding、margin和border

再来看看在某div中scrollWidth和scrollHeight:

在无滚动轴的时候

JavaScript中的各种宽高属性的实现

scrollWidth==clientWidth=style.width+style.padding*2

在有滚动轴的时候

JavaScript中的各种宽高属性的实现

scrollWidth==实际内容的宽度+padding*2
scrollHeight==实际内容的高度+padding*2

scrollLeft和scrollTop

这对属性是可读写(可被重新赋值) 的,指的是当元素其中的内容超出其宽高的时候,元素被卷起来的高和宽度。
obj.style.width和obj.style.height
对于一个dom元素,它的style属性返回的是一个对象,这个对象中的任意一个属性是可读写的,style.width等于CSS属性中的宽度style.height等于CSS属性中的高度。

Event对象的5种坐标

哪五种坐标?

  1. clientX和clientY,相对于浏览器(可是区左上角0,0)的坐标
  2. screenX和screenY,相对于设备屏幕左上角(0,0)的坐标
  3. offsetX和offsetY,相对于事件源左上角(0,0)的坐标
  4. pageX和pageY,相对于整个网页左上角(0,0)的坐标
  5. X和Y,本来是IE属性,相对于用CSS动态定位的最内层包容元素

到此这篇关于JavaScript中的各种宽高属性的实现的文章就介绍到这了,更多相关JavaScript 宽高属性内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
apycom出品的jQuery精美菜单破解方法
Feb 18 Javascript
jquery之超简单的div显示和隐藏特效demo(分享)
Jul 09 Javascript
快速解决jQuery与其他库冲突的方法介绍
Jan 02 Javascript
深入浅析JavaScript系列(13):This? Yes,this!
Jan 05 Javascript
AngularJS基础 ng-href 指令用法
Aug 01 Javascript
写jQuery插件时的注意点
Feb 20 Javascript
javascript完美实现给定日期返回上月日期的方法
Jun 15 Javascript
JavaScript用二分法查找数据的实例代码
Jun 17 Javascript
Webpack 服务器端代码打包的示例代码
Sep 19 Javascript
vue上传图片到oss的方法示例(图片带有删除功能)
Sep 27 Javascript
使用localStorage替代cookie做本地存储
Sep 25 Javascript
Vue如何清空对象
Mar 03 Vue.js
element-ui 实现响应式导航栏的示例代码
May 08 #Javascript
JS控制下拉列表左右选择实例代码
May 08 #Javascript
VSCode搭建React Native环境
May 07 #Javascript
Javascript查看大图功能代码实现
May 07 #Javascript
用VsCode编辑TypeScript的实现方法
May 07 #Javascript
JavaScript交换变量的常用方法小结【4种方法】
May 07 #Javascript
原生JavaScript创建不可变对象的方法简单示例
May 07 #Javascript
You might like
PHP在Web开发领域的优势
2006/10/09 PHP
PHP 5.0 Pear安装方法
2006/12/06 PHP
PHP写的获取各搜索蜘蛛爬行记录代码
2012/08/21 PHP
thinkphp中连接oracle时封装方法无法用的解决办法
2013/06/17 PHP
PHP函数用法详解【初始化、嵌套、内置函数等】
2020/06/02 PHP
ajax的hide隐藏问题解决方法
2012/12/11 Javascript
AngularJS自定义服务与fliter的混合使用
2016/11/24 Javascript
Angular.JS去掉访问路径URL中的#号详解
2017/03/30 Javascript
JS获取日期的方法实例【昨天,今天,明天,前n天,后n天的日期】
2017/09/28 Javascript
React如何解决fetch跨域请求时session失效问题
2018/11/02 Javascript
JavaScript实现星级评价效果
2019/05/17 Javascript
浅谈layui分页控件field参数接收对象的问题
2019/09/20 Javascript
vue cli3适配所有端方案的实现
2020/04/13 Javascript
解决vue组件没显示,没起作用,没报错,但该显示的组件没显示问题
2020/09/02 Javascript
vue实现按钮切换图片
2021/01/20 Vue.js
[02:06]2018完美世界全国高校联赛秋季赛开始报名(附彩蛋)
2018/09/03 DOTA
django之session与分页(实例讲解)
2017/11/13 Python
Python迭代器定义与简单用法分析
2018/04/30 Python
python字符串string的内置方法实例详解
2018/05/14 Python
Python过滤txt文件内重复内容的方法
2018/10/21 Python
python 计算数据偏差和峰度的方法
2019/06/29 Python
python re.sub()替换正则的匹配内容方法
2019/07/22 Python
Django REST Framework序列化外键获取外键的值方法
2019/07/26 Python
Pyorch之numpy与torch之间相互转换方式
2019/12/31 Python
Python内置类型性能分析过程实例
2020/01/29 Python
Python定时任务APScheduler原理及实例解析
2020/05/30 Python
python爬取代理IP并进行有效的IP测试实现
2020/10/09 Python
接口可以包含哪些成员
2012/09/30 面试题
Python面试题:Python里面如何生成随机数
2015/03/12 面试题
工程总经理工作职责
2013/12/09 职场文书
保险经纪人求职信
2014/03/11 职场文书
检讨书范文1000字
2015/01/28 职场文书
职代会闭幕词
2015/01/28 职场文书
个人德育工作总结
2015/03/05 职场文书
游戏开发中如何使用CocosCreator进行音效处理
2021/04/14 Javascript
如何将numpy二维数组中的np.nan值替换为指定的值
2021/05/14 Python