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


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 相关文章推荐
判断是否输入完毕再激活提交按钮
Jun 26 Javascript
JavaScript的eval JSON object问题
Nov 15 Javascript
javascript 在firebug调试时用console.log的方法
May 10 Javascript
jQuery实现可收缩展开的级联菜单实例代码
Nov 27 Javascript
jQuery实现点击该行即可删除HTML表格行
Oct 17 Javascript
JavaScript实现的XML与JSON互转功能详解
Feb 16 Javascript
bootstrap手风琴折叠示例代码分享
May 22 Javascript
vue组件实现文字居中对齐的方法
Aug 23 Javascript
Javascript中将变量转换为字符串的三种方法
Sep 19 Javascript
jQuery AJAX与jQuery事件的分析讲解
Feb 18 jQuery
JS前端知识点总结之内置对象,日期对象和定时器相关操作
Jul 05 Javascript
jQuery加PHP实现图片上传并提交的示例代码
Jul 16 jQuery
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
外媒评选出10支2020年最受欢迎的Dota2战队
2021/03/05 DOTA
thinkphp的CURD和查询方式介绍
2013/12/19 PHP
php中最简单的字符串匹配算法
2014/12/16 PHP
IOS 开发之NSDictionary转换成JSON字符串
2017/08/14 PHP
jquery validation插件表单验证的一个例子
2010/03/03 Javascript
基于jquery的大众点评,分类导航实现代码
2011/08/23 Javascript
jQuery版仿Path菜单效果
2011/12/15 Javascript
兼容Firefox的Javascript XSLT 处理XML文件
2014/12/31 Javascript
jQuery中ready事件用法实例
2015/01/19 Javascript
JavaScript获取一个范围内日期的方法
2015/04/24 Javascript
JS实现的简单鼠标跟随DiV层效果完整实例
2015/10/31 Javascript
AngularJS 整理一些优化的小技巧
2016/08/18 Javascript
js完整倒计时代码分享
2016/09/18 Javascript
JS返回顶部实例代码
2020/08/09 Javascript
Vue的路由动态重定向和导航守卫实例
2018/03/17 Javascript
jquery实现直播弹幕效果
2019/11/28 jQuery
javascript 数组精简技巧小结
2020/02/26 Javascript
vue 导航锚点_点击平滑滚动,导航栏对应变化详解
2020/08/10 Javascript
[47:39]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 LGD vs OPTIC
2018/03/31 DOTA
Python利用pyHook实现监听用户鼠标与键盘事件
2014/08/21 Python
python字符串中的单双引
2017/02/16 Python
ubuntu环境下python虚拟环境的安装过程
2018/01/07 Python
Python中将变量按行写入txt文本中的方法
2018/04/03 Python
python+mysql实现学生信息查询系统
2019/02/21 Python
python中open函数的基本用法示例
2019/09/07 Python
Python使用Opencv实现图像特征检测与匹配的方法
2019/10/30 Python
Pandas的数据过滤实现
2021/01/15 Python
美国女孩洋娃娃店:American Girl
2017/10/24 全球购物
乌克兰珠宝大卖场:Zlato.ua
2020/09/27 全球购物
财务人员个人自荐信范文
2013/09/26 职场文书
教师自荐信范文
2013/12/09 职场文书
大队委员竞选演讲稿
2015/11/20 职场文书
导游词之凤凰古城
2019/10/22 职场文书
七年级作文之下雨天
2019/12/23 职场文书
Apache POI的基本使用详解
2021/11/07 Servers
JavaScript高级程序设计之变量与作用域
2021/11/17 Javascript