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


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 相关文章推荐
页面中body onload 和 window.onload 冲突的问题的解决
Jul 01 Javascript
JS高级笔记
Jul 13 Javascript
javascript读写json示例
Apr 11 Javascript
js统计录入文本框中字符的个数并加以限制不超过多少
May 23 Javascript
常常会用到的截取字符串substr()、substring()、slice()方法详解
Dec 16 Javascript
Angular.js与Bootstrap相结合实现表格分页代码
Apr 12 Javascript
js实现产品缩略图效果
Mar 10 Javascript
jQuery实现简单的手风琴效果
Apr 17 jQuery
js实现图片轮播效果学习笔记
Jul 26 Javascript
js屏蔽F12审查元素,禁止修改页面代码等实现代码
Oct 02 Javascript
JS闭包原理及其使用场景解析
Dec 03 Javascript
vue组件的路由高亮问题解决方法
May 11 Vue.js
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
PHP实现邮件群发的源码
2013/06/18 PHP
提高PHP性能的编码技巧以及性能优化详细解析
2013/08/24 PHP
php中的观察者模式简单实例
2015/01/20 PHP
php项目开发中用到的快速排序算法分析
2016/06/25 PHP
Ubuntu彻底删除PHP7.0的方法
2018/07/27 PHP
thinkPHP+LayUI 流加载实现功能
2019/09/27 PHP
JavaScript版代码高亮
2006/06/26 Javascript
jQuery 动态酷效果实现总结
2009/12/27 Javascript
js函数返回多个返回值的示例代码
2013/11/05 Javascript
JavaScript禁止页面操作的示例代码
2013/12/17 Javascript
jquery实现向下滑出的二级导航下滑菜单效果
2015/08/25 Javascript
jQuery Mobile漏洞会有跨站脚本攻击风险
2017/02/12 Javascript
详解JS异步加载的三种方式
2017/03/07 Javascript
BootStrap Table 后台数据绑定、特殊列处理、排序功能
2017/05/27 Javascript
基于jQuery实现的Ajax 验证用户名唯一性实例代码
2017/06/28 jQuery
js+html5实现页面可刷新的倒计时效果
2017/07/15 Javascript
Vue.js学习笔记之常用模板语法详解
2017/07/25 Javascript
JavaScript上传文件时不用刷新页面方法总结(推荐)
2017/08/15 Javascript
基于vue2.0实现简单轮播图
2017/11/27 Javascript
nodejs结合socket.io实现websocket通信功能的方法
2018/01/12 NodeJs
javascript操作元素的常见方法小结
2019/11/13 Javascript
Vue的transition-group与Virtual Dom Diff算法的使用
2019/12/09 Javascript
在vue中通过render函数给子组件设置ref操作
2020/11/17 Vue.js
python开启多个子进程并行运行的方法
2015/04/18 Python
浅析Python中的for 循环
2016/06/09 Python
Python:Scrapy框架中Item Pipeline组件使用详解
2017/12/27 Python
Python 多线程不加锁分块读取文件的方法
2018/12/11 Python
Django后端发送小程序微信模板消息示例(服务通知)
2019/12/17 Python
strstr()的简单实现
2013/09/26 面试题
乡镇干部先进事迹材料
2014/02/03 职场文书
文员岗位职责范本
2014/03/08 职场文书
《微笑着面对生活》优秀演讲稿范文
2014/09/23 职场文书
2014镇党委班子对照检查材料思想汇报
2014/09/23 职场文书
岗位职责范本大全
2015/02/26 职场文书
2016道德模范先进事迹材料
2016/02/26 职场文书
python3 hdf5文件 遍历代码
2021/05/19 Python