2016-07-01 4 views
0

요소가 뷰포트에 있는지 또는 보이는지를 감지하는 간단한 함수가 있습니다. 해당 요소가 표시되면 스크롤 할 때마다 해당 요소를 .css()으로 이동하고 일부 속성을 적용하여 일부 시차 효과를 얻습니다. 확인하는이 요소는 뷰포트에 있으며 이동하면 페이지에서 X 번 반복됩니다. 모든 것이 작동하지만 첫 번째 요소에서만이 문제가 발생하며 다른 모든 요소는 첫 번째 요소에서 최상위 위치를 상속받습니다.동일한 클래스의 모든 요소에 함수 적용

데모 : http://codepen.io/riogrande/pen/RRVVwq (효과를 보려면 아래로 스크롤).

편집 : 일부 사람들은 내가 원하는 것을 잘못 생각했기 때문에 제목 (요소)을 스크롤로 이동하고 싶지만 뷰포트 (보이는 부분)에서만 움직 이길 원합니다. 따라서 동일한 클래스를 가진 첫 번째 요소가 스크롤로 이동하는 경우 스크롤 할 때 더 이상 볼 수 없게 이동하면 안되지만 다른 하나는 움직이는 등 이동해야합니다.

Jquery :

여기
(function($) { 

    'use strict'; 

    $.prototype.isVisible = function() { 
    var rect = this[0].getBoundingClientRect(); 
    return (
     (rect.height > 0 || rect.width > 0) && 
     rect.bottom >= 0 && 
     rect.right >= 0 && 
     rect.top <= (window.innerHeight || document.documentElement.clientHeight) && 
     rect.left <= (window.innerWidth || document.documentElement.clientWidth) 
    ); 
    }; 

    function doCheck() { 
    var elementToDetect = $('.text'); 
    var scrolled = $(window).scrollTop(); 
    if (elementToDetect.isVisible()) { 
     elementToDetect.css('top', (-100 + (scrolled * 0.2)) + 'px'); 
    } 
    } 

    $(document).ready(function() { 
    doCheck(); 
    }); 

    $(window).scroll(function() { 
    doCheck(); 
    }); 

})(jQuery); 

답변

1

jQuery는 셀렉터와 일치하는 각 요소에 css()과 같은 연산을 적용합니다. 모든 텍스트는 점에서 여전히 문제가

function doCheck() { 
    var elementToDetect = $('.text'); 
    var scrolled = $(window).scrollTop(); 
    for (var index = 0; index < elementToDetect.length; index++) { 
     var element = $(elementToDetect[index]); 
     if (element.isVisible()) { 
     element.css('top', (-100 + (scrolled * 0.2)) + 'px'); 
     } 
    } 
    } 

를 자신의 이미지에 동일한 상위 상대를 유지 :

그래서 당신은 jQuery 오브젝트를 반복하는 경우, 당신이 얻을.

편집 : 는 사실, 난 당신이 무슨 일을하는지 이해 방법은, 당신이보기에 올 때 그들에게 스크롤과 같은 방법으로 모든 이동, 그래서 이미지 위의 각 시작하게 할. 이것은 당신이 필요에 가까운 : 당신이 정말로 텍스트의 위치를 ​​결정하는 부모 div의 위치를 ​​원하기 때문에

function doCheck() { 
    var elementToDetect = $('.text'); 
    for (var index = 0; index < elementToDetect.length; index++) { 
     var text = elementToDetect[index]; 
     var parent = text.parentElement; 
     var parentTop = parent.getBoundingClientRect().top; 
     var scrolled = (window.innerHeight - parentTop); 
     if (scrolled < 0) { 
     scrolled = 0; 
     } 
     if (parentTop < window.innerHeight) { 
     $(text).css('top', (-100 + (scrolled * 0.2)) + 'px'); 
     } 
    } 
    } 

기본적으로, scrollTop()에서 찾고, 잘못된 것입니다.

+0

첫 번째 문제는 문제가 있고 두 번째는 문제입니다. 모든 스크롤에서 제목 이동,하지만 요소가 표시되는 경우에만 이동해야합니다. 두 번째 예제는 끝까지 스크롤 할 때 제목이 페이지의 어딘가에 표시됩니다. 그래서이 픽스 중 어느 것도 작동하지 않지만 시간 내 주셔서 감사합니다 !! – riogrande

+1

초기 질문은 jQuery 명령이 모든 텍스트 요소에서 작동하는 방식에 관한 것입니다.나는 단지 텍스트 배치에 또 다른 문제가 있다고 지적했다. 이제 텍스트 배치에 대한 수정 사항을 포함하도록 답변을 편집했습니다. –

+0

좋아, 이제 내가 원하는대로 두 번째 솔루션 (편집) 다른 시도와 그 지금 woking을 주었다 – riogrande

0

당신은 스크롤의 각 .text를 확인해야합니다

function doCheck() { 
    var elementToDetect = $('.text'); 
    var scrolled = $(window).scrollTop(); 
    elementToDetect.each(function(i, txtEl) { 
    if (txtEl.isVisible()) { 
     txtEl.css('top', (-100 + (scrolled * 0.2)) + 'px'); 
    } 
    }); 
} 

그리고 당신이 window.scroll에 거기 debouce을 할 가능성이 높습니다 :

var timer; 
$(window).scroll(function() { 
    if(timer){ clearTimeout(timer); } 
    timer = setTimeout(function(){ 
     doCheck(); 
    }, 900); 
}); 
+1

당신은 2 분 정도 나를 이겼습니다. [Updated CodePen] (http://codepen.io/anon/pen/OXmvXb). – Rajesh

+2

@Rajesh 이미 jQuery 객체이므로 jquery 래퍼를 가질 필요가 없습니다. – Jai

+0

@Jai 예제가 전혀 작동하지 않습니다. – riogrande

0

$('.text')은 요소 배열을 반환합니다. 당신은 항목의 배열보다는 각 항목에 CSS 변환을 적용해야합니다. 아래의 코드는 원하는 출력을 얻기 위해 업데이트가 필요할 수 있지만 여러분이 가야한다고 생각합니다.

function doCheck() { 
    var scrolled = $(window).scrollTop(); 
    $('.text').each(function() { 
    if($(this).isVisible()) { 
     $(this).css('top', (-100 + (scrolled * 0.2)) + 'px'); 
    } 
    }) 
} 
+0

고마워,하지만 이건 작동하지 않습니다, 내 codepen을 열어 당신과 내 기능을 바꿔보십시오 그리고 당신이 볼 것이다, 내 시도보다 더 나쁜,하지만 당신의 시간을 주셔서 감사합니다 !! – riogrande

+1

지금은 더 깊이 볼 시간이 없지만 scrollTop을 사용하는 대신 오프셋을 각 부모 요소/이미지의 맨 위에서 계산해야한다고 생각합니다. – designreact

관련 문제