第二十四章.各种宽高、距离的获取
1.可视区宽高
-
窗口宽高
window.innerWidth window.innerHeight
包含了滚动条的宽度和浏览器本身的边框宽度(低版本IE不支持)。
-
内容区宽高
document.documentElement.clientWidth
document.documentElement.clientHeight
不包含滚动条等。
2.元素的各种宽高
-
client
clientWidth clientHeight
宽(高)+padding。
-
offset
offsetWidth offssetHeight
宽(高)+padding+border。
-
scroll
scrollWidth / scrollHeigh
内容的实际高度,当内容没超出相当于client,当内容超出之后,会得到包括超出内容的实际高度,即使加了超出隐藏,也还是会得到内容所占的实际高度。
3.元素的各种距离
-
offset
offsetLeft offsetTop
获取左边(上边),到定位父级的左边(上边)的距离。
-
getBoundingClientRect
返回一个对象,包含了元素各边到窗口的距离,返回的结构类似于:{top:100,left:20,bottom:500,right:890}。
4.滚动距离
-
页面滚动宽高
doucment.documentElement.scrollTop
document.documentElement.scrollLeft
页面的滚动宽(高)。此属性可以赋值,能让页面滚动到指定的位置。
设置滚动距离也可以使用
window.scrollTo()
。 -
元素滚动宽高
元素节点.scrollTop 元素节点.scrollLeft
-
可视区的宽高
<body style="height: 2000px">
<div></div>
<script>
//(只读)
//包含滚动条
console.log(window.innerWidth, window.innerHeight);//1536 307
//不包含滚动条
console.log(
document.documentElement.clientWidth,
document.documentElement.clientHeight
);//1519 307
</script>
- 一个元素宽高的获取
<style>
#wrap{
/*box-sizing: border-box;*/
overflow: hidden;
width: 100px;
height: 150px;
background-color: pink;
padding: 10px 20px;
border: 3px solid red;
margin: 20px;
}
</style>
<div>
<div id="wrap">
neirongneirongneirongneirongneirongneirongneirongneirongneirongneirongneirongneirongneirongneirongneirongneirongneirong
内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容
</div>
</div>
<script>
//(只读)
let oWrap = document.getElementById("wrap");
/*
* clientWidth clientHeight(掌握)
* ( content + padding )
* */
console.log(oWrap.clientWidth, oWrap.clientHeight);//140 170
/*
* offsetWidth offsetHeight(掌握)
* ( content + padding + border )
* */
console.log(oWrap.offsetWidth, oWrap.offsetHeight);//146 176
/*
* scrollWidth scrollHeight(了解)
* (元素内容没有超出盒子的时候,值和client一样)
* (如果内容超出了盒子,获取真实盒子宽高)
* */
console.log(oWrap.scrollWidth, oWrap.scrollHeight);//1053 207
/*
* .style.width
*
* 获取元素最终显示样式
* getComputedStyle( ele )
*
* */
// console.log( oWrap.style.width ); //只能获取到行内样式
console.log( getComputedStyle(oWrap).width );//100px
console.log( getComputedStyle(oWrap).backgroundColor );//rgb(255,192,203)
</script>
- offsetLeft、offsetTop
<style>
*{margin:0;padding:0;font-family:"Microsoft Yahei";}
body{
background-color: beige;
}
#nav{
position: relative;
overflow: hidden;
margin: 50px;
width: 200px;
height: 300px;
background-color: aquamarine;
}
#nav .gd{
width: 50px;
height: 50px;
margin-top: 30px;
margin-left: 20px;
background-color: palegoldenrod;
}
</style>
</head>
<body>
<div id="nav">
<div class="gd">
</div>
</div>
<script>
/*
* (只读)
* 元素到 定位父级 的距离
*
*
* */
let oGd = document.querySelector("#nav .gd");
console.log(oGd.offsetLeft, oGd.offsetTop);//20 30
</script>
- 滚动高
<body style="height: 2000px; width: 3000px">
<button id="btn">按钮</button>
<script>
btn.onclick = function(){
// document.documentElement.scrollTop = 333;
//等价于
window.scrollTo({top:333,left:0});
};
document.onclick = function(){
console.log(document.documentElement.scrollTop
,document.documentElement.scrollLeft);
};
</script>
</body>
- 案例–回到顶部
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
*{margin:0;padding:0;font-family:"Microsoft Yahei";}
#toTop{
position: fixed;
bottom: 20px;
right: 20px;
width: 50px;
height: 50px;
background-color: #ddd;
font-size: 12px;
text-decoration: navajowhite;
line-height: 50px;
text-align: center;
cursor: pointer;
user-select: none;
}
</style>
</head>
<body>
<div>
<!--<a href="#top" id="toTop">回到顶部</a>-->
<a id="toTop">回到顶部</a>
<div>
<p id="top">00001</p>
<p>00002</p>
<p>00003</p>
<p>00004</p>
<p>00005</p>
<p>00006</p>
<p>00007</p>
<p>00008</p>
<p>00009</p>
<p>00010</p>
<p>00011</p>
<p>00012</p>
<p>00013</p>
<p>00014</p>
<p>00015</p>
<p>00016</p>
<p>00017</p>
<p>00018</p>
<p>00019</p>
<p>00020</p>
<p>00021</p>
<p>00022</p>
<p>00023</p>
<p>00024</p>
<p>00025</p>
<p>00026</p>
<p>00027</p>
<p>00028</p>
<p>00029</p>
<p>00030</p>
<p>00031</p>
<p>00032</p>
<p>00033</p>
<p>00034</p>
<p>00035</p>
<p>00036</p>
<p>00037</p>
<p>00038</p>
<p>00039</p>
<p>00040</p>
<p>00041</p>
<p>00042</p>
<p>00043</p>
<p>00044</p>
<p>00045</p>
<p>00046</p>
<p>00047</p>
<p>00048</p>
<p>00049</p>
<p>00050</p>
<p>00051</p>
<p>00052</p>
<p>00053</p>
<p>00054</p>
<p>00055</p>
<p>00056</p>
<p>00057</p>
<p>00058</p>
<p>00059</p>
<p>00060</p>
<p>00061</p>
<p>00062</p>
<p>00063</p>
<p>00064</p>
<p>00065</p>
<p>00066</p>
<p>00067</p>
<p>00068</p>
<p>00069</p>
<p>00070</p>
<p>00071</p>
<p>00072</p>
<p>00073</p>
<p>00074</p>
<p>00075</p>
<p>00076</p>
<p>00077</p>
<p>00078</p>
<p>00079</p>
<p>00080</p>
<p>00081</p>
<p>00082</p>
<p>00083</p>
<p>00084</p>
<p>00085</p>
<p>00086</p>
<p>00087</p>
<p>00088</p>
<p>00089</p>
<p>00090</p>
<p>00091</p>
<p>00092</p>
<p>00093</p>
<p>00094</p>
<p>00095</p>
<p>00096</p>
<p>00097</p>
<p>00098</p>
<p>00099</p>
<p>00100</p>
<p>00101</p>
<p>00102</p>
<p>00103</p>
<p>00104</p>
<p>00105</p>
<p>00106</p>
<p>00107</p>
<p>00108</p>
<p>00109</p>
<p>00110</p>
<p>00111</p>
<p>00112</p>
<p>00113</p>
<p>00114</p>
<p>00115</p>
<p>00116</p>
<p>00117</p>
<p>00118</p>
<p>00119</p>
<p>00120</p>
<p>00121</p>
<p>00122</p>
<p>00123</p>
<p>00124</p>
<p>00125</p>
<p>00126</p>
<p>00127</p>
<p>00128</p>
<p>00129</p>
<p>00130</p>
<p>00131</p>
<p>00132</p>
<p>00133</p>
<p>00134</p>
<p>00135</p>
<p>00136</p>
<p>00137</p>
<p>00138</p>
<p>00139</p>
<p>00140</p>
<p>00141</p>
<p>00142</p>
<p>00143</p>
<p>00144</p>
<p>00145</p>
<p>00146</p>
<p>00147</p>
<p>00148</p>
<p>00149</p>
<p>00150</p>
<p>00151</p>
<p>00152</p>
<p>00153</p>
<p>00154</p>
<p>00155</p>
<p>00156</p>
<p>00157</p>
<p>00158</p>
<p>00159</p>
<p>00160</p>
<p>00161</p>
<p>00162</p>
<p>00163</p>
<p>00164</p>
<p>00165</p>
<p>00166</p>
<p>00167</p>
<p>00168</p>
<p>00169</p>
<p>00170</p>
<p>00171</p>
<p>00172</p>
<p>00173</p>
<p>00174</p>
<p>00175</p>
<p>00176</p>
<p>00177</p>
<p>00178</p>
<p>00179</p>
<p>00180</p>
<p>00181</p>
<p>00182</p>
<p>00183</p>
<p>00184</p>
<p>00185</p>
<p>00186</p>
<p>00187</p>
<p>00188</p>
<p>00189</p>
<p>00190</p>
<p>00191</p>
<p>00192</p>
<p>00193</p>
<p>00194</p>
<p>00195</p>
<p>00196</p>
<p>00197</p>
<p>00198</p>
<p>00199</p>
<p>00200</p>
</div>
</div>
<script>
/*
* 0.5s的时间,回到顶部
* */
(function(){
let oToTop = document.getElementById("toTop");
oToTop.onclick = function(){
//滚动高度
let sTop = document.documentElement.scrollTop;
//初始时间
let s = new Date();
(function m(){
let n = new Date();
// 已经过的时间 / 总规定的时间
let prop = Math.min( (n - s)/500 , 1 );
//改变滚动高
document.documentElement.scrollTop = (1-prop) * sTop;
//当prop === 1,就不会往后走了,也就是动画停止了
(prop !== 1) && requestAnimationFrame(m);
})();
};
})();
</script>
</body>
</html>
- 案例–模拟动画(了解)
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
*{margin:0;padding:0;font-family:"Microsoft Yahei";}
body{
overflow: hidden;
}
#ball{
position: fixed;
bottom: 0;
width: 50px;
height: 50px;
background: pink;
border-radius: 50%;
margin: 0 auto;
}
</style>
</head>
<body>
<div id="ball"></div>
<script>
let maxHeight = document.documentElement.clientHeight - 50;
ball.style.bottom = maxHeight + "px";
let Y = maxHeight;
let V = 0;
let g = 0.001;
let startTime = new Date();
(function m(){
let nowTime = new Date();
let t_ = nowTime-startTime;
let S = V*t_ + (1/2*g*t_*t_);
let pos = Y - S;
if (pos <= 0){
startTime = new Date();
V = -(V + g*t_)*0.8;
Y = 0;
Math.abs(V)>=0.05 && requestAnimationFrame(m);
}else{
requestAnimationFrame(m);
}
ball.style.bottom = pos + "px";
})();
</script>
</body>
</html>
- 特殊的获取方式
onsole.log(document.title);//title的文本内容
console.log(document.head);//head
console.log(document.body);//body
console.log(document.documentElement);//html