Jquery源码分析---DOM元素(中)

5.2.2 width&heigth

对于元素的宽度和高度,dom元素提供了 client(clientHeight,clientWidth)、offset(offsetHeight,offsetwidth)、 scroll(srollHeight,srollWidth)三种方式,这三种有什么区别呢? client=content+padding。Offset=content+padding+border。Scroll的宽度和 高度都是没有经过scroll的原始宽度和高度。也就是这个一般会大于现在显示的 尺寸。

Jquery也提供了三种相关的宽度和高度。Height", "Width"是元素的content的宽度和高度。innerHeigh, innerWidth是 在元素的内容之上加上padding。其实就是clientHeight,clientWidth。 outerHeigh、outerWidth是在元素的内容上加上padding、border、margin。

Jquery的这三类方法比元素的方法的好处在于它们能测量不可见的元素 的宽度和高度。

另外document.body 的值在不同浏览器中有不同解释( 实际上大多数环境是由于对 document.body 解释不同造成的,并不是由于对 offset 解释不同造成的)document.documentElement是兼容的。

// 为jQuery对象注册height,width方法
//取得第一个匹配 元素当前计算的高(宽)度值(px)。或设值
//在 jQuery 1.2 以后可以 用来获取 window 和 document 的高(宽)jQuery.each(["Height", "Width"],
function(i, name) {
  var type = name.toLowerCase();
  jQuery.fn[type] = function(size) {// window的宽度和高度
   return this[0] == window ? (// window的宽 度和高度  ①
       jQuery.browser.opera&& document.body["client" + name]
     || jQuery.browser.safari&& window["inner" + name]
|| document.compatMode == "CSS1Compat"&& document.documentElement["client"+ name]
|| document.body["client"+ name])
     : this[0] == document ? (// document的宽度和高度  ②
       Math.max (Math.max(                                 document.body["scroll"+ name], 
            document.documentElement["scroll"+ name]),
Math.max(
document.body["offset"+ name],         document.documentElement["offset"+ name])))
: (size == undefined ? (// 第一个元素的的宽度和高度   ③
        this.length ? jQuery.css(this[0], type) : null)
           : // 设定当前对象所有元素宽度和高度
       this.css (type, size.constructor == String?
size: size+ "px"));
     };
});

在上面的代码 中可以看出"Height", "Width"分成三个部分,①处是对 window的宽高取值,这其实就是document的client的宽高度。 document.documentElement指的是<html>,而document.body指的是 <body>它们两者之间的区别不大。CSS1Compat的模式下,body外的元素都 不会计算宽高的。

②是对document求宽高,它的的值可能会大于window 。因为offset比client多了一个border的尺寸。而且document还会取比offset大 的scroll。

③是取或设其它元素的宽高。取值是通过jQuery.css来完成 的,而设值是通过this.css来完成的,这个在5.2.1中讲过。接下看看 jQuery.css。

// 取得elem的name的属性值
css : function(elem, name, force) {
  // 对元素的宽度高度修正
   if (name == "width" || name == "height") {
   var val,props = {position : "absolute",
  visibility : "hidden",display : "block"},
     which = (name == "width" ? ["Left", "Right"] : ["Top","Bottom"]);
function getWH() {// 求元素的实际高度,宽度 offsetWidth=padding+border+element
    val = name == "width"? elem.offsetWidth: elem.offsetHeight;    var padding = 0, border = 0;
    jQuery.each(which, function() {
      padding += parseFloat(  // paddinLeft,paddingRight
jQuery.curCSS(elem, "padding" + this, true))|| 0;
      border += parseFloat(// borderLeftWidth,borderRightWith
jQuery.curCSS(elem, "border"+ this + "Width", true))|| 0;
            });
           //http://msdn.microsoft.com/en-us/library/ms530302(VS.85).aspx   //http://msdn.microsoft.com/en-us/library/ms534304(VS.85).aspx
//offsetwidth-paddinLeft-paddingRight-orderLeftWidth- borderRightWith
  val -= Math.round(padding + border);//height 也同样要减去。
  }
//可见就取得实际元素的w,h。除 padding,border
if (jQuery(elem).is(":visible"))getWH ();
// 元素看不到的情况下,通过使元素暂时为绝对定位, display:block等来取高度或宽度
else jQuery.swap(elem, props, getWH);
return Math.max(0, val);
  }
return jQuery.curCSS(elem, name, force);
},

时间: 2024-12-31 13:54:18

Jquery源码分析---DOM元素(中)的相关文章

Jquery源码分析---DOM元素(上)

5.1 dom元素的属性 对dom元素的操作,对元素的属性进行操作是很重要的一项.我们可以通过 dom元素的原始方法对元素元素进行操作,但是由于浏览器的兼容等各方面的问 题,jquery和其它的lib一样,都提供了一个完好兼容的操作. 5.1.1 Attr 名称及描述 返回 兼容性 ( ) 当前节点给定Name的属性值     ( , ) 当前节点给定namespace,Name的属性值     ( ) 取当前节点给定name的属性节点.     ( , ) 取当前节点给定namespace,n

Jquery源码分析---DOM元素(下)

5.3.2 insert 在IE中提供了insertAdjacentElement()方法,这个方 法比insertBefore()和appendChild()好用.为了保证兼容性,像 prototype,mootools,Ext都提供了一个类似的方法,之后在扩展出四个方法. 分别在元素的前面或后面,元素的内部开始或内部结束处四个地方插入元素. Jquery也一样,提供了domManip(),这个函数和 insertAdjacentElement类似,不同的是它采用回调函数做swhere的类似参

jQuery源码分析之jQuery.fn.each与jQuery.each用法_jquery

本文实例讲述了jQuery源码分析之jQuery.fn.each与jQuery.each用法.分享给大家供大家参考.具体分析如下: 先上例子,下面代码的作用是:对每个选中的div元素,都给它们添加一个red类 复制代码 代码如下: $('div').each(function(index, elem){       $(this).addClass('red'); } }); 上面用的的.each,即jQuery.fn.each,其内部是通过jQuery.each实现的 复制代码 代码如下: j

jQuery源码分析-03构造jQuery对象-工具函数_jquery

作者:nuysoft/高云 QQ:47214707 EMail:nuysoft@gmail.com 声明:本文为原创文章,如需转载,请注明来源并保留原文链接. 读读写写,不对的地方请告诉我,多多交流共同进步,本章的的PDF等本章写完了发布. jQuery源码分析系列的目录请查看 http://nuysoft.iteye.com/blog/1177451,想系统的好好写写,目前还是从我感兴趣的部分开始,如果大家有对哪个模块感兴趣的,建议优先分析的,可以告诉我,一起学习. 3.4 其他静态工具函数

jQuery源码分析之jQuery中的循环技巧详解_jquery

jQuery的源码中有很多值得学习借鉴的技巧,本文即收集了jQuery中出现的各种遍历技巧和场景.具体分析如下: // 简单的for-in(事件) for ( type in events ) { } // 缓存length属性,避免每次都去查找length属性,稍微提升遍历速度 // 但是如果遍历HTMLCollection时,性能提升非常明显,因为每次访问HTMLCollection的属性,HTMLCollection都会内部匹配一次所有的节点 for ( var j = 0, l = ha

Jquery源码分析---导言

jQuery是一个非常优秀的JS库,与Prototype,YUI,Mootools等众多的Js类库 相比,它剑走偏锋,从web开发的实用角度出发,抛除了其它Lib中一些中看但不 实用的东西,为开发者提供了优美短小而精悍的类库.其使用简单,文档丰富, 而且性能高效,能极大地提高web系统的开发效率.因此可以说是web应用开发中 最佳的Js辅助类库之一.大部分开发者正在抛弃Prototype,而选择Jquery做为 他们进行web开发的JS库. 如是开发人员仅仅只知道文档中的简单的使用 方法,却不明

jQuery 源码分析 CSS 操作原理

jquery.fn.css获取当前jQuery所匹配的元素中第一个元素的属性值[$(-).css(cssName),注意这个cssName可以是数组]或给当前jQuery所匹配的每个元素设置样式值[$(-).css(cssname,value) / $(-).css(obj)]; 可以看见函数内部直接调用了jquery.access来处理.access将当前多个元素组成的jQuery对象所匹配的元素分解成单一元素逐个调用第二个参数中的回调function( elem, name, value )

jQuery源码分析-01总体架构分析_jquery

1. 总体架构 1.1 自调用匿名函数 self-invoking anonymous function 打开jQuery源码,首先你会看到这样的代码结构: 复制代码 代码如下: (function( window, undefined ) { // jquery code })(window); 1. 这是一个自调用匿名函数.什么东东呢?在第一个括号内,创建一个匿名函数:第二个括号,立即执行 2. 为什么要创建这样一个"自调用匿名函数"呢? 通过定义一个匿名函数,创建了一个"

Jquery源码分析---概述

jQuery是一个非常优秀的JS库,与Prototype,YUI,Mootools等众多的Js类库 相比,它剑走偏锋,从web开发实用的角度出发,抛除了其它Lib中一些不实用的 东西,为开发者提供了短小精悍的类库.其短小精悍,使用简单方便,性能高效 ,能极大地提高开发效率,是开发web应用的最佳的辅助工具之一.因此大部分 开发者在抛弃Prototype而选择Jquery来进行web开发. 一些开发人员在使用jquery时,由于仅仅只知道Jquery文档中的使用方法, 不明白Jquery的运行原理