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


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引起的内存泄漏问题
Oct 08 Javascript
jQuery maxlength文本字数限制插件
Apr 16 Javascript
JS不能跨域借助jquery获取IP地址的方法
Aug 20 Javascript
基于javascript、ajax、memcache和PHP实现的简易在线聊天室
Feb 03 Javascript
js实现兼容性好的微软官网导航下拉菜单效果
Sep 07 Javascript
浅析JavaScript访问对象属性和方法及区别
Nov 16 Javascript
js实现的二分查找算法实例
Jan 21 Javascript
在Web项目中引入Jquery插件报错的完美解决方案(图解)
Sep 19 Javascript
vue进行图片的预加载watch用法实例讲解
Feb 07 Javascript
vue实现自定义日期组件功能的实例代码
Nov 06 Javascript
vuex存储复杂参数(如对象数组等)刷新数据丢失的解决方法
Nov 05 Javascript
JS实现简易留言板增删功能
Feb 08 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
PHP入门学习的几个不错的实例代码
2008/07/13 PHP
PHP 验证码的实现代码
2011/07/17 PHP
ThinkPHP之R方法实例详解
2014/06/20 PHP
文本框input聚焦失焦样式实现代码
2012/10/12 Javascript
javascript小数四舍五入多种方法实现
2012/12/23 Javascript
扩展js对象数组的OrderByAsc和OrderByDesc方法实现思路
2013/05/17 Javascript
JS中实现简单Formatter函数示例代码
2014/08/19 Javascript
node.js中的fs.realpathSync方法使用说明
2014/12/16 Javascript
javascript操作符&quot;!~&quot;详解
2015/02/10 Javascript
vue中使用codemirror的实例详解
2018/11/01 Javascript
JavaScript设计模式之责任链模式实例分析
2019/01/16 Javascript
基于JS+HTML实现弹窗提示是否确认提交功能
2020/06/17 Javascript
Vue中nprogress页面加载进度条的方法实现
2020/11/13 Javascript
关于better-scroll插件的无法滑动bug(2021通过插件解决)
2021/03/01 Javascript
Python Django使用forms来实现评论功能
2016/08/17 Python
python中使用psutil查看内存占用的情况
2018/06/11 Python
Python字典创建 遍历 添加等实用基础操作技巧
2018/09/13 Python
Python3列表内置方法大全及示例代码小结
2019/05/10 Python
利用pandas合并多个excel的方法示例
2019/10/10 Python
将python安装信息加入注册表的示例
2019/11/20 Python
python多进程重复加载的解决方式
2019/12/13 Python
Python random库使用方法及异常处理方案
2020/03/02 Python
详解Python中如何将数据存储为json格式的文件
2020/11/18 Python
python中numpy.empty()函数实例讲解
2021/02/05 Python
莫斯科购买书籍网站:Book24
2020/01/12 全球购物
希腊品牌鞋类销售网站:epapoutsia.gr
2020/03/18 全球购物
编码实现字符串转整型的函数
2012/06/02 面试题
研究生自我鉴定范文
2013/10/30 职场文书
大学生演讲稿范文
2014/01/11 职场文书
党性锻炼的心得体会
2014/09/03 职场文书
群众路线调研报告范文
2014/11/03 职场文书
太空授课观后感
2015/06/17 职场文书
小学2016年“我们的节日·重阳节”活动总结
2016/04/01 职场文书
python 实现体质指数BMI计算
2021/05/26 Python
Python 中random 库的详细使用
2021/06/03 Python
Python Pandas模块实现数据的统计分析的方法
2021/06/24 Python