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


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 相关文章推荐
arguments对象
Nov 20 Javascript
jquery中邮箱地址 URL网站地址正则验证实例代码
Sep 15 Javascript
jquery ajax对特殊字符进行转义防止js注入使用示例
Nov 21 Javascript
纯css+js写的一个简单的tab标签页带样式
Jan 28 Javascript
javascript处理表单示例(javascript提交表单)
Apr 28 Javascript
基于javascript的JSON格式页面展示美化方法
Jul 02 Javascript
AngularJs Modules详解及示例代码
Sep 01 Javascript
Vue表单实例代码
Sep 05 Javascript
基于jQuery的checkbox全选问题分析
Nov 18 Javascript
基于JS实现网页中的选项卡(两种方法)
Jun 16 Javascript
实现vuex原理的示例
Oct 21 Javascript
ReactRouter的实现方法
Jan 25 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
destoon文章模块调用企业会员资料的方法
2014/08/22 PHP
php实现的mongodb操作类实例
2015/04/03 PHP
PHP实现json_decode不转义中文的方法
2017/05/20 PHP
PHP正则匹配到2个字符串之间的内容方法
2018/12/24 PHP
基于jquery的jqDnR拖拽溢出的修改
2011/02/12 Javascript
ff下JQuery无法监听input的keyup事件的解决方法
2013/12/12 Javascript
javascript实现在指定元素中垂直水平居中
2015/09/13 Javascript
JavaScript学习笔记之ES6数组方法
2016/03/25 Javascript
vue2.0父子组件及非父子组件之间的通信方法
2017/01/21 Javascript
ECMAScript6 新特性范例大全
2017/03/24 Javascript
解析NodeJS异步I/O的实现
2017/04/13 NodeJs
详解webpack+es6+angular1.x项目构建
2017/05/02 Javascript
jQuery Datatables表头不对齐的解决办法
2017/11/27 jQuery
jQuery第一次运行页面默认触发点击事件的实例
2018/01/10 jQuery
详解微信小程序实现仿微信聊天界面(各种细节处理)
2019/02/17 Javascript
vue使用nprogress实现进度条
2019/12/09 Javascript
element-ui 实现响应式导航栏的示例代码
2020/05/08 Javascript
[50:01]Ti4 冒泡赛第二天 NEWBEE vs Titan
2014/07/15 DOTA
python去掉空白行的多种实现代码
2018/03/19 Python
Python基于最小二乘法实现曲线拟合示例
2018/06/14 Python
python3 对list中每个元素进行处理的方法
2018/06/29 Python
flask中的wtforms使用方法
2018/07/21 Python
python禁用键鼠与提权代码实例
2019/08/16 Python
python匿名函数lambda原理及实例解析
2020/02/07 Python
pytorch dataloader 取batch_size时候出现bug的解决方式
2020/02/20 Python
Python 操作 PostgreSQL 数据库示例【连接、增删改查等】
2020/04/21 Python
小 200 行 Python 代码制作一个换脸程序
2020/05/12 Python
Python3安装模块报错Microsoft Visual C++ 14.0 is required的解决方法
2020/07/28 Python
python PIL模块的基本使用
2020/09/29 Python
亚瑟士美国官网:ASICS美国
2017/02/01 全球购物
美国牛仔品牌:True Religion
2018/11/16 全球购物
宝拉珍选英国官网:Paula’s Choice英国
2019/05/29 全球购物
大学生学习面向未来的赶考思想汇报
2014/09/12 职场文书
2014年高校辅导员工作总结
2014/12/09 职场文书
导游词之河北邯郸
2019/09/12 职场文书
解析在浏览器地址栏输入一个URL后发生了什么
2021/06/21 Servers