这篇文章其实是在了解 viewport 的过程中发现这些概念容易混淆做了个小小的总结。viewport的首要关键是宽度的获取,宽度的计算有下面几个属性和方法:

  • clientWidth
  • offsetWidth
  • innerWidth
  • scrollWidth
  • getBoundingClientRect().width

Element.clientWidth

非行内元素的内部宽度(inner width of an element),包括 padding,不包括 margin 和 border。行内元素获取的值一直是 0,值为整数,小数四舍五入(round the value to an integer),属性为只读。

HTMLElement.offsetWidth

获取元素外围宽度(layout width of an element),包括 padding,border 以及滚动条,不包括 margin。同样是整数以及只读。

注:这里可以看到一个是 Element 的属性,一个是 HTMLElement 的属性,HTMLElement 继承于 Element,Element 不仅包括 html 元素,还有其他像 XML 之类的能在网页上展示的元素。可见 clientWidth 应用范围更广,这里暂时不作区别。

Window.innerWidth

innerWidth 属于 window 对象,包括了 window, frame, frameset, secondary window(二级窗口,这个不知道是啥),和元素无关,获取的是 window 的宽度,包括了滚动条,属性只读。

Window.outerWidth

获取的是浏览器外部宽度,这个对于页面渲染来说意义不大。包括了所有的浏览器元素,例如标题栏之类的。在 iphone 6sp 上测试值为0。screen.width 和这个值结果类似,在 iphone 6sp上正常。

Element.scrollWidth

当元素内部内容没有超出时,和 clientWidth 类似,获取的是元素的内容宽度,包括 padding。当内容(包括所有子元素,不过)溢出时,会把溢出内容的宽度计算进去,就算设置的 overflow 为 hidden,不过溢出内容需要是有效内容,display 为 none 或者没有内容只设置了宽度的元素是不会计算入内的。

Element.getBoundingClientRect()

这个方法不是专门返回元素宽度的,返回的是一个 DOMRect 对象:

{
bottom:-75
height:160
left:88
right:248
top:-235
width:160
x:88
y:-235
}

除了 winth 和 height 外,其他值相对于 viewport。宽高计算类似 offsetWidth,包括 padding,border,不包括 margin。MDN 上说 Empty border-boxes are completely ignored. 不过不知道什么是 Empty border-boxes,测试出来的结果都是不为0 的,行内元素也能够获取宽度。x,y,left,right 的值是相对于 viewport 获取的,即页面滚动时会有所影响。

getBoundingClientRect() 的计算会更常用于轮播等一些js组件中,因为他的结果不是整数,有小数结果,更加准确。

兼容性:

1、IE8 及更低没有返回 width 和 height。

2、IE 和 Edge 返回的内容不包括 x 和 y 属性。

本文来源:JuFoFu

本文地址:http://www.cnblogs.com/JuFoFu/p/7719679.html

水平有限,错误欢迎指正,转载请注明出处。

前端中 width 的获取的更多相关文章

  1. javaWeb - 2 — ajax、json — 最后附:后台获取前端中的input type = "file"中的信息 — 更新完毕

    1.ajax是什么? 面向百度百科一下就知道了,这里就简单提炼一下 Ajax即Asynchronous Javascript And XML(异步JavaScript和XML).当然其实我们学的应该叫 ...

  2. 说说移动前端中 viewport (视口)

    转载网络资源的文章:来源不详~~ 移动前端中常说的 viewport (视口)就是浏览器显示页面内容的屏幕区域.其中涉及几个重要概念是 dip ( device-independent pixel 设 ...

  3. 移动前端中viewport(视口) 转

    移动前端中常说的 viewport (视口)就是浏览器显示页面内容的屏幕区域.其中涉及几个重要概念是 dpi ( device-independent pixel 设备逻辑像素 )和 CSS 像素之间 ...

  4. 使用jquery中height()方法获取各种高度大全

    alert($(window).height()); //浏览器当前窗口可视区域高度 alert($(document).height()); //浏览器当前窗口文档的高度 alert($(docum ...

  5. 多个iframe中根据src获取特定iframe并执行操作

    多个iframe中根据src获取特定iframe并执行操作 前言:在项目中做一个批量编辑工单时需要在一大堆的iframe中的某一个iframe里边再用模态框的形式显示编辑区域,然后再在模态框里边加入i ...

  6. vue+element-ui中的图片获取与上传

    vue+element-ui中的图片获取与上传 工作上接触了一下图片的处理,图片的格式是文件流, 记录如下. 请求图片 请求图片的时候,带上{ responseType: 'blob' }, 否则图片 ...

  7. ios中摄像头/相册获取图片压缩图片上传服务器方法总结

    本文章介绍了关于ios中摄像头/相册获取图片,压缩图片,上传服务器方法总结,有需要了解的同学可以参考一下下.     这几天在搞iphone上面一个应用的开发,里面有需要摄像头/相册编程和图片上传的问 ...

  8. C#开发微信门户及应用(14)-在微信菜单中采用重定向获取用户数据

    我曾经在系列文章中的<C#开发微信门户及应用(11)--微信菜单的多种表现方式介绍>中介绍了微信菜单里面的重定向操作,通过这个重定向操作,我们可以获取一个code值,然后获取用户的open ...

  9. asp.net三层架构 及其中使用泛型获取实体数据介绍

    asp.net中使用泛型获取实体数据可以发挥更高的效率,代码简洁方便,本例采用三层架构.首先在model层中定义StuInfo实体,然后在 DAL层的SQLHelper数据操作类中定义list< ...

随机推荐

  1. Abstract Factory 抽象工厂(创建型模式)

    1.常规的对象创建方法(以更换QQ空间主题为例) (这里的常规对象指的是由于业务需求,当前实例化的对象有可能被其他相似的对象(有着共同的特性)所取代,例如更换手机铃声:一首歌取代另一首歌(词,曲,和声 ...

  2. Python全栈工程师(函数的传参)

     ParisGabriel   感谢 大家的支持                                                               每天坚持 一天一篇 点个订 ...

  3. 构建Docker镜像两种方式的比较-Dockerfile方式和S2I方式

    前言 写Dockerfile是构建Docker镜像最通常的方式,接触过Docker的童鞋多少了解一些.前段时间研究OpenShift(paas的一种),发现了另外一种构建Docker镜像的方式:S2I ...

  4. HDU 4107 Gangster(线段树 特殊懒惰标记)

    两种做法. 第一种:标记区间最大值和最小值,若区间最小值>=P,则本区间+2c,若区间最大值<P,则本区间+c.非常简单的区间更新. 最后发一点牢骚:最后query查一遍就行,我这个2B竟 ...

  5. cmd中神奇的命令 prompt $g

    万万没想到还可以这么玩 将java文件编译为class以后可以这样直接运行 java A<1.txt 就相当于把1.txt中的内容以模拟输入的方式输入到java中 java A>1.txt ...

  6. 软工实践 - 第十九次作业 Alpha 冲刺 (10/10)

    队名:起床一起肝活队 组长博客:https://www.cnblogs.com/dawnduck/p/10046955.htmlz 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 ...

  7. 初识 HTML5(一)

    H5其实就是H4的一个增强版本,我们在利用H5进行网页的构造会更简便,标签语义更简洁明了.首先,我们要理解HTML4,它是HTML的标记+css2+JavaScript的一些基本应用,简言之,就是AP ...

  8. 【Python】- pytharm 中import时无法识别自己写的程序

    右键点击自己的工作空间,找下面的Mark Directory as(将目录标记为) 选择Source Root,就可以解决上面的问题了,如图

  9. MyBatis:SQL语句中的foreach标签的详细介绍

    foreach 也就是遍历迭代,在SQL中通常用在 in 这个关键词的后面 foreach元素的属性主要有 item,index,collection,open,separator,close. 分别 ...

  10. task [最大权闭合子图]

    题面 思路 其实仔细读透就发现,是一个最大权闭合子图的模型 套进网络流里面就挺好做的了 可以选择重载这道题里面的一些运算(加减,取最小值),这样比较方便 Code #include<iostre ...