前端中 width 的获取
这篇文章其实是在了解 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 的获取的更多相关文章
- javaWeb - 2 — ajax、json — 最后附:后台获取前端中的input type = "file"中的信息 — 更新完毕
1.ajax是什么? 面向百度百科一下就知道了,这里就简单提炼一下 Ajax即Asynchronous Javascript And XML(异步JavaScript和XML).当然其实我们学的应该叫 ...
- 说说移动前端中 viewport (视口)
转载网络资源的文章:来源不详~~ 移动前端中常说的 viewport (视口)就是浏览器显示页面内容的屏幕区域.其中涉及几个重要概念是 dip ( device-independent pixel 设 ...
- 移动前端中viewport(视口) 转
移动前端中常说的 viewport (视口)就是浏览器显示页面内容的屏幕区域.其中涉及几个重要概念是 dpi ( device-independent pixel 设备逻辑像素 )和 CSS 像素之间 ...
- 使用jquery中height()方法获取各种高度大全
alert($(window).height()); //浏览器当前窗口可视区域高度 alert($(document).height()); //浏览器当前窗口文档的高度 alert($(docum ...
- 多个iframe中根据src获取特定iframe并执行操作
多个iframe中根据src获取特定iframe并执行操作 前言:在项目中做一个批量编辑工单时需要在一大堆的iframe中的某一个iframe里边再用模态框的形式显示编辑区域,然后再在模态框里边加入i ...
- vue+element-ui中的图片获取与上传
vue+element-ui中的图片获取与上传 工作上接触了一下图片的处理,图片的格式是文件流, 记录如下. 请求图片 请求图片的时候,带上{ responseType: 'blob' }, 否则图片 ...
- ios中摄像头/相册获取图片压缩图片上传服务器方法总结
本文章介绍了关于ios中摄像头/相册获取图片,压缩图片,上传服务器方法总结,有需要了解的同学可以参考一下下. 这几天在搞iphone上面一个应用的开发,里面有需要摄像头/相册编程和图片上传的问 ...
- C#开发微信门户及应用(14)-在微信菜单中采用重定向获取用户数据
我曾经在系列文章中的<C#开发微信门户及应用(11)--微信菜单的多种表现方式介绍>中介绍了微信菜单里面的重定向操作,通过这个重定向操作,我们可以获取一个code值,然后获取用户的open ...
- asp.net三层架构 及其中使用泛型获取实体数据介绍
asp.net中使用泛型获取实体数据可以发挥更高的效率,代码简洁方便,本例采用三层架构.首先在model层中定义StuInfo实体,然后在 DAL层的SQLHelper数据操作类中定义list< ...
随机推荐
- CS局域网射击
2/3D游戏:3D 辅助插件:角色控制器 游戏制作难度系数:中级 用到的其他工具:network 一.解决由于子弹射击速度过快而无法打到物体的问题 //方法一: ; Vector3 originalP ...
- JAVA相似算法的运用
今天要处理问题是把一个产品的名字按照其内容对比文档转换出它的中文名. 但是这个文档感觉不全,产品种类有多又杂. 如果像这样写的话 if(xxx.contains()) else if() ... 不知 ...
- 第一次玩博客 感觉自己特别low
第一天来 来好激动第一天来 来好激动第一天来 来好激动第一天来 来好激动第一天来 来好激动第一天来 来好激动第一天来 来好激动第一天来 来好激动第一天来 来好激动第一天来 来好激动 ...
- Python下安装protobuf
1. 下载安装包 2. 解压缩 tar –xzvf protobuf-2.6.1.tar.gz 3. 安装protoc 在python中使用protocbuf需要Protocal Buffer 编译器 ...
- Tomcat 顶层结构
Tomcat中最顶层的容器叫Server,代表整个服务器,Server中包含至少一个Service,用于具体提供服务. Service主要包含两部分:Connector 和 Container ...
- 软工实践Alpha冲刺(6/10)
队名:起床一起肝活队 组长博客:博客链接 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过去两天完成了哪些任务 描述: 已经解决登录注册等基本功能的界面. 完成了主界面的基本布局 ...
- android中常见的Drawable资源有哪些?
Drawable资源是安卓应用中最常见的一种资源,比如图片等,因此,对于初学者而言,必须掌握drawable资源相关应用. 今天在网上刚好看到了一篇介绍android Drawable资源的文章,分享 ...
- 股神小L [贪心]
题面 思路 股票题肯定是贪心或者$dp$啊 这个题比较$naive$,可以看出来你这里买股票的过程一定是能不买就不买,能卖就拣最贵的日子卖,而且时间不能倒流(废话= =||) 所以我们按照时间从前往后 ...
- 洛谷 P2041 分裂游戏 解题报告
P2041 分裂游戏 题目描述 有一个无限大的棋盘,棋盘左下角有一个大小为 n 的阶梯形区域,其中最左下角的那个格子里有一枚棋子.你每次可以把一枚棋子"分裂"成两枚棋子,分别放在原 ...
- Jquery不同版本共用的解决方案(插件编写)
最近在为某公司做企业内部UI库,经过研究分析和评审,决定基于Jquery开发,结合Bootstrap插件那简洁,优雅,高效的思想进行插件编写. 但是在编写的过程中遇到一个头疼的问题,就是正在编写的插件 ...