获取隐藏元素的尺寸
2015-09-24 10:51
375 查看
平时要获取一个元素的尺寸一般都会直接使用offsetWidth和offsetHeight来获取,但是这两个属性是通过CSS渲染到页面上时候才计算的。而dispaly属性为none的元素将不参与渲染,它不会在渲染环境中生成任何盒子,自然也无法从属性中获取到尺寸。
offsetWidth和offsetHeight的值就是CSS在layout时的值,不参与渲染就自然不会layout,所以当然无法从这里获取到值。如果元素是固定尺寸的,那甚至都不用刻意获取,因为开发者知道元素的大小。所以这里讨论的是尺寸不固定,也无法通过内容来计算的情况。
这种蛋疼的情况怎么办?对于蛋疼的情况,咱就只能使用蛋疼的方法了。dispaly属性为none的元素要直接获取尺寸是行不通了,我们必须修改这个display,或者说临时修改这个display来让元素参与渲染以便计算尺寸。但是修改display就会产生其它问题,通常为了防止 元素参与到常规流动中,会直接使用position属性的absolute值来让元素呆在流外。并使用top和left的负值让它移动到偏僻的看不见的地方。这样再获取元素的尺寸。
无论何种方法,遇到特殊情况都总会有问题。所以上面这些是一般的方式,具体的实现得从实际角度考虑。
offsetWidth和offsetHeight的值就是CSS在layout时的值,不参与渲染就自然不会layout,所以当然无法从这里获取到值。如果元素是固定尺寸的,那甚至都不用刻意获取,因为开发者知道元素的大小。所以这里讨论的是尺寸不固定,也无法通过内容来计算的情况。
这种蛋疼的情况怎么办?对于蛋疼的情况,咱就只能使用蛋疼的方法了。dispaly属性为none的元素要直接获取尺寸是行不通了,我们必须修改这个display,或者说临时修改这个display来让元素参与渲染以便计算尺寸。但是修改display就会产生其它问题,通常为了防止 元素参与到常规流动中,会直接使用position属性的absolute值来让元素呆在流外。并使用top和left的负值让它移动到偏僻的看不见的地方。这样再获取元素的尺寸。
<style> #div {display:none;} </style> <div id="div"> <a href="http://www.web-tinker.com">Web技术研究所</a> </div> <script> onload=function(){ //由于此时元素的display为none,因此无法获取尺寸,固输出0 console.log(div.offsetWidth,div.offsetHeight); //保存原来的属性值 var display=div.style.display, position=div.style.position, left=div.style.left; //设置新属性 div.style.display="block"; div.style.position="absolute"; div.style.left="-10000px"; //由于元素已经参与渲染,所以可以获取到尺寸 console.log(div.offsetWidth,div.offsetHeight); //还原被修改的属性 div.style.display=display; div.style.position=position; div.style.left=left; }; </script>这个方法太暴力了!虽然这对于一般的情况而言并没有什么问题,它也是最方便的方法。但它强制性的把一个元素丢到了流外,这会导致一些继承性的东西失效。考虑元素是自适应容器宽度的情况,这样不分青红皂白的就把元素丢到流外显然会得到错误的结果。比如把上面例子的HTML改成这样,输出的结果还是一样的,但事实上真正渲染出来的结果不会那样的。
<style> .panel {width:500px;} #div {display:none;margin:20px;} </style> <div class="panel"> <div id="div"> <a href="http://www.web-tinker.com">Web技术研究所</a> </div> </div>这时候,我们可以从上面的方法中变通一下。既然不能把元素直接丢到流外。那就让它保持在流内,并想办法隐藏它,使它不影响其它布局。比如下面这种做法就是把元素弄成0高度的来隐藏。
onload=function(){ //由于此时元素的display为none,因此无法获取尺寸,固输出0 console.log(div.offsetWidth); //保存原来的属性值 var display=div.style.display, overflow=div.style.overflow, height=div.style.height; //设置新属性 div.style.display="block"; div.style.overflow="hidden"; div.style.height="0px"; //由于元素已经参与渲染,所以可以获取到尺寸 console.log(div.offsetWidth); //还原被修改的属性 div.style.display=display; div.style.overflow=overflow; div.style.height=height; };这只适合获取宽度,对于高度而言并么有自适应的问题,如果是百分比的高度完全不需要获取,只要取容器的高度来计算就行了。自动的高度是内容的最小高度,如果非要算,可以结合上面的两个方法,先获取宽度,再固定宽度绝对定位来计算高度。
无论何种方法,遇到特殊情况都总会有问题。所以上面这些是一般的方式,具体的实现得从实际角度考虑。
相关文章推荐
- Unity小地图遮罩Shader
- STL之一:字符串用法详解
- [C++空间分配]new运算符、operator new、placement new的区别于联系
- 在eclipse中的控制台中添加标签
- 后缀数组代码详解
- shell脚本报错 /bin/bash^M: bad interpreter
- iOS开发UI篇—使用UItableview完成一个简单的QQ好友列表(二)
- VC6调试时,如何查看vector中的内容?
- 添加背景音乐视频
- 模仿淘宝上传图片之后在图片中单击按钮?
- java数组获取最值
- STL学习系列之一——标准模板库STL介绍
- MSSQL 判断实例中是否存在某种表
- Javascript学习(一)——汉诺塔迭代算法的实现过程
- 在Tomcat 6下运行正常,但是在Tomcat 7下异常。
- Gdi+与双缓冲的图片显示(应用篇)
- 开发中遇到libc++abi.dylib: terminate_handler unexpectedly threw an exception错误
- Swift编程规范:保持代码优美的10个方法
- 牛X素材推荐之TriangleRectangleLabelView
- CSS中常用到的清除浮动