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


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系列(14) 作用域链介绍(Scope Chain)
Apr 12 Javascript
JavaScript通过字典进行字符串翻译转换的方法
Mar 19 Javascript
理解javascript定时器中的单线程
Feb 23 Javascript
第七篇Bootstrap表单布局实例代码详解(三种表单布局)
Jun 21 Javascript
RGB和YUV 多媒体编程基础详细介绍
Nov 04 Javascript
Vue 2.0中生命周期与钩子函数的一些理解
May 09 Javascript
jQuery实现判断上传图片类型和大小的方法示例
Apr 11 jQuery
vue侧边栏动态生成下级菜单的方法
Sep 07 Javascript
vue+element+Java实现批量删除功能
Apr 08 Javascript
layer.open组件获取弹出层页面变量、函数的实例
Sep 25 Javascript
vue中使用vee-validator完成表单校验方案
Nov 01 Javascript
VSCode 添加自定义注释的方法(附带红色警戒经典注释风格)
Aug 27 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函数array_merge用法一例(合并同类数组)
2013/02/03 PHP
php解析xml提示Invalid byte 1 of 1-byte UTF-8 sequence错误的处理方法
2013/11/14 PHP
php命名空间学习详解
2014/02/27 PHP
php常见的魔术方法详解
2014/12/25 PHP
phpQuery让php处理html代码像jQuery一样方便
2015/01/06 PHP
PHP实现HTTP断点续传的方法
2015/06/17 PHP
Laravel 框架返回状态拦截代码
2019/10/18 PHP
JS 获取滚动条高度示例代码
2013/10/24 Javascript
纯js实现重发验证码按钮倒数功能
2015/04/21 Javascript
理解JS绑定事件
2016/01/19 Javascript
微信小程序开发之圆形菜单 仿建行圆形菜单实例
2016/12/12 Javascript
JS实现淡入淡出图片效果的方法分析
2016/12/20 Javascript
实现一个简单的vue无限加载指令方法
2017/01/10 Javascript
jquery获取下拉框中的循环值
2017/02/08 Javascript
Angular中点击li标签实现更改颜色的核心代码
2017/12/08 Javascript
详解Vue Elememt-UI构建管理后台
2018/02/27 Javascript
vue2.0实现音乐/视频播放进度条组件
2018/06/06 Javascript
微信小程序实现弹出菜单动画
2019/06/21 Javascript
详解element-ui动态限定的日期范围选择器代码片段
2020/07/03 Javascript
[20:57]Ti4主赛事第三天开幕式
2014/07/21 DOTA
使用Python实现博客上进行自动翻页
2017/08/23 Python
使用Python抓取豆瓣影评数据的方法
2018/10/17 Python
Python多图片合并PDF的方法
2019/01/03 Python
python 读取dicom文件,生成info.txt和raw文件的方法
2019/01/24 Python
Python 实现Serial 与STM32J进行串口通讯
2019/12/18 Python
Python获取excel内容及相关操作代码实例
2020/08/10 Python
PyTorch中Tensor的数据类型和运算的使用
2020/09/03 Python
如何用Python 实现全连接神经网络(Multi-layer Perceptron)
2020/10/15 Python
GOOD AMERICAN官网:为曲线性感而设计
2017/12/28 全球购物
大三预备党员入党思想汇报
2014/01/08 职场文书
日语专业个人求职信范文
2014/02/02 职场文书
家具促销活动方案
2014/02/16 职场文书
公司周年庆典策划方案
2014/05/17 职场文书
2014年卫生保健工作总结
2014/12/08 职场文书
消防演习通知
2015/04/25 职场文书
Go 在 MongoDB 中常用查询与修改的操作
2021/05/07 Golang