div 안의 요소로 스크롤하는 방법
i i는 i i i i 。div
했을 때 이 가 강제로 진행됩니다.div
이치노자바스크립트
document.getElementById(chr).scrollIntoView(true);
모든 이 됩니다.div
그 자체입니다.걸걸어 ?떻 ???
요.MyContainerDiv.getElementById(chr).scrollIntoView(true);
뷰로 스크롤할 요소의 상위 오프셋(스크롤 구분 컨테이너)을 가져와야 합니다.
var myElement = document.getElementById('element_within_div');
var topPos = myElement.offsetTop;
이제 변수 topPos가 스크롤 div의 상단과 표시하려는 요소 사이의 거리(픽셀 단위)로 설정됩니다.
, 그럼 이제 그 해요.scrollTop
:
document.getElementById('scrolling_div').scrollTop = topPos;
프로토타입 JS 프레임워크를 사용하는 경우 다음과 같은 작업을 수행할 수 있습니다.
var posArray = $('element_within_div').positionedOffset();
$('scrolling_div').scrollTop = posArray[1];
다시 표시하려는 요소가 정확히 맨 위에 오도록 div를 스크롤합니다(또는 볼 수 없는 경우에는 최대한 아래로 스크롤하여 볼 수 있도록 함).
DIV에서 스크롤할 요소의 위치를 찾아 scrollTop 속성을 설정해야 합니다.
divElem.scrollTop = 0;
업데이트:
위아래로 이동하는 샘플 코드
function move_up() {
document.getElementById('divElem').scrollTop += 10;
}
function move_down() {
document.getElementById('divElem').scrollTop -= 10;
}
방법 1 - 요소 내부의 요소에 대한 부드러운 스크롤
var box = document.querySelector('.box'),
targetElm = document.querySelector('.boxChild'); // <-- Scroll to here within ".box"
document.querySelector('button').addEventListener('click', function(){
scrollToElm( box, targetElm , 600 );
});
/////////////
function scrollToElm(container, elm, duration){
var pos = getRelativePos(elm);
scrollTo( container, pos.top , 2); // duration in seconds
}
function getRelativePos(elm){
var pPos = elm.parentNode.getBoundingClientRect(), // parent pos
cPos = elm.getBoundingClientRect(), // target pos
pos = {};
pos.top = cPos.top - pPos.top + elm.parentNode.scrollTop,
pos.right = cPos.right - pPos.right,
pos.bottom = cPos.bottom - pPos.bottom,
pos.left = cPos.left - pPos.left;
return pos;
}
function scrollTo(element, to, duration, onDone) {
var start = element.scrollTop,
change = to - start,
startTime = performance.now(),
val, now, elapsed, t;
function animateScroll(){
now = performance.now();
elapsed = (now - startTime)/1000;
t = (elapsed/duration);
element.scrollTop = start + change * easeInOutQuad(t);
if( t < 1 )
window.requestAnimationFrame(animateScroll);
else
onDone && onDone();
};
animateScroll();
}
function easeInOutQuad(t){ return t<.5 ? 2*t*t : -1+(4-2*t)*t };
.box{ width:80%; border:2px dashed; height:180px; overflow:auto; }
.boxChild{
margin:600px 0 300px;
width: 40px;
height:40px;
background:green;
}
<button>Scroll to element</button>
<div class='box'>
<div class='boxChild'></div>
</div>
방법 2 - Element.scrollIntoView 사용:
브라우저 지원은 이 제품에는 적합하지 않습니다.
var targetElm = document.querySelector('.boxChild'), // reference to scroll target
button = document.querySelector('button'); // button that triggers the scroll
// bind "click" event to a button
button.addEventListener('click', function(){
targetElm.scrollIntoView()
})
.box {
width: 80%;
border: 2px dashed;
height: 180px;
overflow: auto;
scroll-behavior: smooth; /* <-- for smooth scroll */
}
.boxChild {
margin: 600px 0 300px;
width: 40px;
height: 40px;
background: green;
}
<button>Scroll to element</button>
<div class='box'>
<div class='boxChild'></div>
</div>
방법 3 - CSS 스크롤 동작 사용:
.box {
width: 80%;
border: 2px dashed;
height: 180px;
overflow-y: scroll;
scroll-behavior: smooth; /* <--- */
}
#boxChild {
margin: 600px 0 300px;
width: 40px;
height: 40px;
background: green;
}
<a href='#boxChild'>Scroll to element</a>
<div class='box'>
<div id='boxChild'></div>
</div>
네이티브 JS, 크로스 브라우저, 스무스 스크롤(업데이트 2020)
★★ScrollTop
원하는 결과를 얻을 수 있지만 스크롤이 매우 갑작스럽습니다.「」를 사용합니다.jquery
부드러운 스크롤은 선택사항이 아니었다.여기 모든 주요 브라우저를 지원하는 작업을 수행하는 기본 방법이 있습니다.참조 - 카니우스
// get the "Div" inside which you wish to scroll (i.e. the container element)
const El = document.getElementById('xyz');
// Lets say you wish to scroll by 100px,
El.scrollTo({top: 100, behavior: 'smooth'});
// If you wish to scroll until the end of the container
El.scrollTo({top: El.scrollHeight, behavior: 'smooth'});
바로 그거야!
그리고 여기 의심스러운 사람들을 위한 작업 토막이 있습니다.
document.getElementById('btn').addEventListener('click', e => {
e.preventDefault();
// smooth scroll
document.getElementById('container').scrollTo({top: 175, behavior: 'smooth'});
});
/* just some styling for you to ignore */
.scrollContainer {
overflow-y: auto;
max-height: 100px;
position: relative;
border: 1px solid red;
width: 120px;
}
body {
padding: 10px;
}
.box {
margin: 5px;
background-color: yellow;
height: 25px;
display: flex;
align-items: center;
justify-content: center;
}
#goose {
background-color: lime;
}
<!-- Dummy html to be ignored -->
<div id="container" class="scrollContainer">
<div class="box">duck</div>
<div class="box">duck</div>
<div class="box">duck</div>
<div class="box">duck</div>
<div class="box">duck</div>
<div class="box">duck</div>
<div class="box">duck</div>
<div class="box">duck</div>
<div id="goose" class="box">goose</div>
<div class="box">duck</div>
<div class="box">duck</div>
<div class="box">duck</div>
<div class="box">duck</div>
</div>
<button id="btn">goose</button>
업데이트: 댓글에서 알 수 있듯이Element.scrollTo()
되지 않습니다.따라서 IE11에 관심이 없는 경우(Microsoft는 2022년 6월에 IE11을 폐기합니다)는 모든 프로젝트에서 자유롭게 사용하실 수 있습니다.엣지!를 그대로 두고 Edge/Windows 사용자에게는 문제가 없습니다.
를 div에만 이 div를 할 수 .scrollIfNeeded
★★★★
function scrollIfNeeded(element, container) {
if (element.offsetTop < container.scrollTop) {
container.scrollTop = element.offsetTop;
} else {
const offsetBottom = element.offsetTop + element.offsetHeight;
const scrollBottom = container.scrollTop + container.offsetHeight;
if (offsetBottom > scrollBottom) {
container.scrollTop = offsetBottom - container.offsetHeight;
}
}
}
document.getElementById('btn').addEventListener('click', ev => {
ev.preventDefault();
scrollIfNeeded(document.getElementById('goose'), document.getElementById('container'));
});
.scrollContainer {
overflow-y: auto;
max-height: 100px;
position: relative;
border: 1px solid red;
width: 120px;
}
body {
padding: 10px;
}
.box {
margin: 5px;
background-color: yellow;
height: 25px;
display: flex;
align-items: center;
justify-content: center;
}
#goose {
background-color: lime;
}
<div id="container" class="scrollContainer">
<div class="box">duck</div>
<div class="box">duck</div>
<div class="box">duck</div>
<div class="box">duck</div>
<div class="box">duck</div>
<div class="box">duck</div>
<div class="box">duck</div>
<div class="box">duck</div>
<div id="goose" class="box">goose</div>
<div class="box">duck</div>
<div class="box">duck</div>
<div class="box">duck</div>
<div class="box">duck</div>
</div>
<button id="btn">scroll to goose</button>
코드는 다음과 같습니다.
var divElem = document.getElementById('scrolling_div');
var chElem = document.getElementById('element_within_div');
var topPos = divElem.offsetTop;
divElem.scrollTop = topPos - chElem.offsetTop;
하위 상단 위치와 div의 상단 위치 간의 차이를 스크롤하려고 합니다.
다음을 사용하여 하위 요소에 액세스합니다.
var divElem = document.getElementById('scrolling_div');
var numChildren = divElem.childNodes.length;
기타 등등...
jQuery를 사용하는 경우 다음을 사용하여 애니메이션으로 스크롤할 수 있습니다.
$(MyContainerDiv).animate({scrollTop: $(MyContainerDiv).scrollTop() + ($('element_within_div').offset().top - $(MyContainerDiv).offset().top)});
애니메이션은 선택 사항입니다. 위에서 계산한 scrollTop 값을 컨테이너의 scrollTop 속성에 직접 넣을 수도 있습니다.
JQuery 등의 libs를 사용하지 않고 이 문제를 해결할 수 있습니다.
이를 위해 다음과 같은 코드를 작성했습니다.
구조는 비슷합니다.->
<div class="parent">
<div class="child-one">
</div>
<div class="child-two">
</div>
</div>
JS:
scrollToElement() {
var parentElement = document.querySelector('.parent');
var childElement = document.querySelector('.child-two');
parentElement.scrollTop = childElement.offsetTop - parentElement.offsetTop;
}
우리는 부모와 아이를 넘겨주는 이 방법을 인수로 쉽게 다시 쓸 수 있다.
jQuery와 애니메이션을 사용하는 또 다른 예제입니다.
var container = $('#container');
var element = $('#element');
container.animate({
scrollTop: container.scrollTop = container.scrollTop() + element.offset().top - container.offset().top
}, {
duration: 1000,
specialEasing: {
width: 'linear',
height: 'easeOutBounce'
},
complete: function (e) {
console.log("animation completed");
}
});
두 가지 사실이 있습니다.
1) safari에서는 component scrollIntoView가 지원되지 않습니다.
2) JS 프레임워크 jQuery는 다음과 같은 작업을 수행할 수 있습니다.
parent = 'some parent div has css position==="fixed"' || 'html, body';
$(parent).animate({scrollTop: $(child).offset().top}, duration)
다른 어떤 대답도 내 문제를 해결하지 못했다.
ScrollIntoView 주장을 가지고 놀다가 해결책을 찾아냈습니다.설정inline
로로 합니다.start
★★★★★★★★★★★★★★★★★」block
로로 합니다.nearest
는 부모 요소 페이지가 스크롤하는 것을 합니다.부모 요소또는 페이지 전체)는 다음과 같습니다.
document.getElementById(chr).scrollIntoView({
behavior: 'smooth',
block: 'nearest',
inline: 'start'
});
Value for adget Number'(' for adget')에하는 단순한 입니다.scrollTop
「DOM」 「String」:
/**
* target - target to scroll to (DOM element, scrollTop Number, 'top', or 'bottom'
* containerEl - DOM element for the container with scrollbars
*/
var scrollToTarget = function(target, containerEl) {
// Moved up here for readability:
var isElement = target && target.nodeType === 1,
isNumber = Object.prototype.toString.call(target) === '[object Number]';
if (isElement) {
containerEl.scrollTop = target.offsetTop;
} else if (isNumber) {
containerEl.scrollTop = target;
} else if (target === 'bottom') {
containerEl.scrollTop = containerEl.scrollHeight - containerEl.offsetHeight;
} else if (target === 'top') {
containerEl.scrollTop = 0;
}
};
다음은 사용 예를 제시하겠습니다.
// Scroll to the top
var scrollableDiv = document.getElementById('scrollable_div');
scrollToTarget('top', scrollableDiv);
또는
// Scroll to 200px from the top
var scrollableDiv = document.getElementById('scrollable_div');
scrollToTarget(200, scrollableDiv);
또는
// Scroll to targetElement
var scrollableDiv = document.getElementById('scrollable_div');
var targetElement= document.getElementById('target_element');
scrollToTarget(targetElement, scrollableDiv);
안으로 스크롤하는 데 필요한 div 요소가 있으면 이 코드를 사용해 보십시오.
document.querySelector('div').scroll(x,y)
이것은 스크롤이 있는 div 안에서 동작합니다.마우스를 이 요소 위로 포인트 한 후 아래로 스크롤을 시도했을 때 동작합니다.수동으로 동작하는 경우는, 동작도 할 수 있습니다.
사용자 애니메이션 스크롤
을 하는 <div>
수평으로, 없이JQuery. 수직으로 스크롤하려면 JavaScript의 쓰기를 다음으로 바꿉니다.scrollLeft
scrollTop
네, 네
JSFiddle
https://jsfiddle.net/fNPvf/38536/
HTML
<!-- Left Button. -->
<div style="float:left;">
<!-- (1) Whilst it's pressed, increment the scroll. When we release, clear the timer to stop recursive scroll calls. -->
<input type="button" value="«" style="height: 100px;" onmousedown="scroll('scroller',3, 10);" onmouseup="clearTimeout(TIMER_SCROLL);"/>
</div>
<!-- Contents to scroll. -->
<div id="scroller" style="float: left; width: 100px; height: 100px; overflow: hidden;">
<!-- <3 -->
<img src="https://cdn.sstatic.net/Sites/stackoverflow/company/img/logos/so/so-logo.png?v=9c558ec15d8a" alt="image large" style="height: 100px" />
</div>
<!-- Right Button. -->
<div style="float:left;">
<!-- As (1). (Use a negative value of 'd' to decrease the scroll.) -->
<input type="button" value="»" style="height: 100px;" onmousedown="scroll('scroller',-3, 10);" onmouseup="clearTimeout(TIMER_SCROLL);"/>
</div>
자바스크립트
// Declare the Shared Timer.
var TIMER_SCROLL;
/**
Scroll function.
@param id Unique id of element to scroll.
@param d Amount of pixels to scroll per sleep.
@param del Size of the sleep (ms).*/
function scroll(id, d, del){
// Scroll the element.
document.getElementById(id).scrollLeft += d;
// Perform a delay before recursing this function again.
TIMER_SCROLL = setTimeout("scroll('"+id+"',"+d+", "+del+");", del);
}
덕스 덕분이야
자동 애니메이션 스크롤
a, a, a, a를 스크롤 하는 기능도 .<div>
이치노여기서 변경하는 것은 스크롤을 다시 스크롤하기 위한 재귀 호출을 하기 전에 스크롤의 전체 확장자가 사용되었는지 확인하는 것뿐입니다.
JSFiddle
https://jsfiddle.net/0nLc2fhh/1/
HTML
<!-- Left Button. -->
<div style="float:left;">
<!-- (1) Whilst it's pressed, increment the scroll. When we release, clear the timer to stop recursive scroll calls. -->
<input type="button" value="«" style="height: 100px;" onclick="scrollFullyLeft('scroller',3, 10);"/>
</div>
<!-- Contents to scroll. -->
<div id="scroller" style="float: left; width: 100px; height: 100px; overflow: hidden;">
<!-- <3 -->
<img src="https://cdn.sstatic.net/Sites/stackoverflow/company/img/logos/so/so-logo.png?v=9c558ec15d8a" alt="image large" style="height: 100px" />
</div>
<!-- Right Button. -->
<div style="float:left;">
<!-- As (1). (Use a negative value of 'd' to decrease the scroll.) -->
<input type="button" value="»" style="height: 100px;" onclick="scrollFullyRight('scroller',3, 10);"/>
</div>
자바스크립트
// Declare the Shared Timer.
var TIMER_SCROLL;
/**
Scroll fully left function; completely scrolls a <div> to the left, as far as it will go.
@param id Unique id of element to scroll.
@param d Amount of pixels to scroll per sleep.
@param del Size of the sleep (ms).*/
function scrollFullyLeft(id, d, del){
// Fetch the element.
var el = document.getElementById(id);
// Scroll the element.
el.scrollLeft += d;
// Have we not finished scrolling yet?
if(el.scrollLeft < (el.scrollWidth - el.clientWidth)) {
TIMER_SCROLL = setTimeout("scrollFullyLeft('"+id+"',"+d+", "+del+");", del);
}
}
/**
Scroll fully right function; completely scrolls a <div> to the right, as far as it will go.
@param id Unique id of element to scroll.
@param d Amount of pixels to scroll per sleep.
@param del Size of the sleep (ms).*/
function scrollFullyRight(id, d, del){
// Fetch the element.
var el = document.getElementById(id);
// Scroll the element.
el.scrollLeft -= d;
// Have we not finished scrolling yet?
if(el.scrollLeft > 0) {
TIMER_SCROLL = setTimeout("scrollFullyRight('"+id+"',"+d+", "+del+");", del);
}
}
이것이 마침내 나에게 도움이 된 것이다.
/** Set parent scroll to show element
* @param element {object} The HTML object to show
* @param parent {object} The HTML object where the element is shown */
var scrollToView = function(element, parent) {
//Algorithm: Accumulate the height of the previous elements and add half the height of the parent
var offsetAccumulator = 0;
parent = $(parent);
parent.children().each(function() {
if(this == element) {
return false; //brake each loop
}
offsetAccumulator += $(this).innerHeight();
});
parent.scrollTop(offsetAccumulator - parent.innerHeight()/2);
}
포커스를 에 대해 할 를 "로 위해 .<a>...</a>
스크롤이 필요할 때는 거기에 포커스를 맞추면 됩니다.a
언급URL : https://stackoverflow.com/questions/635706/how-to-scroll-to-an-element-inside-a-div
'sourcecode' 카테고리의 다른 글
왜 이것이 정의되지 않은 동작입니까? (0) | 2022.11.06 |
---|---|
json 경로(mariadb) (0) | 2022.11.06 |
mysql 테이블의 컬럼 기본값을 변경하려면 어떻게 해야 합니까? (0) | 2022.11.06 |
PHP 유닛 테스트 실행 중 CLI에서 출력하는 방법 (0) | 2022.11.06 |
jdbc:mariadb(Netbeans)에 적합한 드라이버를 찾을 수 없습니다. (0) | 2022.11.06 |