2013-07-07 268 views
2

Ohai!使用scrollTop()移動一個DIV,當溢出-y:滾動的DIV滾動時

我想在我的網站上的菜單中添加一點效果。以下是我想要創建的事件:
1-用戶加載頁面:菜單距離頁面頂部36px;
2-用戶開始向下滾動閱讀內容;
3-當用戶滾動正好36px時,菜單移動到頁面的最頂部並停留在那裏;
4-用戶繼續向下滾動,菜單仍然固定在最上方;
5-用戶向上滾動,直到頂部小於36px,菜單返回到第一個位置,距離頂部36px。

這很有趣,我剛剛注意到Stack Overflow正在使用一些代碼來完成對「類似問題」框的完全相同的操作,當我編寫新問題時,我在頁面的右側有一個框。如果你想有一個概述,只需start creating a new question並觀看它。我試圖找出他們正在使用的東西,但失敗了。

對於我的效果,我使用了scrollTop() jQuery屬性,關聯到scroll()之一。這裏是代碼:

$(document).scroll(function() { 
     if ($(document).scrollTop() >= 36) { 
     $('#menu').css({'top': '0px'}); 
     } else { 
     $('#menu').css({'top': '36px'}); 
     } 
     }); 

這是工作的document,這意味着整個頁面的主體。

現在的問題是,我想在具有overflow-y :scroll屬性的article元素中使用它。當我談論<article>元素時,我指的是HTML5文檔中使用的元素(例如<nav>,<aside>,<section>,<footer> ...)。

因此,JQ在document中找不到任何滾動,這是真的,因爲現在,整個頁面中的唯一滾動位於article元素內。身體從不移動,它的目的。

所以,我想這一點:

$('article').scroll(function() { 
     if ($('article').scrollTop() >= 36) { 
     $('#menu').css({'top': '0px'}); 
     } else { 
     $('#menu').css({'top': '36px'}); 
     } 
     }); 

而且也是這樣:

$(document).scroll(function() { 
     if ($(document).scrollTop() >= 36) { 
     $('#menu').css({'top': '0px'}); 
     } else { 
     $('#menu').css({'top': '36px'}); 
     } 
     }); 

即使這樣:

$('#insidecontent').scroll(function() { 
     if ($('#insidecontent').scrollTop() >= 36) { 
     $('#menu').css({'top': '0px'}); 
     } else { 
     $('#menu').css({'top': '36px'}); 
     } 
     }); 

#insidecontent是遵循article元素div名因爲您稍後可以在代碼中看到我將由Jsfid提供給您的代碼dle.net。

而這是行不通的。不是因爲article元素,我正在使用另一個jQuery代碼來動態調整高度,這也正好聚焦article而沒有任何問題。我沒有嘗試過。


http://jsfiddle.net/fKkML/1/
在這裏你可以找到的第一個版本($(document))和整個代碼不overflow-y: scroll,看我說的是哪個效果。它正在工作,只需滾動結果框。



http://jsfiddle.net/BCuez/7/
這裏與overflow-y: scroll版本開啓和$('article'),這是行不通的。

注意:在第二個鏈接中,Jsfiddle.net以相同的方式處理溢出,看起來這是滾動的整個主體。但正如你所看到的,無論如何,這個效應都搞砸了。您可以通過創建文件在本地計算機上嘗試此代碼,您會看到。注意2:在這些演示中,我不得不在margin-top: 70pxarticle之間添加一個margin-top: 70px,但在真實和完整的代碼中不需要它。注3:我是HTML5/CSS3的「專業」用戶,但是不是的jQuery,這是我第一次在Web的幫助下做我自己的JQ代碼。我對這個問題非常不滿意,所以如果你能詳細說明你的答案,以幫助我正確理解它,我會非常感謝你。

我在發佈之前先搜索答案。例如我發現this subject有點與我的相關,但不是真的。我沒有找到任何真正能夠幫助我的人,或者真的會像我一樣。



非常感謝您給我的幫助。我願意以其他方式獲得相同的結果,但這似乎與工作非常接近。

+0

我將'article'的'height:auto;'改爲'height:200px;'並且它正在工作。奇怪的是它只能在JSFiddle.net空間中工作。即使我將三個盒子中的每個字符複製粘貼到新的.html和.css文件中,它都不起作用。我不明白。查看這裏的工作結果: http://jsfiddle.net/BCuez/10/ – Orphal

回答

4

我解決了這個問題。

第一個問題是height它被設置爲auto,因爲我有另一個JS代碼,它動態地改變它的大小。需要定義height(px,em,%)。

第二個問題是最初缺少window.onload=function(){。 JSFiddle自己添加它,我只需要用chrome中的F12檢查代碼。我將它添加到我自己的代碼中,它正在工作。

這裏是最後的代碼,你可以自己使用到自己的代碼:

的jQuery:

window.onload=function(){ 
    $('article').scroll(function() { 
     if ($('article').scrollTop() >= 36) { 
      $('#menu').css({ 
       'top': '0px' 
      }); 
     } else { 
      $('#menu').css({ 
       'top': '36px' 
      }); 
     } 
    }); 
    } 

CSS:

article { 
    width: 100%; 
    height: 500px; 
    overflow-y: scroll; 
    position: relative; 
    z-index: 0; 
} 

HTML:

<body> 
     <ul id="menu"> 
      <li> <a href="#"> 
           Elem1 
          </a> 

      </li> 
      <li> <a href="#"> 
           Elem2 
          </a> 

      </li> 
      <li> <a href="#"> 
           Elem3 
          </a> 

      </li> 
      <li> <a href="#"> 
           Elem4 
          </a> 

      </li> 
      <li> <a href="#"> 
           Elem5 
          </a> 

      </li> 
     </ul> 
     <article> 
      Lorem ipsum dolor sit amet, consectetur adipiscing elit. In eleifend neque in sodales iaculis. Suspendisse porta sodales turpis, ut bibendum justo sagittis at. Vivamus ut laoreet tellus. Integer rutrum vel quam in imperdiet. Cras mattis lacus sem, eu suscipit urna adipiscing et. Etiam convallis, tortor ac gravida luctus, nibh tellus porttitor lorem, vel tempus massa purus sed orci. Donec condimentum dolor velit, convallis auctor velit dapibus sed. Integer commodo ullamcorper libero, in pharetra tortor auctor nec. Donec tristique turpis quis felis posuere feugiat. Fusce molestie elementum gravida. Nulla nec quam et metus gravida ornare eget ac elit. Morbi sit amet massa ornare, euismod dolor fringilla, porttitor felis. Sed mattis orci ante, nec sodales enim varius non. Proin velit justo, ultrices vel mollis id, ultrices a nibh. Aenean lacinia ullamcorper leo, sed adipiscing libero vestibulum nec. Phasellus est erat, tincidunt vel mi non, condimentum vestibulum lacus. Quisque placerat id mauris a hendrerit. Phasellus venenatis eros vel leo blandit, non blandit velit imperdiet. Praesent id erat in risus tristique iaculis a eget orci. Quisque pellentesque hendrerit ante vitae tincidunt. Vivamus placerat nisi purus, a tincidunt ligula elementum ut. Integer in arcu elit. Phasellus facilisis orci sit amet sapien egestas imperdiet. Ut quis risus sodales, rutrum libero rhoncus, tincidunt ipsum. Praesent suscipit eros id lacinia bibendum. Donec erat sem, fringilla et pulvinar nec, aliquet euismod mi. 
     </article> 
    </body> 
  • article是設置了overflow-y: scroll的全部內容。

  • #menu是滾動時位置發生變化的DIV。

  • >= 36第3行是用戶在DIV更改其位置之前需要滾動的px數。

  • 0px第5行是DIV位置,當滾動等於或高於36px時。

  • 36px第9行是滾動低於36px時DIV的位置。

您可以在jQuery代碼中添加所需的每個CSS規則。例如,我添加了一行來隱藏相同事件中的一些內容。您也可以添加animate()事件。

祝你好運!