天天看點

原生JS和JQuery代碼編寫視窗捕捉函數和頁面視覺差效果(scroll()、offsetTop、滾動監聽的妙用)

   想實作視窗滾動到一定位置時,部分網頁的頁面發生一些變化,但是手頭沒有合适的插件,是以就想到自己編寫一個簡易的方法,

想到這個方法要有很高的自由度和适應性,在這,就盡量的削減其功能,若有錯誤的地方或者更好的建議,請大家評論,一同探讨,

好了廢話不多說,下面開始幹活了!

  首先,說一下我想實作的基本功能:

    此方法需要有2個基本形參,,一個是我要監測的标簽a,另一個是我要監測标簽相對于哪個标簽b做的距離檢測。

  當a和b的距離達到一定範圍的時候,讓網頁局部發生一些變化效果,這是我們的預期。

  以下是我的方法的架構:

<!DOCTYPE html>     <html>         <head>             <meta charset="UTF-8">             <title></title>             <style type="text/css">                 div{                     width: 200px;                     height: 200px;                     margin-top: 20px;                 }                 #a1{                     background-color: red;                 }                 #a2{                     background-color: blue;                 }                 #a2 .a22{                     width: 50px;                     height: 50px;                     background-color: navajowhite;                     position: relative;                     top: 50px;                     left: -50px;                 }                 #a3{                     background-color: yellow;                 }             </style>             <link rel="stylesheet" href="css/bootstrap.min.css" />         </head>         <body>               <div id="a1"></div>               <div id="a2">                   <div class="a22">haha</div>               </div>               <div id="a3"></div>               <div id="a3"></div>         </body>         <script language="JavaScript" src="js/jquery-1.10.2.min.js"></script>         <script language="JavaScript" src="js/bootstrap.min.js"></script>         <script type="text/javascript">             /*以下是我們以監測目标元素距離body頂部距離的方法*/             function myScrollFn($myElement1,$myElement2){                 $(window).scroll(function(){         //這是scroll方法,視窗滾動時就會被調用                     var a=$myElement1.scrollTop();   //這是監測滾動條距離頂端的距離                     var b=$myElement2.offset().top;   //這是監測我們目标元素距離body或者其第一個定位父元素頂端的距離                     /*當div #a2距離視窗頂部距離在0px到200像素時,div .a22出現*/                     if (b-a<=0&&b-a>=-200) {                         $(".a22").css({"left":"20px","transition":"all 1s"});                     }else{                         $(".a22").css({"left":"-50px","transition":"all 0s"});                     }                     console.log(b-a);   //為便于觀察,在控制台列印出距離來                 });             }             myScrollFn($("body"),$("#a2"));         </script>     </html>      

  上述代碼功能:當視窗上沿在達藍色div内部時,小div從左側出現,不在時恢複原狀。

  這裡先普及一下基礎知識,

    .scrollTop(); 是監測滾動條距離頂端的距離的,這是JQuery方法

    .offset().top   是監測我們目标元素距離body或者其第一個定位父元素頂端的距離這也是JQuery方法及屬性      

    同樣在HTML5中、js中也都有這些屬性方法的定義和詳解,有興趣的可以去檢視幫助文檔。

  那按照以上結構就可以比較輕松的實作檢測距離實作一定動畫效果,隻需要在if判斷書寫你想要變化的代碼即可,如果想實作

每次到達設定區間都執行動畫,可以像例子中一般,在else中設定重置我們的修改的樣式即可。

  寫到這的時候,突然想到,我們網頁中常用的那些,網頁滾動産生的視覺差效果,他是不是也可以用這個來做一個方法呢!

  下面請看這個簡易的demo:

<!DOCTYPE html>     <html>         <head>             <meta charset="UTF-8">             <title></title>             <style type="text/css">                 .container{                     position: relative;                     height: 3000px;                     padding-top: 400px;                     background-color: gainsboro;                 }                 .a1{                     width: 300px;                     height: 300px;                     background-image: url(img/FqYgq95pkXU2iGax9iYPaxRnt1Xl.png);                     background-size: 100%;                     position: absolute;                 }                 .a2{                     width: 200px;                     height: 100px;                     background-color: yellow;                     position: absolute;                     margin-left: 50px;                 }             </style>             <link rel="stylesheet" href="css/bootstrap.min.css" />         </head>         <body>               <div class="container">                   <div class="a1"></div>                   <div class="a2"></div>               </div>         </body>         <script language="JavaScript" src="js/jquery-1.10.2.min.js"></script>         <script language="JavaScript" src="js/bootstrap.min.js"></script>         <script type="text/javascript">             /*編寫一個簡單的方法,實作網頁常見常見的視覺差效果*/             function myEye($myElement1,$myElement2){                 var num=1;                 $(window).scroll(function(){                     var a=$("body").scrollTop();       //取出滾動條離視窗頂端的距離                     var yellow=$myElement2.offset().top;  //取出黃色div塊離body最上方的距離                     var c=yellow-a+0.5;                //計算出比滾動條滾動速度慢一倍的數值                     $myElement1.css({"top":+c+"px"});     //設定黃色div的慢一倍的移動速度,産生視覺差效果                 })             }             myEye($(".a1"),$(".a2"));         </script>     </html>      

  兩個參數,可以設定成需要産生視覺差的2個元素節點,當然這裡做的是demo,多加一些形參也都是可以的,看具體的網頁需求了。

注意這裡做實參的元素節點都是通過絕對定位實作的。通過   c=yellow-a+0.5;$myElement1.css({"top":+c+"px"});  這兩句代碼

可以實作2個塊滾動速度差一倍,如果要改變相差的速度,隻需要修改 c=yellow-a+0.5;這個式子就可以了,這個浏覽器滾動條的精度,

我們暫且以1px來算(這個不同裝置好像是不同的,部落客不是很了解),但是以1像素來計算,通過加減0-1之間的數值,可以實作任意

速度比的視覺差,按照這個結構,修改起來還是很容易的。

  以上内容純屬部落客無聊,一個人亂搞的産物,如果有bug,希望導遊們能夠指出,我們共同探讨。個人感覺還是蠻實用的,比直接應

用插件靈活性高,代碼量也少很多。