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


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 相关文章推荐
在Z-Blog中运行代码[html][/html](纯JS版)
Mar 25 Javascript
js树形控件脚本代码
Jul 24 Javascript
当jQuery遭遇CoffeeScript的时候 使用分享
Sep 17 Javascript
jquery实现加载等待效果示例
Sep 25 Javascript
ES6中的箭头函数实例详解
Apr 06 Javascript
vue 2.0路由之路由嵌套示例详解
May 08 Javascript
JavaScript字符串_动力节点Java学院整理
Jun 27 Javascript
跟混乱的页面弹窗说再见
Apr 11 Javascript
微信小程序中如何使用flyio封装网络请求
Jul 03 Javascript
详解Vue 数据更新了但页面没有更新的 7 种情况汇总及延伸总结
May 28 Javascript
JavaScript 事件代理需要注意的地方
Sep 08 Javascript
解决vue项目打包上服务器显示404错误,本地没出错的问题
Nov 03 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/03/24 PHP
PHP中最容易忘记的一些知识点总结
2013/04/28 PHP
PHP5中GD库生成图形验证码(有汉字)
2013/07/28 PHP
php简单读取.vcf格式文件的方法示例
2017/09/02 PHP
PHP实现的防止跨站和xss攻击代码【来自阿里云】
2018/01/29 PHP
解决Jquery鼠标经过不停滑动的问题
2014/03/03 Javascript
探讨JavaScript标签位置的存放与功能有无关系
2016/01/15 Javascript
domReady的实现案例
2016/11/23 Javascript
轻松理解JavaScript之AJAX
2017/03/15 Javascript
AngularJS入门教程一:路由用法初探
2017/05/27 Javascript
JavaScript实现简单生成随机颜色的方法
2017/09/21 Javascript
详解给Vue2路由导航钩子和axios拦截器做个封装
2018/04/10 Javascript
vue两个组件间值的传递或修改方式
2018/07/04 Javascript
解决vue-cli webpack打包后加载资源的路径问题
2018/09/25 Javascript
javascript中toFixed()四舍五入使用方法详解
2018/09/28 Javascript
js实现购物车商品数量加减
2020/09/21 Javascript
[03:21]辉夜杯主赛事 12月25日TOP5
2015/12/26 DOTA
[08:06]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant 选手采访
2021/03/11 DOTA
python中二维阵列的变换实例
2014/10/09 Python
Python 查看文件的读写权限方法
2018/01/23 Python
解决Python安装后pip不能用的问题
2018/06/12 Python
Flask Web开发入门之文件上传(八)
2018/08/17 Python
Python 爬虫实现增加播客访问量的方法实现
2019/10/31 Python
使用pandas库对csv文件进行筛选保存
2020/05/25 Python
Html5游戏开发之乒乓Ping Pong游戏示例(二)
2013/01/21 HTML / CSS
Tech21美国/加拿大:英国NO.1防摔保护壳品牌
2018/01/20 全球购物
哈利波特商店:Harry Potter Shop
2018/11/30 全球购物
Android面试宝典
2013/08/06 面试题
2014婚礼司仪主持词
2014/03/14 职场文书
晨会主持词
2014/03/17 职场文书
签约仪式主持词
2014/03/19 职场文书
应用心理学专业求职信
2014/08/04 职场文书
调研汇报材料范文
2014/08/17 职场文书
机票销售员态度不好检讨书
2014/09/27 职场文书
学校趣味运动会开幕词
2016/03/04 职场文书
mysql获取指定时间段中所有日期或月份的语句(不设存储过程,不加表)
2021/06/18 MySQL