scroll、offset、client
scroll
使用场景:
我们想要页面滚动一段距离,比如100px,就让某些元素显示隐藏,那我们怎么知道,页面滚动了100像素呢? 就可以使用scroll 来检测页面滚动的距离~~~
获取宽高:
获取元素的内容总宽高(不包含滚动条)返回值不带单位 scrollWidth和scrollHeight(dom.scrollWidth和dom.scrollHeight)
获取位置:
获取元素内容往左、往上滚出去看不到的距离 scrollLeft和scrollTop(dom.scrollLeft和dom.scrollTop) 这两个属性是可以修改的
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
div {
width: 300px;
height: 300px;
overflow: scroll;
}
</style>
</head>
<body>
<div>
<h1>1</h1>
<h1>2</h1>
<h1>3</h1>
<h1>4</h1>
<h1>5</h1>
<h1>6</h1>
<h1>7</h1>
<h1>8</h1>
<h1>9</h1>
<h1>10</h1>
<h1>11</h1>
<h1>12</h1>
<h1>13</h1>
<h1>14</h1>
<h1>15</h1>
<h1>16</h1>
<h1>17</h1>
<h1>18</h1>
<h1>19</h1>
<h1>20</h1>
<h1>21</h1>
<h1>22</h1>
<h1>23</h1>
<h1>24</h1>
<h1>25</h1>
<h1>26</h1>
<h1>27</h1>
<h1>28</h1>
<h1>29</h1>
<h1>30</h1>
<h1>31</h1>
<h1>32</h1>
<h1>33</h1>
<h1>34</h1>
<h1>35</h1>
<h1>36</h1>
<h1>37</h1>
<h1>38</h1>
<h1>39</h1>
<h1>40</h1>
<h1>41</h1>
<h1>42</h1>
<h1>43</h1>
<h1>44</h1>
<h1>45</h1>
<h1>46</h1>
<h1>47</h1>
<h1>48</h1>
<h1>49</h1>
<h1>50</h1>
</div>
<script>
const div = document.querySelector('div')
div.addEventListener('scroll', function() {
console.log(div.scrollHeight); //返回滚动元素高
console.log(this.scrollTop); //返回滚动元素滚动值
})
</script>
</body>
</html>
offset
使用场景: 前面案例滚动多少距离,都是我们自己算的,最好是页面滚动到某个元素,就可以做某些事。 简单说,就是通过js的方式,得到元素在页面中的位置这样我们可以做,页面滚动到这个位置,就可以返回 顶部的小盒子显示…
获取宽高:
获取元素的自身宽高、包含元素自身设置的宽高、padding、border offsetWidth和offsetHeight
获取位置:
获取元素距离自己定位父级元素的左、上距离 offsetLeft和offsetTop 注意是只读属性
问题
offsetTop和offsetLeft 得到位置以谁为准? 带有定位的父级 如果都没有则以 文档左上角 为准
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.parent {
width: 600px;
height: 600px;
background-color: red;
position: fixed;
top: 100px;
left: 200px;
}
.offsetdom {
width: 300px;
height: 300px;
background-color: pink;
overflow: scroll;
}
</style>
</head>
<body>
<div class="parent">
<h1>007</h1>
<div class="offsetdom"></div>
</div>
<script>
const offsetdom = document.querySelector('.offsetdom')
console.log(offsetdom.offsetHeight); //获取元素高度,包括滚动条
console.log(offsetdom.offsetWidth); //元素宽
console.log(offsetdom.offsetTop); //元素相对父盒子水平距离
console.log(offsetdom.offsetLeft); //相对父盒子的垂直距离
</script>
</body>
</html>
client
获取宽高:
获取元素的可见部分宽高(不包含边框,滚动条等,但是包含内外边距) clientWidth和clientHeight
获取位置:
获取左边框和上边框宽度 clientLeft和clientTop 注意是只读属性(返回的是边框的大小,但是没有右下边框属性)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
div {
width: 300px;
height: 300px;
background-color: red;
box-sizing: border-box;
padding: 10px;
margin: 10px;
border: 10px solid #000;
}
</style>
</head>
<body>
<div></div>
<script>
const div = document.querySelector('div')
console.log(div.clientHeight);//返回可视区域高,但是不包括边框和滚动条
console.log(div.clientWidth);
console.log(div.clientLeft);//返回边框大小
console.log(div.clientTop);
</script>
</body>
</html>
三者的区别
scroll家族
获取元素内容的总大小 获取元素向左向上滚出去看不见的距离 可读写属性
offset家族
获取元素自身大小:包括自身设置的宽高、padding、border 获取元素距离定位父级的左和上距离 只读属性
client家族
获取元素可见区域的大小(不包括border和scroll滚动条) 获取元素左、上边框距离 只读属性
事件对象中的client和offset
clientX/clientY
获取光标相对于浏览器可见窗口左上角的位置
window.addEventListener('mousemove', (event) => { //绑定鼠标移动事件
console.log(event.clientX, event.clientY);
})
//输出鼠标所在的坐标值
offsetX/offsetY
获取光标相对于当前DOM元素左上角的位置
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
div {
width: 400px;
height: 400px;
background-color: red;
}
</style>
</head>
<body>
<div></div>
<script>
const div = document.querySelector('div')
div.addEventListener('click', function(event) {
console.log(event.offsetX, event.offsetY);
//输出相对DOM元素左上角的坐标
})
</script>
</body>
</html>