onscroll事件沒有響應的原因以及vue.js中添加onscroll事件監聽的方法


1 onscroll事件失效

<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
</head>

<body onscroll="checkscroll()">
  <div class="father" >
    <div class="son">我是移動塊</div>
  </div>
</body>

</html>
<style type="text/css">
html,
body {
  width: 100%;
  height: 100%;
  /*overflow-x:hidden;*/
  /*overflow: scroll;*/
}

.father {
  width: 100%;
  height: 100%;
  box-sizing: border-box;
}

.son {  

  height: 3000px;
  background-color: yellow;
  width: 100%;
  font-size: 80px;
  display: flex;
  justify-content: center;
  align-items: center;

}
</style>
<script type="text/javascript">
  function checkscroll() {  
    console.info(window.scrollY)
  }
</script>

大家可以將這段代碼copy親自測試一下,在有和沒有overflow屬性之間切換,就明白了。

 

因為很多同學在開發項目時,會有腳手架之類的文件進行快速開發,但是有的腳手架會在入口的html文件,設置overflow: scroll/auto。

這個屬性在入口級別的文件中最好不要隨意使用,造成的scroll滑動監聽整體失效,你無論如何也不會想到是這個原因。

打個比方:

APP.vue

這是用vue.js寫的頁面,我在其中用了vux(一個基於vuejs的移動組件庫)的一個組件view-box,當時我找遍了所有的文件,並沒有那里

有over-flow 樣式;但是scroll事件失效,window.scrollY一直為0, 最后我發現所有頁面都是如此,於是我就定位在入口的幾個文件,將

相關的引入組件也進行排查,終於在view-box,這個組建里找到了over-flow:auto;樣式。注釋掉后,就正常了

所以說:over-flow:auto;如果放在入口文件並且放在包裹的父元素上,一定要慎重!

 

 

2 vue上監聽scroll事件 

 利用DOM二級監聽事件即可,

window.addEventListener('scroll',()=>{console.log(window.scrollY)})

 

3 如果問為什么不能在vue組件上直接監聽

一般來說根據我的測試情況,監聽滾動基本上監聽的都是整體document或者window。

監聽的都是相對於整體(document或者window)的當前可見區域的文檔片段(就是你眼睛可以看到的部分),而不是去監

聽單個的DOM片段,因為這么做沒有意義。在vue中也監聽不了!因為vue的每個文件實際上都是一塊DOM片段,你在自己

的身上監聽自己的滑動情況。這就好比(你想揪着自己的頭發,把自己提起來)!

 

當然,這是比較通俗一點,直觀一點的解釋,如果有更底層,更科學的解釋,一起探討!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM