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


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 相关文章推荐
使用JQuery进行跨域请求
Jan 25 Javascript
图片onload事件触发问题解决方法
Jul 31 Javascript
JavaScript截取字符串的Slice、Substring、Substr函数详解和比较
Mar 20 Javascript
js实现星星打分效果的方法
Jul 05 Javascript
JavaScript字符串删除重复字符的方法
Dec 25 Javascript
AngularJS 依赖注入详解及示例代码
Aug 17 Javascript
yarn与npm的命令行小结
Oct 20 Javascript
jQuery Plupload上传插件的使用
Apr 19 jQuery
在vue项目中使用Nprogress.js进度条的方法
Jan 31 Javascript
vue mint-ui tabbar变组件使用
May 04 Javascript
JS实现移动端触屏拖拽功能
Jul 31 Javascript
JavaScript使用prototype属性实现继承操作示例
May 22 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
一个程序下载的管理程序(一)
2006/10/09 PHP
用PHP将网址字符串转换成超链接(网址或email)
2010/05/25 PHP
PHP基础学习小结
2011/04/17 PHP
php jquery 多文件上传简单实例
2013/12/23 PHP
php+mysql大量用户登录解决方案分析
2014/12/29 PHP
php获取当前页面完整URL地址
2015/12/30 PHP
php常用日期时间函数实例小结
2019/07/04 PHP
js 完美图片新闻轮转效果,腾讯大粤网首页图片轮转改造而来
2011/11/21 Javascript
经过绑定元素时会多次触发mouseover和mouseout事件
2014/02/28 Javascript
document.compatMode的CSS1compat使用介绍
2014/04/03 Javascript
js unicode 编码解析关于数据转换为中文的两种方法
2014/04/21 Javascript
Javascript中拼接大量字符串的方法
2015/02/05 Javascript
js+html5实现可在手机上玩的拼图游戏
2015/07/17 Javascript
jQuery.trim() 函数及trim()用法详解
2015/10/26 Javascript
jQuery实现为LI列表前3行设置样式的方法【2种方法】
2016/09/04 Javascript
jQuery如何解决IE输入框不能输入的问题
2016/10/08 Javascript
javascript判断firebug是否开启的方法
2016/11/23 Javascript
Bootstrap源码解读媒体对象、列表组和面板(10)
2016/12/26 Javascript
JavaScript中in和hasOwnProperty区别详解
2017/08/04 Javascript
总结JavaScript在IE9之前版本中内存泄露问题
2018/04/28 Javascript
nodejs 生成和导出 word的实例代码
2018/07/31 NodeJs
vue将单页面改造成多页面应用的方法
2018/11/25 Javascript
nuxt框架中对vuex进行模块化设置的实现方法
2019/09/06 Javascript
Node.js API详解之 string_decoder用法实例分析
2020/04/29 Javascript
python使用sorted函数对列表进行排序的方法
2015/04/04 Python
Python中用Spark模块的使用教程
2015/04/13 Python
PyQt5利用QPainter绘制各种图形的实例
2017/10/19 Python
win10系统下Anaconda3安装配置方法图文教程
2018/09/19 Python
pandas pivot_table() 按日期分多列数据的方法
2018/11/16 Python
python创造虚拟环境方法总结
2019/03/04 Python
将 Ubuntu 16 和 18 上的 python 升级到最新 python3.8 的方法教程
2020/03/11 Python
7款设计巧妙的css3飘带状3D立体效果的导航菜单和表单窗口
2013/02/04 HTML / CSS
专科毕业生就业推荐信
2013/11/01 职场文书
演讲稿祖国在我心中
2014/05/04 职场文书
餐厅周年庆活动方案
2014/08/25 职场文书
员工试用期自我鉴定范文
2014/09/15 职场文书