24-各种宽高、距离的获取

第二十四章.各种宽高、距离的获取

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值