반응형
클릭시 특정 div로 부드럽게 스크롤
내가하려는 것은 버튼을 클릭하면 페이지의 특정 div로 (부드럽게) 스크롤되도록 만드는 것입니다.
내가 필요한 것은 버튼을 클릭하면 div '초'로 부드럽게 스크롤됩니다.
.first {
width: 100%;
height: 1000px;
background: #ccc;
}
.second {
width: 100%;
height: 1000px;
background: #999;
}
<div class="first"><button type="button">Click Me!</button></div>
<div class="second">Hi</div>
하다:
$("button").click(function() {
$('html,body').animate({
scrollTop: $(".second").offset().top},
'slow');
});
Jsfiddle 업데이트
jQuery, Mootools, Prototype 등과 같은 JS 라이브러리를 사용한 부드러운 스크롤링의 예가 많이 있습니다.
다음 예제는 순수 JavaScript에 있습니다. 페이지에 jQuery / Mootools / Prototype이 없거나 무거운 JS 라이브러리로 페이지를 오버로드하지 않으려면 예제가 도움이 될 것입니다.
HTML 부분 :
<div class="first"><button type="button" onclick="smoothScroll(document.getElementById('second'))">Click Me!</button></div>
<div class="second" id="second">Hi</div>
CSS 부분 :
.first {
width: 100%;
height: 1000px;
background: #ccc;
}
.second {
width: 100%;
height: 1000px;
background: #999;
}
JS 부분 :
window.smoothScroll = function(target) {
var scrollContainer = target;
do { //find scroll container
scrollContainer = scrollContainer.parentNode;
if (!scrollContainer) return;
scrollContainer.scrollTop += 1;
} while (scrollContainer.scrollTop == 0);
var targetY = 0;
do { //find the top of target relatively to the container
if (target == scrollContainer) break;
targetY += target.offsetTop;
} while (target = target.offsetParent);
scroll = function(c, a, b, i) {
i++; if (i > 30) return;
c.scrollTop = a + (b - a) / 30 * i;
setTimeout(function(){ scroll(c, a, b, i); }, 20);
}
// start scrolling
scroll(scrollContainer, scrollContainer.scrollTop, targetY, 0);
}
나는 니코의 대답을 조금 가지고 놀았고 불안해했습니다. 약간의 조사를 수행하고 window.requestAnimationFrame
각 다시 그리기주기에서 호출되는 함수를 찾았습니다 . 이를 통해보다 깔끔한 애니메이션을 만들 수 있습니다. 단계 크기에 대한 좋은 기본값을 계속 연마하려고하지만 제 예제에서는이 구현을 사용하여 매우 좋아 보입니다.
var smoothScroll = function(elementId) {
var MIN_PIXELS_PER_STEP = 16;
var MAX_SCROLL_STEPS = 30;
var target = document.getElementById(elementId);
var scrollContainer = target;
do {
scrollContainer = scrollContainer.parentNode;
if (!scrollContainer) return;
scrollContainer.scrollTop += 1;
} while (scrollContainer.scrollTop == 0);
var targetY = 0;
do {
if (target == scrollContainer) break;
targetY += target.offsetTop;
} while (target = target.offsetParent);
var pixelsPerStep = Math.max(MIN_PIXELS_PER_STEP,
(targetY - scrollContainer.scrollTop) / MAX_SCROLL_STEPS);
var stepFunc = function() {
scrollContainer.scrollTop =
Math.min(targetY, pixelsPerStep + scrollContainer.scrollTop);
if (scrollContainer.scrollTop >= targetY) {
return;
}
window.requestAnimationFrame(stepFunc);
};
window.requestAnimationFrame(stepFunc);
}
나는 Ned Rockson 의 버전을 가져 와서 위쪽 스크롤도 허용하도록 조정했습니다.
var smoothScroll = function(elementId) {
var MIN_PIXELS_PER_STEP = 16;
var MAX_SCROLL_STEPS = 30;
var target = document.getElementById(elementId);
var scrollContainer = target;
do {
scrollContainer = scrollContainer.parentNode;
if (!scrollContainer) return;
scrollContainer.scrollTop += 1;
} while (scrollContainer.scrollTop === 0);
var targetY = 0;
do {
if (target === scrollContainer) break;
targetY += target.offsetTop;
} while (target = target.offsetParent);
var pixelsPerStep = Math.max(MIN_PIXELS_PER_STEP,
Math.abs(targetY - scrollContainer.scrollTop) / MAX_SCROLL_STEPS);
var isUp = targetY < scrollContainer.scrollTop;
var stepFunc = function() {
if (isUp) {
scrollContainer.scrollTop = Math.max(targetY, scrollContainer.scrollTop - pixelsPerStep);
if (scrollContainer.scrollTop <= targetY) {
return;
}
} else {
scrollContainer.scrollTop = Math.min(targetY, scrollContainer.scrollTop + pixelsPerStep);
if (scrollContainer.scrollTop >= targetY) {
return;
}
}
window.requestAnimationFrame(stepFunc);
};
window.requestAnimationFrame(stepFunc);
};
참고 URL : https://stackoverflow.com/questions/18071046/smooth-scroll-to-specific-div-on-click
반응형
'programing tip' 카테고리의 다른 글
SQL Server 날짜 시간을 더 짧은 날짜 형식으로 변환 (0) | 2020.10.23 |
---|---|
"UNC 경로가 지원되지 않습니다"라는 메시지없이 네트워크 공유에서 배치 파일을 실행하는 방법은 무엇입니까? (0) | 2020.10.23 |
Git 리포지토리에서 삭제 된 폴더 복원 (0) | 2020.10.23 |
qtDesigner .ui 파일을 python / pyqt에 연결 하시겠습니까? (0) | 2020.10.23 |
웹뷰의 초기 확대 / 축소 / 너비를 설정하는 방법 (0) | 2020.10.23 |