元素操作(sizing,尺寸获取,设值,偏移算法,坐标算法)
css3的Sizing
Box-sizing是css3的box属性之一,遵循css的boxmodel原理,css中box model是分为两种,第一种是w3c的标准模型,另一种是ie的传统模型,他们相同之处都是对元素极端的模型,具体说就是对元素的width,height,padding,border以及元素实际尺寸的计算关系。
w3c的标准box model
外盒尺寸计算(元素控件尺寸)
Element空间高度 = content height +padding+border+margin
Element空间宽度 = content width +padding+border+margin
内盒尺寸计算(元素大小)
Element Height = content Height+padding+border(height为内容的高度)
Element Width = content Width +padding+border(width为内容的宽度)
ie传统下Box Model(ie6一下,不包括ie6版本)
外盒尺寸计算(元素空间尺寸)
Element空间的高度 = content heigth +margin(height包含了元素内容宽度,边框宽度,内距宽度)
Element空间的宽度 = content Width +margin(Width包含了元素内容宽度,边框宽度,内距宽度)
内盒尺寸计算(元素大小)
Element height = content height (height包含了的元素内容高度,边框高度,内距高度)
Element Width = content width(width包含了元素内容宽度,边框宽度,内距宽度)
box-sizing属性定义盒元素尺寸的计算方法:
content-box:默认值,计算方法为width/height = content,表示指定的宽度和高度仅限内容区域,边框和内边距的宽度不包含在内
padding-box:计算方法为width/height = content+padding,表示指定的宽度和高度包含内边距和北荣区域,边框宽度不包含在内
border-box:计算方法为width/height = content+padding+border,表示指定的w/h包含边框,内边距和内容区域。
inherit:表示继承父元素中box-sizing属性的值
正常情况下offsetWidth,offsetHeight获取元素的尺寸是足够了,但是某些元素比如SVG,MathML返回尺寸出错(这里不考虑),css3增加了一个box-sizing选择盒子模型,于是jquery里面就引入了augmentWidthOrHeight这个方法来处理因为box-sizing设置导致的问题,augmentWidthOrHeight这个方法其实就是对盒子模型的一个处理,所以jquery获取一个元素的w/h都是,ele.offsetW/H+augmentHeight方法也可以。
关于augmentWidthOrHeight方法
1.8增加了对css属性box-sizing的支持,需要与1.7.2的区别了,1.7.2和以前的版本无论是否定义box-sizing:border-box返回的都是盒模型中元素内容的W/H,不包括padding和border
augmentWidthOrHeight方法是特别针对盒子模型的处理,可通过将box-sizing设置为border-box,这可以令浏览器呈现带有指定宽度和高度的框,并把边框和内边距放入框中。
尺寸获取
有三种方法能够确定浏览器的尺寸(浏览器的窗口,不包括工具栏和滚动条)
对于ie,chrome,ff,opera,safari:
窗口显示区(可视区域)的宽度和高度,包括滚动条
window.innerHeight:ie不支持该属性,ie中的body元素clientHeight属性与该属性相同,window.innerWidth,ie不支持该属性,ie中的body元素的clientWidth属性与该属性相同。
对于ie5,6,7,8
窗口显示区(可视区域)的宽度和高度,不包括滚动条区域
document.documentElement.clientHeight
document.documentElement.clientWidth
或者
document.body.clientHeight/W
对于元素宽度尺寸的获取,jquery提供了width方法
对于文档级非普通元素window,document的宽度获取
$(window).width()代表了当前浏览器可见区域的宽度
$(document).width()则代表了整个文档的宽度,可以有滚动内容
window反应的是视图窗口,没有用window.innerWidth(包括滚动条区域),而是采用window.documentElement.clientWidth(不包括滚动条区域),document是反映了实际内容区间,那么可以存在溢出滚动,所以就是
document.documentElement.scrollWidth
document.body.scrollWidth
由于兼容问题就取2者之中的最大值
1,元素的宽度可以是内联或者通过link定义,所以通过style是不可取的
2,元在隐藏状态下是不能获取任何尺寸的display:none
3,css3引入了box-sizing的设置
jquery的处理
width,height在内部最终调用的是是jquery.css(elem,type,extra)方法,jquery.css是最终的一个针对所有css处理的接口。
display:none的状态下是无法获取元素的尺寸的,所以jquery在最开始之前必须要检测下这个状态,这个处理是通过钩子jquery,cssHooks["width"].get方法调用:
^(none|table(?!-c[ea]).+)/test(jQuery.css(elem, "display")) //代码很简单通过判断得到的值
当检测到是none的情况下, 就要把display设置为block,不行这样就改变了布局的原意了,本来就是隐藏的,jquery就会对元素增加position:absolute,visiblity:hidden,这样的属性达到display的效果,因为在visibility:hidden的请款下,是可以获取值的,只是对于用户可不见而已。
获取元素的尺寸值我们有offsetWidth,与offsetHeight,大多情况下是不够用了,但是有一种情况如果元素采用boxSizing处理,所以jquery好药对BorderBox情况的检测.
尺寸设值
当调用.width方法的时候,这个value参数可以是一个字符串或者一个数字,如果这个value参数只提供一个数字,jquery会自动加上单位px,如果只提供一个字符串,人格有效的css尺寸都可以为宽度赋值(100px 50%,auto),css宽度属性不包含padding,border,margin,除非box-sizing css属性被使用
如果没有明确的给单位,那么默认情况下px会被直接添加上去
.width设置的容器宽度是根据css box-sizing属性来定的,将这个属性改成border-box将造成这个函数改变成获取这个容器的outerWidth替换原来的内容宽度,可以直接用style这个接口直接操作直接注意的就是单位的转化数字需要加上px,还有box-sizing的处理
偏移算法
offsetWidth = borderleftW+paddingleftW+Widht+paddingrightW+borderrightW;
offsetHeight = bordertopW+paddingTop+height+paddingBottom+borderbottomW;
不再考虑box-sizing的情况下, 也就差不多了,但是关于尺寸的接口还有:innerW,innerH,outerW,outerH等
innerW/H
用于获取匹配集合中第一个元素的当前计算的内部宽高(padding,但不包括border),或设置每一个匹配元素的内部宽高
outerW/H
获取元素集合中第一个元素的当前计算宽高值,包括padding,border和选择的margin
innerW = ele.offsetW-ele.borderRightW-ele.borderLeftW
innerH = ele.offsetH-ele.borderTopHeight-ele.borderbottomHeight
outerW = ele.offsetW+ele.marginLeft+ele.marginRight
outerH = ele.offsetH+ele.marginTop+ele.marginBottom
坐标算法
获取位置又offset和position两个方法
offset方法允许我们检索一个元素相对于文档document的当前位置,他和position的差别在于,,position是相对于父级元素的位移。
当通过全局操作将一个新的元素放置到另一个已经存在的元素上面时,position是相对于父级元素的位移
当通过全局操作将一个新的元素放置到另一个已经存在的元素上面时,若要取得这个新的元素的位置, 那么使用offset更合适。
jquery不支持获取隐藏元素的偏移坐标,同样的,也无法取得隐藏元素的border,margin,padding信息,位置的方法没有像width/height一样去修复了display:none的情况,所以针对offset的定义是相对文档的,传统的说用offsetLeft和offsetTop是可以的,但是兼容各种浏览器就不行了,而且效率低
top: box.top + win.pageYOffset - docElem.clientTop,
left: box.left + win.pageXOffset - docElem.clientLeft
元素操作(sizing,尺寸获取,设值,偏移算法,坐标算法)的更多相关文章
- Java操作Linuxshell并且获取返回值
/** * */package com.king.weixin.util;import java.io.BufferedReader;import java.io.InputStream;/*** @ ...
- H5_0017:通过元素自定义属性值获取元素对象,并获取属性值
// 通过元素的属性值查找对象 // document.querySelectorAll("[data]").forEach(function(e) ...
- Spring 依赖注入 基于构造函数、设值函数、内部Beans、集合注入
Spring 基于构造函数的依赖注入_w3cschool https://www.w3cschool.cn/wkspring/t7n41mm7.html Spring 基于构造函数的依赖注入 当容器调 ...
- Spring 基于设值函数(setter方法)的依赖注入
当容器调用一个无参的构造函数或一个无参的静态 factory 方法来初始化你的 bean 后,通过容器在你的 bean 上调用设值函数,基于设值函数的 DI 就完成了. 下述例子显示了一个类 Text ...
- js获取浏览器和元素对象的尺寸
1.屏幕尺寸 window.screen.height //屏幕分辨率的高 window.screen.width //屏幕分辨率的宽 window.screen.availHeight //屏幕可用 ...
- 原生JS获取各种高度宽度、浏览器窗口滚动条的位置、元素的几何尺寸名
1)关于 pageX, clienX,offsetX,layerX pageX:鼠标在页面上的位置,从页面左上角开始,即是以页面为参考点,不随滑动条移动而变化 clientX:鼠标在页面上可视区域的位 ...
- 获取DOM元素位置和尺寸大小
JavaScript获取DOM元素位置和尺寸大小 在一些复杂的页面中经常会用JavaScript处理一些DOM元素的动态效果,这种时候我们经常会用到一些元素位置和尺寸的计算,浏览器兼容性问题也是不可忽 ...
- JQuery中根据属性或属性值获得元素(6种情况获取方法)
根据属性获得元素 1.比如要获取页面p标签中属性有id的元素 $("p[id]").css("color","red"); 根据属性值获得元 ...
- 如何通过源生js获取一个元素的具体样式值 /* getCss:获取指定元素的具体样式的属性值 curElement:[dom对象] attr:[string] */
昨天的博客些的真的是惨不忍睹啊!!!但是我的人生宗旨就是将不要脸的精神进行到底,所以,今天我又来了.哈哈哈哈哈! 方法一:元素.style.属性名:(这个有局限性--只能获取行内样式的值,对于样式表或 ...
随机推荐
- PLSQL Developer导入Excel数据
LSQL Developer导入Excel数据 最近处理将Excel数据导入Oracle的工作比较多.之前都是采用Sqlldr命令行导入的方式处理.每次导入不同格式的Excel表数据,都需要先把Exc ...
- MVC系列2-Model
上一篇我讲了ASP.MET MVC的基础概念,我相信从上一篇,我们可以知道MVC的执行过程.这一篇我们开始讲解Model.我们知道,在我们的应用程序中,大多时候是在遵循业务逻辑通过UI操作数据.所以这 ...
- Asp.Net中应用Aspose.Cells输出报表到Excel 及样式设置
解决思路: 1.找个可用的Aspose.Cells(有钱还是买个正版吧,谁开发个东西也不容易): 2.在.Net方案中引用此Cells: 3.写个函数ToExcel(传递一个DataTable),可以 ...
- WPF的路由事件、冒泡事件、隧道事件(预览事件)
本文摘要: 1:什么是路由事件: 2:中断事件路由: 3:自定义路由事件: 4:为什么需要自定义路由事件: 5:什么是冒泡事件和预览事件(隧道事件): 1:什么是路由事件 WPF中的事件为路由事件,所 ...
- IE8兼容性经验小结
DOCTYPE 首先需要确保HTML页面开始部分要有DOCTYPE声明.DOCTYPE告诉浏览器使用什么样的HTML或XHTML规范来解析HTML文档,具体会影响: 1.对标记,attributes, ...
- The first DP!
P3399 丝绸之路 题目背景 张骞于公元前138年曾历尽艰险出使过西域.加强了汉朝与西域各国的友好往来.从那以后,一队队骆驼商队在这漫长的商贸大道上行进,他们越过崇山峻岭,将中国的先进技术带向中亚. ...
- Python的SublimeText开发环境配置
1.完成Python的默认安装之后要设置环境变量,系统环境变量Path中加入Python的安装目录";C:/Python27" 2.配置Python编译环境,修改[C:\Progr ...
- [转]UE4 Blueprint编译过程
Blueprint 编译概述 一.术语 Blueprint,像C++语言一下的,在游戏中使用前需要编译.当你在BP编辑器中,点击编译按钮时候,BP资源开始把属性和图例过程转换为一个类对象处理. 1 ...
- 名词王国里的死刑execution in the kingdom of nouns
http://www.cnblogs.com/bigfish--/archive/2011/12/31/2308407.htmlhttp://justjavac.com/java/2012/07/23 ...
- R:incomplete final line found by readTableHeader on
报错: In read.table("abc.txt", header = T) : incomplete final line found by readTableHead ...