2017-11-16 1 views
0

내 페이지의 중간에있는 요소에 시차 효과를 유발합니다. 내가 이것을 scrollTop()에 붙이면, 초기화 될 때 요소가 점프하게됩니다.시차 중순 페이지

var feedPos = $(".feed").offset().top - 100; 

$(window).scroll(function(){ 
    if($(window).scrollTop() >= feedPos) { 
     $(".feed").css("top", 150 - $(window).scrollTop()/100); 
    } 
}); 

아이디어가 있으십니까?

+1

피드가 맨 위에 전환으로 CSS 규칙을 넣으면 변경 사항이 애니메이션으로 적용될 수 있습니까? 스크롤 이벤트가 많이 발생하면 논리를 스로틀/디 바운스하는 것을 고려해야합니다. 또한 그 효과로 스크롤 이벤트에서 돔 검색을 수행하고 싶지는 않지만 발생하는 이벤트의 성능을 저하시킵니다. 논리를 IIFE에 넣고 조회 범위를 캐시하고 처리기에서 사용합니다. – Taplar

+0

다른 브라우저는 스크롤 이벤트를 다르게 처리합니다. 이 이벤트를 사용하면 약간의 미친 결과가 발생할 것입니다. 가능한 모든 경우 CSS 스타일러스를 자바 스크립트가 아닌 모든 스타일로 유지하십시오. – nurdyguy

+0

감사합니다. 많은 감사드립니다. 이것은 내가 항상 이와 같은 기능을 처리했던 방식입니다. '스로틀 링/논리 제거'예제를 제공해 주시겠습니까? @Taplar –

답변

0

이 줄을 따라 가면 도움이 될 것입니다.

html의 경우 텍스트로 80px의 100div를 만들고 배경색과 하단 테두리로 80px 전화를 25divs로 만들었으므로 스크롤 속도의 차이를 볼 수 있습니다. 나는 그들을 생성하기 위해 면도날과 함께 C# mvc를 사용했다. 그러나 당신은 그 div들을 잘 만들고 싶어한다.

<div id="container"> 
    <div class="fast"> 
     @for (var i = 1; i <= 100; i++) 
     { 
      <div>@i. This is row @i</div> 

     } 
    </div> 

    <div class="slow"> 
     @for (var j = 0; j < 25; j++) 
     { 
      var r = 255 - j; 
      var g = 127 + (int)(.5 * j); 
      var b = 10 + j; 
      <div class="color" style="background-color:rgb(@r, @g, @b)"></div> 
     } 
    </div> 
</div> 

CSS의 경우 scss를 사용하지만 다시 원하는 경우 CSS를 만들 수 있습니다.

#container { 
    height: 700px; 
    width: 250px; 
    overflow-y: hidden; 
    position: relative; 

    .fast { 
     position: absolute; 
     top: 0; 
     div {    
      height: 80px; 
      width: 100%; 
     } 
    } 

    .slow { 
     width:100%;   
     position: absolute; 
     top: 0; 
     div {    
      height: 80px; 
      width: 100%; 
      opacity: .3; 
      border-bottom:1px dotted white; 
     } 
    } 
} 

없이 자바 스크립트 :

var isAnimating = false; 
$(document).ready(function() 
{ 
    $('#container').on('DOMMouseScroll mousewheel', function (e) 
    { 
     if (!isAnimating) 
     { 
      isAnimating = true; 
      e.preventDefault(); 

      var delta = e.originalEvent.wheelDeltaY;     
      var $this = $(this); 

      console.log(delta); 


      var newFast = parseInt($this.find('.fast').css('top'), 10) + delta; 
      var newSlow = parseInt($this.find('.slow').css('top'), 10) + delta/4; 

      if (newFast > 0) 
       newFast = 0; 
      if (newSlow > 0) 
       newSlow = 0; 

      console.log(newFast + " | " + newSlow); 

      $this.find('.fast').animate({ top: newFast + 'px' }, 100); 
      $this.find('.slow').animate({ top: newSlow + 'px' }, 100, function() { isAnimating = false; }); 

     } 
    }); 

}); 

참고 :이 경우에만 처리 ​​마우스 휠 스크롤, 스크롤 막대를 끌 수 없습니다. 사실, 스크롤링 div를 만들지 않았으므로 스크롤하는 모든 부분이 바퀴에서 나옵니다. .scroll(...) 이벤트도 만들 수 있지만 한 브라우저에서 다음 브라우저로 매우 까다로운 경향이 있습니다. 이것조차도 약간의 불안감이 있습니다. 스크롤 이벤트를 망치는 것은 까다로운 일일 수 있습니다.

+0

시간을내어 주셔서 감사합니다. 완벽하게 이해합니다. :) –

+1

부울로 무언가를 사용하면 부울 스크롤 및 전진 검색과 같은 일을 할 때 정말 잘 작동합니다. 한 번에 너무 많은 아약스 전화를 쏘고 싶지는 않습니다. – nurdyguy