offset系列
定位父级(偏移父级)
- offsetParent(偏移父级):返回与当前元素最近的经过定位(position不等于static)的父级元素,有如下情况:
- 若当前元素的父级元素没有进行CSS定位,offsetParent为body.
- 若当前元素自身有fixed定位,则返回null.(火狐返回body)
- 如果当前元素(自身无fixed定位)的父级元素中有进行CSS定位,offsetParent为离自身元素最近的有CSS定位的父级元素.
- body元素offsetParent返回null
偏移量
-
offsetWidth:
- 获取元素的可视宽度,无单位.
- 这个宽度包括元素的边框(border),水平 的padding,垂直滚动条宽度,元素本身宽度. (它不包括伪元素的宽度,如::before 或 ::after)
- 若元素被隐藏,则返回0.
-
offsetHeight:获取元素的可视高度,无单位;(其余上同)
-
offsetLeft:获取元素左外边框到定位父级的左内边框的像素距离;
-
offsetTop:获取元素伤外边框到定位父级的上内边框的像素距离;
- 没有脱离文档流:offsetLeft:父级元素margin+父级元素padding+父级元素border+自己的margin;(offsetTop同理)
- 脱离文档流:主要是自己的left(相对于父级)和自己的margin;
scroll系列(卷曲---滚出去)
- scrollWidth:元素中内容的实际的宽(没有边框,包含内边距),如果没有内容就是元素的宽
- scrollHeight:元素中内容的实际的高(没有边框,包含内边距),如果没有内容就是元素的高
- scrollTop:向上卷曲出去的距离
- scrollLeft:向左卷曲出去的距离
封装getScroll函数
//获取浏览器向上向左卷曲出去距离的值
function getScroll(){
return {
left : window.pageXOffset || document.documentElement.scrollLeft
|| document.body.scrollLeft || 0,
top : window.pageYOffset || document.documentElement.scrollTop
|| document.body.scrollTop || 0
};
}
//测试
window.onscroll = function(){
console.log(getScroll().top);
};
}
复制代码
client系列
- clientWidth: 可视区域的宽(没有边框),边框内部的宽度
- clientHeight: 可视区域的高(没有边框),边框内部的宽度
- clientLeft: 左边边框的宽度
- clientTop: 上边边框的宽度
- clientX(clientY):到顶部左部的可视距离
pageX(pageY):获取向上卷曲与可视距离的和(仅火狐和谷歌支持)
盒子跟着鼠标飞实例
谷歌火狐支持e对象 IE8支持window.event
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>title</title>
<style>
*{
margin: 0;
padding: 0;
}
body{
height: 2000px;
}
img{
position: absolute;
}
#box{
position: absolute;
width: 100px;
height: 100px;
border: 1px solid red;
}
#img{
position: absolute;
width: 100px;
height: 100px;
border: 1px solid green;
}
</style>
</head>
<body>
<div id="box"></div>
<div id="img"></div>
<script src="common.js"></script>
<script>
//图片跟着鼠标飞,可以中任何的浏览器中实现
//clientX 和 clientY 单独的使用的兼容代码
//scrollLeft 和 scroollTop 的兼容代码
//pageX, pageY 和 clientX + scrollLeft 和 clientY + scrollTop
//把代码封装在对象中
var evt = {
//window.event 和 事件参数对象e的兼容
getEvent:function(evt){
return window.event || e;
},
//可视区域的横坐标的兼容代码
getClientX:function(evt){
return this.getEvent(evt).clientX;
},
//可视区域的纵坐标的兼容代码
getClientY:function(evt){
return this.getEvent(evt).clientY;
},
//页面向左卷曲出去的横坐标
getScrollLeft:function(){
return window.pageXOffset || document.body.scrollLeft
|| document.documentElement.scrollLeft || 0;
},
//页面向上卷曲出去的纵坐标
getScrollTop:function(){
return window.pageYOffset || document.body.scrollTop
|| document.documentElement.scrollTop || 0;
},
//相对于页面的横坐标(pageX 或者 clientX+scrollLeft)
getPageX:function(evt){
return this.getEvent(evt).pageX ? this.getEvent(evt).pageX : this.getClientX(evt) + this.getScrollLeft();
},
//相对于页面的纵坐标(pageX 或者 clientY + scrollTop)
getPageY:function(evt){
return this.getEvent(evt).pageY ? this.getEvent(evt).pageY : this.getClientY(evt) + this.getScrollTop();
}
}
document.onmousemove=function (e) {
my$("box").style.left=evt.getPageX(e)+"px";
my$("box").style.top=evt.getPageY(e)+"px";
};
</body>
</html>
复制代码
------------------------------------------------------记录于 2019.4.16 JavaScript之BOM