2016-12-07 61 views
1

我目前正在開發一個項目,其中所需的用戶體驗涉及與滾動事件的非常自定義的交互。自定義滾動UX

問題解決: 該頁面具有X部分,每個區域具有等於視口HIGHT height: 100vh;的高度。當用戶在視口上向下滾動時,當前可見部分停留在原來的位置,並且基於滾動距離的閾值(例如30px)進行滾動指示器動畫。一旦用戶滾動了閾值,下一部分從屏幕底部出現並覆蓋當前部分(仍然不動)。

初步探討: 設置各部分的絕對位置,並通過基於scrollwheel事件更改樣式進行調整。正文overflow:hiddentransform屬性來操縱節。不過,我遇到了問題。

  1. 的滾輪事件似乎記錄爲非常不穩定的解決方案來實現。
  2. 事件的.wheelDelta方面異步觸發,很難捕捉到手勢。 (在鉻上,它只是吐出3次的倍數,而不是px中手勢的距離)。這使得難以設置閾值併爲響應該閾值的元素設置動畫。

我基本上要能夠跟蹤像素的滾輪般的事件被覆蓋的數量,直到滾動閾值時適用這一數字在一定滾動提示元素的位置。一旦滿足,就會觸發一個函數來更改類並更新頁面上的一些信息。如果閾值未滿足,滾動提示元素將返回到默認位置。

我附加的方法並不覺得很有助於完成這一點,所以我正在尋找1)一種不同的和更穩定的方法,或2)修改/批評我做錯了這種方法的做法它穩定。

(function scrollerTest($){ 
 
\t $('body').on ('mousewheel', function (e) { 
 
     
 
\t  var delta = e.originalEvent.wheelDelta, 
 
      currentScreenID = $('section.active').data('self').section_id, 
 
       currentScreen = $('section.part-' + currentScreenID), 
 
       nextScreenID = currentScreenID + 1, 
 
       nextScreen = $('section.part-' + nextScreenID);; 
 
\t 
 
\t  if (delta < 0) { // User is Scrolling Down 
 
      currentScreen.removeClass('active').addClass('top'); 
 
      nextScreen.removeClass('bottom').addClass('active') 
 
\t  } else if (delta > 0) { // User is Scrolling Up 
 
\t   
 
      
 
\t  } 
 
\t }); 
 

 
}(jQuery));
body { 
 
    overflow: hidden; 
 
    padding: 0; 
 
    margin: 0; 
 
    } 
 
section { 
 
    position: absolute; 
 
    top: 0; 
 
    left: 0; 
 
    width: 100%; 
 
    height: 100vh; 
 
    z-index: 999; 
 
    background-color: #CA5D44; 
 
    transition: 0.8s all ease-in-out; 
 
    } 
 
section.part-1 { 
 
    position: relative; 
 
    z-index: 9; 
 
    } 
 
section.part-2 { 
 
    background-color: #222629; 
 
    } 
 
section.active { 
 
    transform: translateY(0); 
 
    } 
 
section.top { 
 
    transform: translateY(-10%); 
 
    } 
 
section.bottom { 
 
    transform: translateY(100%); 
 
    }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script> 
 

 
<body> 
 
    <section class="part-1 home active" data-self='{ "section_id" : 1, "section_title" : "Home", "menu_main_clr" : "#fff" , "menu_second_clr" : "#CA5D44", "logo_clr" : "white" }'> 
 
    </section> 
 
    <section class="part-2 about bottom" data-self='{ "section_id" : 1, "section_title" : "About", "menu_main_clr" : "#CA5D44" , "menu_second_clr" : "#fff", "logo_clr" : "white" }'> 
 
    </section> 
 
    <section class="part-3 contact bottom" data-self='{ "section_id" : 1, "section_title" : "Contact", "menu_main_clr" : "#fff" , "menu_second_clr" : "#CA5D44", "logo_clr" : "white" }'> 
 
    </section> 
 
</body>

編輯注: 的片段似乎有一些問題與觸發事件和初審後更改類 - 不知道爲什麼。在我的本地示例中,它會一次全部觸發它們。

** Edite Note 2:** 列出的代碼只是我可以實現的最接近行爲的副本。不幸的是,整個閾值功能似乎很難達到,因爲wheel事件不像滾動事件那樣行爲。

+0

你有沒有考慮檢查[fullPage.js(http://alvarotrigo.com/fullPage/)?這種事情最受歡迎的圖書館。 – Alvaro

回答

0

整個滾動主題相當複雜,尤其是當您考慮觸摸滾動事件時。 有一些圖書館在那裏 - 看到這份名單,例如:http://ninodezign.com/30-jquery-plugins-for-scrolling-effects-with-css-animation/

我用https://projects.lukehaas.me/scrollify/之前,它可能讓你做你想要什麼(使用回調之前最終),但我不能沒有嘗試自己知道。還認爲滾動相對於其他圖書館而言相對較大(8kb縮小)。

+0

這是一個偉大的插件列表,謝謝!如果可以的話,我希望能避免加載代碼的依賴關係。理想情況下,我想建立一個「下一個屏幕」的原型功能,並在特定的閾值上調用它。手機不是太強悍,但在電腦上獲得這種效果讓我非常頭疼。要給我們一個鏡頭,看看它是否能夠有效地幫助我 –

0

可以通過確保每個填充內容截面接近這個使用之後是一個空白透明間隙(在下面的例子中,同樣在高度100vh),然後使用javascript申請position:fixed到每個填充內容截面時,如果擊中視口的頂部。

例子:

var screens = document.getElementsByClassName('screen'); 
 

 
function checkPosition() { 
 

 
\t for (var i = 0; i < (screens.length - 1); i++) { 
 
\t  var topPosition = screens[i].getBoundingClientRect().top; 
 
    
 
     if (topPosition < 1) { 
 
      screens[i].style.top = '0'; 
 
      screens[i].style.position = 'fixed'; 
 
     } 
 
    } 
 
} 
 

 
window.addEventListener('scroll',checkPosition,false);
.screen { 
 
position: absolute; 
 
display: block; 
 
left: 0; 
 
width: 100%; 
 
height: 100vh; 
 
} 
 

 
.red { 
 
position: fixed; 
 
top: 0; 
 
background-color: rgb(255,0,0); 
 
} 
 

 
.orange { 
 
top: 200vh; 
 
background-color: rgb(255,140,0); 
 
} 
 

 
.yellow { 
 
top: 400vh; 
 
background-color: rgb(255,255,0); 
 
} 
 

 
.green { 
 
top: 600vh; 
 
background-color: rgb(0,191,0); 
 
} 
 

 
.blue { 
 
top: 800vh; 
 
background-color: rgb(0,0,127); 
 
} 
 

 
p { 
 
font-size: 20vh; 
 
line-height: 20vh; 
 
text-align: center; 
 
color: rgba(255,255,255,0.4); 
 
}
<div class="red screen"> 
 
<p>Screen One</p> 
 
</div> 
 

 
<div class="orange screen"> 
 
<p>Screen Two</p> 
 
</div> 
 

 
<div class="yellow screen"> 
 
<p>Screen Three</p> 
 
</div> 
 

 
<div class="green screen"> 
 
<p>Screen Four</p> 
 
</div> 
 

 
<div class="blue screen"> 
 
<p>Screen Five</p> 
 
</div>