[TOC]
## DOM元素下的属性和方法
### 一览
```
var oBox = document.getElementById("box");
console.dir(oBox);
```
![](https://box.kancloud.cn/1e1fb429bdaff3e0904f8522849c50cd_529x374.png)
这里只罗列了部分
### 关于__proto__
`div#box` -> HTMLDivElement.prototype -> HTMLElement.prototype -> Element.prototype -> Node.prototype -> EventTarget.prototype -> Object.prototype
>**注:** 上面的`->` 代表 `__proto__` 指向
### 获取attr(属性和方法)
```
<div id="box" name="ahhh"></div>
```
>[warning]attributes没有问题,但attributes下的方法->兼容性:ie10+
```
console.log('--',oBox.attributes.name,'--') // -- name='ahhh' --
console.log(oBox.attributes.getNamedItem('name')); // name = 'ahhh'
console.log(oBox.attributes[1]); // name = 'ahhh'
console.log(oBox.attributes.item(1)); // name = 'ahhh'
```
>[success]兼容性:无
```
// 注意,这个,这货,才兼容IE9,且获取的直接是值
console.log(oBox.getAttribute('name')); //ahhh
```
### classList 添加或删除类名(方法)
>[warning]兼容性:ie10+
相较于 `className` ,classList能允许我们通过`.classList.add`和`.classList.remove`方法直接往类名的集合中添加或删除某个类名,而className需要我们进行一些字符串方法的操作才能做到。
### style样式属性:囊括所有css属性(这个style样式属性可读写)
- 此属性可读写
- 只能获取行内样式
## 13个核心JS盒子模型属性
**首先这13个属性都是原生CSS所不具备的,其次它们不带单位,并且所有值都是经过四舍五入的整数。另外13个值中有11个值都是只能读取不能写入的,除了scrollTop/scrollLeft这两个**
### 三个系列
这13个属性主要分为3个系列,每个系列各自有4个带有`w/h/l/t`字眼的长相类似的属性,另外 `offset` 系列还多一个属性为 `offsetParent`。
每个系列有一点是共通的,那就是它们都有关于 `wdith/height` 的获取,虽然有的要获取的只有真实内容的大小,有的包括填充,有的包括边框、
但它们又是不同的,每种系列都有自己独有的特点,这特点主要和 `left/top` 有关。
### client系列
client系列主要是用来获取一个元素的**可见**大小的,什么是可见的呢?能够着色的`border`、`padding`、`width/height` 即是可见的。 **但clietnWidth/Height是不包括border的,它的clientLeft/Top可以用来获取对应的左边框和上边框**
### offset系列
offsetWidth/Height相较于client系列还包括了border的大小,
至于它独有的有个性的部分,在于它的offsetLeft/Top获取的是该元素相较于定位父级的距离(该元素的外边框到定位父级的内边框(即不包含定位父级的边框))。
并且我们还能通过 `offsetParent` 获取到该元素的定位父级。
#### 获取元素距离视口的距离
![](https://box.kancloud.cn/f4ff61bd0253df49ef1f450da44e7531_607x276.png)
>[info] **注意:** body的offsetParent为null。
```
var isIE8 = (navigator.userAgent.indexOf("MSIE 8.0") === -1) ? true : false; // ie8的offsetLeft会自动包含clientLeft/Top
function offset(curEle) {
var totalLeft = null, totalTop = null, parent = curEle.offsetParent;
totalLeft += curEle.offsetLeft;
totalTop += curEle.offsetTop;
while (parent) {
// -> 累加父级参照物的边框
if (!isIE8) {
totalLeft += parent.clientLeft;
totalTop += parent.clientTop;
}
// -> 累加父级参照物本身的偏移
totalLeft += parent.offsetLeft;
totalTop += parent.offsetTop;
parent = parent.offsetParent;
}
return { left: totalLeft, top: totalTop }
}
```
### scroll系列
```
-> scrollWidth/scrollHeight:和我们的clientWidth/clientHeight一模一样(前提是:容器中的内容没有溢出的情况下)
->如果容器中的内容有溢出,我们获取的结果是如下规则
scrollWidth:真实内容的宽度(包含溢出)+左填充
scrollHeight:真实内容的高度(包含溢出)+上填充
->获取到的结果都是【约等于】的值
因为:
同一个浏览器,我们是否设置了overflow='hidden'对于最终的结果是有影响的(虽然差距不是很大);
在不同的浏览器中我们获取的结果也是不相同的
-> scrollLeft/scrollTop:滚动条卷去的宽度/高度
scroll:auto
浏览器窗口
当前浏览器可视窗口的宽度和高度(一屏幕的)
-> document.documentElement.clientWidth
-> document.documentElement.clientHeight
当前页面的真实宽度和高度(所有屏加起来的宽度和高度~但是一个约等于的值)
-> document.documentElement.scrollWidth
-> document.documentElement.scrollHeight
卷去宽高
-> document.documentElement[attr]||document.body[attr];
必须是documetElement在前
-> 编写一个有关操作浏览器盒子模型的方法
如果只传递了attr没有传递value,默认的意思是获取样式值
如果两个参数都传递了,意思是设置某一个样式属性的值
-> 不严谨来说这就是有关于"类的重载“:同一个方法,通过传递参数的不同实现不同的功能
```
```
function win(attr,value){
if(typeof value === "undefined"){
return document.documentElement[attr]||document.body[attr];
}
// -> "设置"
document.documentElement[attr] = value;
document.body[attr] = value;
}
```
```
// -> 之前我们学习的JS盒子模型中:client系列offset系列scrollWidth/scrollHeight都是 ‘只读’属性 -> 只能通过属性获取值,不能通过属性修改样式
// scrollTop / scrollLeft :滚动条卷去的高度/宽度(这两个属性是唯一可读写的属性)
box.scrollTop = 0; // -> 直接回到了容器的顶部 和负无穷是等效的
// -> 我们的scrollTop的值是存在边界值(最大和最小值的),我们设置的值比最小值或则比最大的都没用,起到效果的依然是边界的值
//[最大值是?]
// 最大值是 = 真实的高度 - 当前容器一屏幕的高度
var maxTop = box.scrollHeight - box.clientHeight;
console.log(maxTop);
box.scrollTop = maxTop+10;
console.log(box.scrollTop); //258
box.scrollTop = -9999999;
console.log(box.scrollTop); // 0
// document.documentElement.scrollTop||document.body.scrollTop;
```
## 其它有意思的属性和方法
- baseURI 当前页面地址
- contentEditable
默认值为:"inherit" ,设置为true 可以把一个元素当做文本编辑器 相当于input
- outerHTML 包含标签
- contentEditable:"inherit" //设置为true 可以把一个元素当做文本编辑器 相当于input
## getComputedStyle获取计算后的CSS样式值
ie低版本不支持,但可以用其独有的currentStyle替代,另外需要注意几点
- currentStyle只支持小驼峰的命名方式,getComputedStyle小驼峰和串烧都支持
- currentStyle中关于透明属性的值是像这样的`(opacity=50)`
- 因为获取的的都是原生css属性值,故都是带单位的
### 兼容写法
```
function getCss(curEle,attr,pseudo){ // ['sʊdo] 伪君子 假冒的人
var val = null
,reg = null;
if("getComputedStyle" in window){ //if(window.getComputedStyle) //但这种要将undefined转换为false 稍微耗一点性能
pseudo = pseudo?pseudo:null;
val = window.getComputedStyle(curEle,pseudo)[attr];
}else{
if(attr === "opacity"){ // opacity在ie6~8下需要兼容
//(opacity=10)
reg = /^alpha\(opacity=(\d+)(?:\.\d+)?\)$/i;
val = curEle.currentStyle["filter"];
val = reg.test(val)?reg.exec(val)[1]/100:1;
}else{
val = curEle.currentStyle[attr];
}
}
reg = /^(-?\d+(\.\d+)?)(px|pt|rem|em)?$/i;
return reg.test(val)?parseInt(val):val;
}
```
### 关于伪类
不兼容IE低版本
```
p:before{
color:red
,font-size:14px
}
//--- --- ---
var oP = document.querySelector('p');
window.getComputedStyle(oP,'before').color
...
```
## 浏览器窗口
各浏览器之间对于视口的`scrollTop/Left`是放在`documentElement`上还是`body`上存在争议,
故需要兼容。
### 兼容写法
见上面的13个核心属性的末尾。
## 关于查找父级(非定位)
![](https://box.kancloud.cn/00b24bd2305694a87a7b437fe7d84ae0_599x236.png)
- 空白目录
- window
- location
- history
- DOM
- 什么是DOM
- JS盒子模型
- 13个核心属性
- DOM优化
- 回流与重绘
- 未整理
- 文档碎片
- DOM映射机制
- DOM库封装
- 事件
- 功能组件
- table
- 图片延迟加载
- 跑马灯
- 回到顶部
- 选项卡
- 鼠标跟随
- 放大镜
- 搜索
- 多级菜单
- 拖拽
- 瀑布流
- 数据类型的核心操作原理
- 变量提升
- 闭包(scope)
- this
- 练习题
- 各种数据类型下的常用方法
- JSON
- 数组
- object
- oop
- 单例模式
- 高级单例模式
- JS中常用的内置类
- 基于面向对象创建数据值
- 原型和原型链
- 可枚举和不可枚举
- Object.create
- 继承的六种方式
- ES6下一代js标准
- babel
- 箭头函数
- 对象
- es6勉强笔记
- 流程控制
- switch
- Ajax
- eval和()括号表达式
- 异常信息捕获
- 逻辑与和或以及前后自增
- JS中的异步编程思想
- 上云
- 优化技巧
- 跨域与JSONP
- 其它跨域相关问题
- console
- HTML、XHTML、XML
- jQuery
- zepto
- 方法重写和方法重载
- 移动端
- 响应式布局开发基础
- 项目一:创意简历