jQuery 1.9.1源码分析系列(十三)之位置大小操作


Posted in Javascript onDecember 02, 2015

先给大家展示谢

jQuery.fn.css (propertyName [, value ]| object )(函数用于设置或返回当前jQuery对象所匹配的元素的css样式属性值。如果需要删除指定的css属性,请使用该函数将其值设为空字符串("")

注意:1、如果省略了value参数,则表示获取属性值;如果指定了该参数,则表示设置属性值。2、css()函数的所有"设置"操作针对的是当前jQuery对象所匹配的每一个元素;所有"读取"操作只针对第一个匹配的元素。)

jQuery.fn.offset([coordinatesObj])(设置或返回当前匹配元素(将content+padding+border看成一个整体)相对于当前文档的偏移,也就是相对于当前文档的坐标。该函数只对可见元素有效。该函数返回一个坐标对象(Object),该对象有一个left属性和top属性。属性值均为数字,它们都以像素(px)为单位。与position()不同的是:offset()返回的是相对于当前文档的坐标,position()返回的是相对于其定位的祖辈元素的坐标。)

jQuery.fn.position()(返回当前匹配元素(将content+padding+border+margin看成一个整体)相对于其被定位的祖辈元素的偏移,也就是相对于被定位的祖辈元素的坐标。该函数只对可见元素有效。所谓"被定位的元素",就是元素的CSS position属性值为absolute、relative或fixed(只要不是默认的static即可)。该函数返回一个坐标对象,该对象有一个left属性和top属性。属性值均为数字,它们都以像素(px)为单位。与offset()不同的区别详见offset。此外,position()函数无法用于设置操作。如果当前元素的祖辈元素全部都是默认定位(static),那么该函数返回的偏移位置与offset()函数相同)

jQuery.fn.scrollLeft([ value ])(设置或返回当前匹配元素相对于水平滚动条左侧的偏移。当一个元素的实际宽度超过其显示区域的宽度时,在一定的设置下,浏览器会为该元素显示相应的水平滚动条。此时,scrollLeft()返回的就是该元素在可见的滚动区域左侧被隐藏部分的宽度(单位:像素)。

如果水平滚动条在最左侧(也就是可见区域左侧没有被隐藏的内容),或者当前元素是不可水平滚动的,那么scrollLeft()将返回0。对可见的和隐藏的元素均有效。)

jQuery.fn.scrollTop([ value ])(设置或返回当前匹配元素相对于垂直滚动条顶部的偏移。当一个元素的实际高度超过其显示区域的高度时,在一定的设置下,浏览器会为该元素显示相应的垂直滚动条。此时,scrollTop()返回的就是该元素在可见区域之上被隐藏部分的高度(单位:像素)。如果垂直滚动条在最上面(也就是可见区域之上没有被隐藏的内容),或者当前元素是不可垂直滚动的,那么scrollTop()将返回0。对可见的和隐藏的元素均有效)

jQuery.fn.height([ value ])(设置或返回当前匹配元素的高度。该高度值不包括元素的外边距(margin)、内边距(padding)、边框(border)等部分的高度。如下图

jQuery 1.9.1源码分析系列(十三)之位置大小操作

如果你要获取包括上述某部分在内的高度,请使用innerHeight()和outerHeight()。该函数属于jQuery对象(实例),并且对不可见的元素依然有效)

jQuery.fn.innerHeight([ value ])(设置或返回当前匹配元素的内高度。该高度值包括内边距(padding),但不包括元素的外边距(margin)、边框(border)等部分的高度。如下图:

jQuery 1.9.1源码分析系列(十三)之位置大小操作

该函数属于jQuery对象(实例),并且对不可见的元素依然有效)

jQuery.fn.outerHeight([includeMargin])(设置或返回当前匹配元素的外高度。该高度值包括内边距(padding) 、边框(border),但不包括元素的外边距(margin)部分的高度。你也可以指定参数为true,以包括外边距(margin)部分的高度如下图:

jQuery 1.9.1源码分析系列(十三)之位置大小操作

该函数属于jQuery对象(实例),并且对不可见的元素依然有效)

jQuery.fn.width([ value ])(描述:略)

jQuery.fn.innerWidth ([ value ])(描述:略)

jQuery.fn.outerWidth ([includeMargin])(描述:略)

借用孤月蓝风上色的详解图

 jQuery 1.9.1源码分析系列(十三)之位置大小操作

接下来分析部分函数。

a.jQuery.fn.offset分析

offset获取的方法如下(以top为例):

offset.top = elem距浏览器视窗顶部的位置 + 文档顶部被卷起来的部分 ? elem距离父元素上边框高度top。

jQuery处理就变成了:

box = elem.getBoundingClientRect();
  offset.top = box.top + ( win.pageYOffset || docElem.scrollTop ) - ( docElem.clientTop || 0 );

这里面IE8-和IE9+等现代浏览器有个差别,使用document.documentElement.getBoundingClientRect();IE8-的top/left值为-2px;其他现代浏览器top/left值为0px;可以看出IE8-浏览器是以窗口的(2,2)坐标为原点坐标的。

浏览器会默认body和窗口之间有8px的间隙,所以使用document.body.getBoundingClientRect(); 得到的top/left值为8px。

offset的设置方法如下(以top为例):

需要注意在设置之前,如果当前elem的position为static则要设置为relative才能处理

先得到要设置给elem的css特征top的值计算方法为

setTop = (要设置的offset top值 ? 当前元素的offset top值)+ elem的css top特征值

然后将setTop设置给elem的css top特征。

jQuery的处理就变成了:

   

var curElem = jQuery( elem ),
    curOffset = curElem.offset(),
    curCSSTop = jQuery.css( elem, "top" ),
    props = {}, curPosition = {}, curTop;
  //如果top值为auto且position为absolute或fixed则需要计算当前elem的css特征top的值
  if ( calculatePosition ) {
    curPosition = curElem.position();
    curTop = curPosition.top;
  } else {
    curTop = parseFloat( curCSSTop ) || ;
  }
  if ( options.top != null ) {
    props.top = ( options.top - curOffset.top ) + curTop;
  }
  curElem.css( props );

b.jQuery.fn.position

position只能获取不能设置,获取方法如下(以top为例):

position.top = elem的offsetTop - elem被定位的祖辈元素的offsetTop ? elem的marginTop值

这里面这个top就真的是elem的css属性top的值了。对于jQuery来说这个elem把width+padding+border+margin看成了一个整体,所以最终得到的top是elem这个整体距离被定为祖辈元素顶部内边的距离。

jQuery的处理变成了:

var offsetParent, offset,
    parentOffset = { top: 0, left: 0 },
    elem = this[ 0 ];
  //当元素为fixed定位是他的被定位的祖辈元素是window视窗(parentOffset = {top:0, left: 0}
  if ( jQuery.css( elem, "position" ) === "fixed" ) {
    //假设getBoundingClientRect可用
    offset = elem.getBoundingClientRect();
  } else {
    //获取offsetParent
    offsetParent = this.offsetParent();
    // Get correct offsets
    offset = this.offset();
    if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
      parentOffset = offsetParent.offset();
    }
    //增加边框
    parentOffset.top += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
  }
  return {
    top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true )
  };

里面jQuery.fn.offsetParent()函数获取最近的祖先定位元素。

offsetParent: function() {
      return this.map(function() {
        var offsetParent = this.offsetParent || document.documentElement;
        while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position") === "static" ) ) {
          offsetParent = offsetParent.offsetParent;
        }
        return offsetParent || document.documentElement;
      });    }

c.jQuery.fn.scrollLeft和jQuery.fn.scrollTop

这两个函数的获取和设置滚动条位置比较简单,以scrollTop为获取无非就只有两个函数window[ pageYOffset]或elem [scrollTop]。而设置直接使用window[scrollTo]或elem[scrollTop]

以上内容是小编给大家介绍的关于jQuery 1.9.1源码分析系列(十三)之位置大小操作,希望大家喜欢。

Javascript 相关文章推荐
一个JavaScript去除字符串末尾的空白实例代码
Sep 22 Javascript
Node.js中child_process实现多进程
Feb 03 Javascript
Yii2使用Bootbox插件实现自定义弹窗
Apr 02 Javascript
jQuery实现限制textarea文本框输入字符数量的方法
May 28 Javascript
在Web项目中引入Jquery插件报错的完美解决方案(图解)
Sep 19 Javascript
jquery append与appendTo方法比较
May 24 jQuery
浅谈AngularJS中$http服务的简单用法
May 15 Javascript
JS实现常见的查找、排序、去重算法示例
May 21 Javascript
微信小程序云开发之使用云函数
May 17 Javascript
搭建Vue从Vue-cli到router路由护卫的实现
Nov 14 Javascript
js实现复制粘贴的两种方法
Dec 04 Javascript
vue 把二维或多维数组转一维数组
Apr 24 Vue.js
解决jQuery使用JSONP时产生的错误
Dec 02 #Javascript
jquery实现触发时更新下拉列表内容的方法
Dec 02 #Javascript
jQuery简单实现input文本框内灰色提示文本效果的方法
Dec 02 #Javascript
jquery实现简单文字提示效果
Dec 02 #Javascript
分享15个大家都熟知的jquery小技巧
Dec 02 #Javascript
jQuery实现为控件添加水印文字效果(附源码)
Dec 02 #Javascript
jqGrid中文文档之选项设置
Dec 02 #Javascript
You might like
上海永华YH-R296(华普R-96)12波段立体声收音机的分析和打理
2021/03/02 无线电
Windows2003下php5.4安装配置教程(Apache2.4)
2016/06/30 PHP
Node.js实战 建立简单的Web服务器
2012/03/08 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(二)人物行走的实现
2013/01/23 Javascript
javascript简单事件处理和with用法介绍
2013/09/16 Javascript
页面元素绑定jquery toggle后元素隐藏的解决方法
2014/03/27 Javascript
JQuery中$(document)是什么意思有什么作用
2014/07/21 Javascript
Jquery设置attr的disabled属性控制某行显示或者隐藏
2014/09/25 Javascript
jquery实现简单合拢与展开网页面板的方法
2015/09/01 Javascript
JavaScript数组去重的五种方法
2015/11/05 Javascript
js使用cookie记录用户名的方法
2015/11/26 Javascript
node.js实现博客小爬虫的实例代码
2016/10/08 Javascript
React Native自定义控件底部抽屉菜单的示例
2018/02/08 Javascript
angular inputNumber指令输入框只能输入数字的实现
2019/12/03 Javascript
使用 Jest 和 Supertest 进行接口端点测试实例详解
2020/04/25 Javascript
JavaScript实现无限轮播效果
2020/11/19 Javascript
Python迭代用法实例教程
2014/09/08 Python
最大K个数问题的Python版解法总结
2016/06/16 Python
python入门:这篇文章带你直接学会python
2018/09/14 Python
python实现文件的备份流程详解
2019/06/18 Python
Python实现爬取网页中动态加载的数据
2020/08/17 Python
廉价航班、机票和酒店:JustFly
2018/02/07 全球购物
Fanatics英国官网:美国体育电商
2018/11/06 全球购物
牵手50新加坡:专为黄金岁月的单身人士而设的交友网站
2020/08/16 全球购物
一些Solaris面试题
2013/03/22 面试题
大学本科生的个人自我评价
2013/12/09 职场文书
销售会计岗位职责
2014/03/15 职场文书
2014年六一儿童节演讲稿
2014/05/23 职场文书
仲裁协议书
2014/09/26 职场文书
2014年文秘工作总结
2014/11/25 职场文书
婚礼迎宾词大全
2015/08/10 职场文书
协议书格式模板
2016/03/24 职场文书
村党总支部公开承诺书2016
2016/03/25 职场文书
go 原生http web 服务跨域restful api的写法介绍
2021/04/27 Golang
教你怎么用PyCharm为同一服务器配置多个python解释器
2021/05/31 Python
Python实现滑雪小游戏
2021/09/25 Python