한 페이지 아래에 h1이 있습니다 ..
<h1 id="scroll-to">TRIGGER EVENT WHEN SCROLLED TO.</h1>
사용자가 h1로 스크롤하거나 브라우저보기에 표시 할 때 경고를 트리거하고 싶습니다.
$('#scroll-to').scroll(function() {
alert('you have scrolled to the h1!');
});
어떻게해야합니까?
답변:
offset
요소를 계산 한 다음 다음과 scroll
같은 값과 비교할 수 있습니다 .
$(window).scroll(function() {
var hT = $('#scroll-to').offset().top,
hH = $('#scroll-to').outerHeight(),
wH = $(window).height(),
wS = $(this).scrollTop();
if (wS > (hT+hH-wH)){
console.log('H1 on the view!');
}
});
이 데모 바이올린 확인
업데이트 된 데모 바이올린 경고 없음-대신 요소를 FadeIn ()
요소가 뷰포트 내부에 있는지 확인하도록 코드를 업데이트했습니다. 따라서 이것은 if 문에 몇 가지 규칙을 추가하여 위아래로 스크롤하든 상관없이 작동합니다.
if (wS > (hT+hH-wH) && (hT > wS) && (wS+wH > hT+hH)){
//Do something
}
.off()
이벤트 jsfiddle.net/n4pdx/543
사용자가 페이지의 특정 부분을 스크롤 할 때이 질문을 jQuery 트리거 작업 의 베스트 답변과 결합
var element_position = $('#scroll-to').offset().top;
$(window).on('scroll', function() {
var y_scroll_pos = window.pageYOffset;
var scroll_pos_test = element_position;
if(y_scroll_pos > scroll_pos_test) {
//do stuff
}
});
최신 정보
요소가 맨 위가 아닌 화면의 중간에있을 때 트리거되도록 코드를 개선했습니다. 또한 사용자가 화면 하단을 누르고 함수가 아직 실행되지 않은 경우 코드를 트리거합니다.
var element_position = $('#scroll-to').offset().top;
var screen_height = $(window).height();
var activation_offset = 0.5;//determines how far up the the page the element needs to be before triggering the function
var activation_point = element_position - (screen_height * activation_offset);
var max_scroll_height = $('body').height() - screen_height - 5;//-5 for a little bit of buffer
//Does something when user scrolls to it OR
//Does it when user has reached the bottom of the page and hasn't triggered the function yet
$(window).on('scroll', function() {
var y_scroll_pos = window.pageYOffset;
var element_in_view = y_scroll_pos > activation_point;
var has_reached_bottom_of_page = max_scroll_height <= y_scroll_pos && !element_in_view;
if(element_in_view || has_reached_bottom_of_page) {
//Do something
}
});
최선의 방법은 바로 그 일을하는 기존 라이브러리를 활용하는 것입니다.
http://imakewebthings.com/waypoints/
요소가 뷰포트 상단에 도달하면 실행되는 리스너를 요소에 추가 할 수 있습니다.
$('#scroll-to').waypoint(function() {
alert('you have scrolled to the h1!');
});
사용중인 놀라운 데모 :
http://tympanus.net/codrops/2013/07/16/on-scroll-header-effects/
Inview 라이브러리 트리거 이벤트 및 jquery 1.8 이상에서 잘 작동합니다! https://github.com/protonet/jquery.inview
$('div').on('inview', function (event, visible) {
if (visible == true) {
// element is now visible in the viewport
} else {
// element has gone out of viewport
}
});
https://remysharp.com/2009/01/26/element-in-view-event-plugin 읽기
모든 기기에 사용할 수 있습니다.
$(document).on('scroll', function() {
if( $(this).scrollTop() >= $('#target_element').position().top ){
do_something();
}
});
스크롤이 성공한 후 한 번만 스크롤을 발사합니다.
받아 들인 대답은 저에게 효과적이지만 (90 %) 실제로 한 번만 실행하려면 약간 조정해야했습니다.
$(window).on('scroll',function() {
var hT = $('#comment-box-section').offset().top,
hH = $('#comment-box-section').outerHeight(),
wH = $(window).height(),
wS = $(this).scrollTop();
if (wS > ((hT+hH-wH)-500)){
console.log('comment box section arrived! eh');
// After Stuff
$(window).off('scroll');
doStuff();
}
});
참고 : 성공적인 스크롤이란 사용자가 내 요소로 스크롤했거나 즉 내 요소가보기에있을 때를 의미합니다.
다음 과 같은 이벤트와 함께 jQuery 플러그인 을 사용할 수 있습니다 inview
.
jQuery('.your-class-here').one('inview', function (event, visible) {
if (visible == true) {
//Enjoy !
}
});
링크 : https://remysharp.com/2009/01/26/element-in-view-event-plugin
이것이 필요한 것입니다.
자바 스크립트 :
$(window).scroll(function() {
var hT = $('#circle').offset().top,
hH = $('#circle').outerHeight(),
wH = $(window).height(),
wS = $(this).scrollTop();
console.log((hT - wH), wS);
if (wS > (hT + hH - wH)) {
$('.count').each(function() {
$(this).prop('Counter', 0).animate({
Counter: $(this).text()
}, {
duration: 900,
easing: 'swing',
step: function(now) {
$(this).text(Math.ceil(now));
}
});
}); {
$('.count').removeClass('count').addClass('counted');
};
}
});
CSS :
#circle
{
width: 100px;
height: 100px;
background: blue;
-moz-border-radius: 50px;
-webkit-border-radius: 50px;
border-radius: 50px;
float:left;
margin:5px;
}
.count, .counted
{
line-height: 100px;
color:white;
margin-left:30px;
font-size:25px;
}
#talkbubble {
width: 120px;
height: 80px;
background: green;
position: relative;
-moz-border-radius: 10px;
-webkit-border-radius: 10px;
border-radius: 10px;
float:left;
margin:20px;
}
#talkbubble:before {
content:"";
position: absolute;
right: 100%;
top: 15px;
width: 0;
height: 0;
border-top: 13px solid transparent;
border-right: 20px solid green;
border-bottom: 13px solid transparent;
}
HTML :
<div id="talkbubble"><span class="count">145</span></div>
<div style="clear:both"></div>
<div id="talkbubble"><span class="count">145</span></div>
<div style="clear:both"></div>
<div id="circle"><span class="count">1234</span></div>
이 bootply를 확인하십시오 : http://www.bootply.com/atin_agarwal2/cJBywxX5Qp
Intersection Observer는 외부 라이브러리 없이는 정말 좋은 일을하는 최고의 IMO가 될 수 있습니다.
const options = {
root: null,
threshold: 0.25, // 0 - 1 this work as a trigger.
rootMargin: '150px'
};
const target = document.querySelector('h1#scroll-to');
const observer = new IntersectionObserver(
entries => { // each entry checks if the element is the view or not and if yes trigger the function accordingly
entries.forEach(() => {
alert('you have scrolled to the h1!')
});
}, options);
observer.observe(target);
스크롤 위치를 기반으로 많은 기능을 수행하는 경우 Scroll magic ( http://scrollmagic.io/ )은 전적으로 이러한 목적을 위해 빌드됩니다.
스크롤 할 때 사용자가 특정 요소에 도달하는 시점에 따라 JS를 쉽게 트리거 할 수 있습니다. 또한 시차 스크롤링 웹 사이트에 적합한 GSAP 애니메이션 엔진 ( https://greensock.com/ ) 과 통합됩니다.
DaniP의 답변에 대한 빠른 수정일 뿐이며, 때때로 장치의 뷰포트 범위를 넘어 확장 할 수있는 요소를 다루는 모든 사람을위한 것입니다.
약간의 조건부 추가-뷰포트보다 큰 요소의 경우 상위 절반이 뷰포트를 완전히 채우면 요소가 표시됩니다.
function elementInView(el) {
// The vertical distance between the top of the page and the top of the element.
var elementOffset = $(el).offset().top;
// The height of the element, including padding and borders.
var elementOuterHeight = $(el).outerHeight();
// Height of the window without margins, padding, borders.
var windowHeight = $(window).height();
// The vertical distance between the top of the page and the top of the viewport.
var scrollOffset = $(this).scrollTop();
if (elementOuterHeight < windowHeight) {
// Element is smaller than viewport.
if (scrollOffset > (elementOffset + elementOuterHeight - windowHeight)) {
// Element is completely inside viewport, reveal the element!
return true;
}
} else {
// Element is larger than the viewport, handle visibility differently.
// Consider it visible as soon as it's top half has filled the viewport.
if (scrollOffset > elementOffset) {
// The top of the viewport has touched the top of the element, reveal the element!
return true;
}
}
return false;
}
나는 항상 동일한 코드를 사용하므로 간단한 jquery 플러그인을 추가했습니다. 480 바이트 길이, 빠름. 런타임에서 분석 된 바인딩 된 요소 만.
https://www.npmjs.com/package/jquery-on-scrolled-to
그것은 될 것입니다
$('#scroll-to').onScrolledTo(0, function() {
alert('you have scrolled to the h1!');
});
또는 h1의 절반이 표시 될 때 경고해야하는 경우 0 대신 0.5를 사용합니다.