各情景下元素宽高的获取实现代码


Posted in Javascript onSeptember 13, 2011

情景一,元素style属性设置了width/height

<div style="width:100px;">test<div> 
<script> 
var div = document.getElementsByTagName('div')[0]; 
alert(div.style.width); 
</script>

如上,使用el.style.width即可。如果没有在style属性中设置width,那么使用el.style.width将获取不到,如下
<div>test<div> 
<script> 
var div = document.getElementsByTagName('div')[0]; 
alert(div.style.width); 
</script>

所有浏览器中弹出的是空字符串。即使将样式嵌在页面的css中也仍然获取不到,如下
<style> 
div {width: 100px} 
</style> 
<div>test<div> 
<script> 
var div = document.getElementsByTagName('div')[0]; 
alert(div.style.width); 
</script>

这时候getComputedStyle或currentStyle将会派上用场。
情景二,元素通过引入样式表设置width/height
有两种方式引入样式表,一是使用link标签引入单独的css文件,二是直接在html页面中使用style标签。这里使用第二种方式测试。如下
<style> 
div {width: 100px} 
</style> 
<div>test<div> 
<script> 
function getStyle(el, name) { 
if(window.getComputedStyle) { 
return window.getComputedStyle(el, null); 
}else{ 
return el.currentStyle; 
} 
} 
var div = document.getElementsByTagName('div')[0]; 
alert(getStyle(div, 'width')); 
</script>

所有浏览器中均弹出了100px。说明通过getComputedStyle和currentStyle可以获取到元素被定义在样式表中的宽高。
那如果元素即没有在style属性中设置宽高,也没有在样式表中设置宽高,还能用getComputedStyle或currentStyle获取吗?答案是getComputedStyle可以,currentStyle不可以。如下
<div>test<div> 
<script> 
function getStyle(el, name) { 
if(window.getComputedStyle) { 
return window.getComputedStyle(el, null); 
}else{ 
return el.currentStyle; 
} 
} 
var div = document.getElementsByTagName('div')[0]; 
alert(getStyle(div, 'width')); 
</script>

div 既没有设置style属性,也没有引入样式表。在Firefox/IE9/Safari/Chrome/Opera中可以获取到宽高(浏览器默认),但IE6/7/8中却不行,返回的是auto。
注意,这里getStyle方法优先使用getComputedStyle,而IE9已经支持该方法。因此IE9中可以获取到宽高。但IE6/7/8不支持,只能使用currentStyle获取。
情景三,元素既没有设置style属性,也没有引入样式表
<div>test<div> 
<script> 
function getStyle(el,name) { 
if(window.getComputedStyle) { 
return window.getComputedStyle(el, null)[name]; 
}else{ 
return el.currentStyle[name]; 
} 
} 
function getWH(el, name) { 
var val = name === "width" ? el.offsetWidth : el.offsetHeight, 
which = name === "width" ? ['Left', 'Right'] : ['Top', 'Bottom']; 
// display is none 
if(val === 0) { 
return 0; 
} 
for(var i = 0, a; a = which[i++];) { 
val -= parseFloat( getStyle(el, "border" + a + "Width") ) || 0; 
val -= parseFloat( getStyle(el, "padding" + a) ) || 0; 
} 
return val + 'px'; 
} 
var div = document.getElementsByTagName('div')[0]; 
alert(getWH(div, 'width')); 
</script>

思路很简单:获取元素的offsetWidth/offsetHeight,减去元素的padding和border。
Javascript 相关文章推荐
JAVASCRIPT IE 与 FF中兼容问题小结
Feb 18 Javascript
js添加select下默认的option的value和text的方法
Oct 19 Javascript
JS+CSS实现电子商务网站导航模板效果代码
Sep 10 Javascript
微信JSAPI Ticket接口签名详解
Jun 28 Javascript
微信页面弹出键盘后iframe内容变空白的解决方案
Sep 20 Javascript
node 命令方式启动修改端口的方法
May 12 Javascript
微信小程序调用摄像头隐藏式拍照功能
Aug 22 Javascript
解决vuecli3.0热更新失效的问题
Sep 19 Javascript
AngularJS 多指令Scope问题的解决
Oct 25 Javascript
对layui中的onevent 和event的使用详解
Sep 06 Javascript
利用Vue实现简易播放器的完整代码
Dec 30 Vue.js
浅谈react路由传参的几种方式
Mar 23 Javascript
JS字符串函数扩展代码
Sep 13 #Javascript
Javascript学习笔记 delete运算符
Sep 13 #Javascript
Webkit的跨域安全问题说明
Sep 13 #Javascript
Array, Array Constructor, for in loop, typeof, instanceOf
Sep 13 #Javascript
容易被忽略的JS脚本特性
Sep 13 #Javascript
Javascript学习笔记-详解in运算符
Sep 13 #Javascript
使用原生javascript创建通用表单验证——更锋利的使用dom对象
Sep 13 #Javascript
You might like
AM/FM收音机的安装与调试
2021/03/02 无线电
php_screw 1.5:php加密: 安装与使用详解
2013/06/20 PHP
UPUPW 更新 64 位 Apache 系列 PHP 7.0 正式版
2015/12/08 PHP
PHPStorm+XDebug进行调试图文教程
2016/06/13 PHP
PHP中获取文件创建日期、修改日期、访问时间的方法
2016/11/05 PHP
不要小看注释掉的JS 引起的安全问题
2008/12/27 Javascript
一个简单的弹性返回顶部JS代码实现介绍
2013/06/09 Javascript
js加减乘除丢失精度问题解决方法
2014/05/16 Javascript
动态读取JSON解析键值对的方法
2014/06/03 Javascript
JavaScript+CSS实现仿天猫侧边网页菜单效果
2015/08/25 Javascript
js传值后台中文出现乱码的解决方法
2016/06/30 Javascript
Bootstrap图片轮播组件使用实例解析
2016/06/30 Javascript
使用weixin-java-miniapp配置进行单个小程序的配置详解
2019/03/29 Javascript
微信小程序--特定区域滚动到顶部时固定的方法
2019/04/28 Javascript
使用layui前端框架弹出form表单以及提交的示例
2019/10/25 Javascript
js实现整体缩放页面适配移动端
2020/03/31 Javascript
vue中封装axios并实现api接口的统一管理
2020/12/25 Vue.js
[02:29]完美世界高校联赛上海赛区回顾
2015/12/15 DOTA
python中的文件打开与关闭操作命令介绍
2018/04/26 Python
python: 自动安装缺失库文件的方法
2018/10/22 Python
浅谈python requests 的put, post 请求参数的问题
2019/01/02 Python
Python正则表达式匹配日期与时间的方法
2019/07/07 Python
python读取excel数据绘制简单曲线图的完整步骤记录
2020/10/30 Python
安装pyinstaller遇到的各种问题(小结)
2020/11/20 Python
HTML5拖拉上传文件的简单实例
2017/01/11 HTML / CSS
伦敦一卡通:The London Pass
2018/11/30 全球购物
捐款倡议书范文
2014/02/02 职场文书
同事吵架检讨书
2014/02/05 职场文书
心理学专业求职信
2014/06/16 职场文书
支行行长竞聘报告
2014/11/06 职场文书
圆明园观后感
2015/06/03 职场文书
Python文件的操作示例的详细讲解
2021/04/08 Python
实例讲解Python中sys.argv[]的用法
2021/06/03 Python
ConstraintValidator类如何实现自定义注解校验前端传参
2021/06/18 Java/Android
低门槛开发iOS、Android、小程序应用的前端框架详解
2021/10/16 Javascript
详解OpenCV曝光融合
2022/04/29 Python