1.元素的尺寸
找出 元素的的高度和宽度可以很容易,也可以很困难,取决于它所处的不同场合,在大多数情况下,我们只需要利用前面自己封装的getStyle函数即可,如下所示:
var getHeight = function(elem){ return parseInt(getStyle(elem, 'height')); }; var getWidth = function(elem){ return parseInt(getStyle(elem, 'height')); };
经过我的测试,元素display为none时,clientHeight、clientWidth、offsetWidth、offsetHeight、offsetTop为0, offsetWidth在IE8下是-1, 在FF和Chrome下是0。
在设计获得元素的潜在完整尺寸的函数时,我们有必要先弄清楚clientHeight、cilentWidth、offsetHeight、offsetWidth这几个属性的概念:
offsetHeight : 元素在垂直方向上占用的空间大小,以像素记。包括元素的高度、(可见的)垂直滚动条的高度、上内边距和下内边距、上边框高度和下边框的高度。
clientHeight: 元素内容及区高度加上上下内边距所占据的大小。
下面的代码展示了如何找到元素的潜在的完整高度和宽度。这需要通过访问clientWidth和clientHeight属性来实现,它们提供了元素可能到达的总尺寸。
/* *在元素原有的CSS属性上修改或添加CSS属性 *参数css_obj:要添加或修改的CSS属性 *返回值:元素最初的被修改或添加的CSS属性值 */ var resetCSS = function(elem, css_obj){ var old = {}; for (var k in css_obj) { old[k] = elem.style[k]; elem.style[k] = css_obj[k]; } return old; }; /* *设置元素的相关CSS属性,参数与xx.resetCSS函数一样,返回undefined */ var setCSS = function(elem, css_obj){ for(var k in css_obj){ elem[k] = css_obj[k]; } }; /* * 获取元素潜在的完整宽度和高度 */ var getFullHeight = function(elem){ //若元素display不为none,那么使用offsetHeight获得完整高度,若没有offsetHeight,则使用getHeight if(getStyle(elem, 'display') != 'none'){ return elem.offsetHeight || getHeight(elem); } //否则,我们重置它的CSS属性以获得更精确的数据 var old = resetCSS(elem, { display:'block', visibility:'hidden', position:'absolute' }); //使用clientHeight找出元素的完整高度,如果不生效,使用getHeight函数 var h = elem.clientHeight || getHeight(elem); //恢复元素的CSS属性 setCSS(elem, old); return h; }; var getFullWidth = function(elem){ if(getStyle(elem, 'display') != 'none'){
return elem.offsetWidth || getWidth(elem);
} var old = xx.resetCSS(elem, { display:'block', visibility:'hidden', position:'absolute' }); var w = elem.clientWidth || getWdith(elem); setCSS(elem, old); return w; };
2. 元素的可见性
下面代码展示了使用CSS的display属性来切换元素可见性的一组函数:
/* * 使用display属性来切换元素可见性的一组函数 */ //隐藏元素函数 var hide = function(elem){ var cur_display = getStyle(elem, 'display'); if(cur_display != 'none'){ elem.$oldDisplay = cur_display; } elem.style.display = 'none'; }; /*显示元素函数 * 参数type: 要显示的格式('block'、'inline'等), * 若不输入,则先查找元素是否有保存的display属性,若有,则更改为保存的display属性, * 否则默认为',此时会清除元素的display属性,从而继承样式表的display属性, * 若样式表display为none,此时元素则不会显示出来 */ var show = function(elem, type){ elem.style.display = elem.$oldDisplay || type || ';
调节元素透明度函数:
/* *调节元素透明度函数(level从0-100) */ var setOpacity = function(elem, level){ //如果存在filters这个属性,则它是IE,所以设置元素的Alpha滤镜 if(elem.filters){ elem.style.filter = 'alpha(opacity=' + level + ')'; //必须设置zoom,要不然透明度在IE下不生效 elem.style.zoom = 1; } else{ //否则使用W3C的opacity属性 elem.style.opacity = level/100; } };
以下代码通过在短时间内增加高度或宽度滑动展开元素:
/* *滑动展开函数:在短时间内增加高度或宽度逐步显示隐藏元素 *type: 按何种类型展开(宽度或高度),应输入'width'或'height'或'both',默认为'both' *wvalue:要展开的最终宽度值,默认为元素的潜在完整宽度,若hvalue未输入,则默认为宽度和高度的值 *hvalue:要展开的最终高度值,默认为元素的潜在完整高度 */ XX.slideOpen = function(elem, type, wvalue, hvalue){ type = type || 'both'; var h,w, len = arguments.length; if (4 === len) { //4个参数均指明 w = wvalue; h = hvalue; if('both' !== type){ elem.style[type] = '0px'; //从0px开始展开 } else{ elem.style.height = '0px'; //从0px开始展开 } } else if (3 === len) { //只指明了3个参数 w = h = wvalue; if('both' !== type){ elem.style[type] = '0px'; //从0px开始展开 } else { elem.style.height = '0px'; //从0px开始展开 } } else { if ('height' === type) { h = XX.getFullHeight(elem); elem.style.height = '0px'; } if('width' === type){ w = XX.getFullWidth(elem); elem.style.width = '0px'; } if('both' === type){ h = XX.getFullHeight(elem); w = XX.getFullWidth(elem); elem.style.height = '0px'; } } XX.show(elem, 'block');//先显示元素,但是看不到它,因为元素宽或高为0 for(var i = 0; i <= 100; i += 5){ (function(){ var pos = i; setTimeout(function(){ switch(type){ case 'height': elem.style.height = (pos/100)*h + 'px'; break; case 'width': elem.style.width = (pos/100)*w + 'px'; break; default: elem.style.height = (pos/100)*h + 'px'; elem.style.width = (pos/100)*w + 'px'; } }, (pos + 1) * 10 ); })(); } };
/* *调节元素透明度函数(level从0-100) */ XX.setOpacity = function(elem, level){ //如果存在filters这个属性,则它是IE,所以设置元素的Alpha滤镜 if(elem.filters){ elem.style.filter = 'alpha(opacity=' + level + ')'; //必须设置zoom,要不然透明度在IE下不生效 elem.style.zoom = 1; } else{ //否则使用W3C的opacity属性 elem.style.opacity = level/100; } }; /* *让一个元素渐显(通过短时间内逐步增加透明度显示) */ XX.fadeIn = function(elem){ XX.setOpacity(elem, 0); XX.show(elem); for(var i = 0; i <= 100; i+=5){ //闭包函数 (function(){ var pos = i; setTimeout(function(){ XX.setOpacity(elem, pos); }, (pos + 1) * 10); })(); } };