прокрутка до элемента в горизонтальном div
У меня есть горизонтальный div:
Мне нужно прокрутить до определенного элемента в этом div с помощью кнопки JavaScript (после нажатия div необходимо прокрутить до этого элемента). Как я могу это сделать?
<div class="group" id="frames">
<div class="item frames-item">
<img src="1.jpg">
</div>
<div class="item frames-item">
<img src="2.jpg">
</div>
....
....
</div>
6 ответов
или вы можете использовать следующий фрагмент:
$('.scrollable').animate({scrollLeft: $('#dstElement').position().left}, 500);
здесь position()
возвращает #dstElement
's относительное положение к `.scrollable ' если scrollable расположен.
Code & Demo
var $scroller = $('.scroller');
// assign click handler
$('button').on('click', function () {
// get the partial id of the div to scroll to
var divIdx = $('input').val();
// retrieve the jquery ref to the div
var scrollTo = $('#d'+divIdx)
// change its bg
.css('background', '#9f3')
// retrieve its position relative to its parent
.position().left;
console.log(scrollTo);
// simply update the scroll of the scroller
// $('.scroller').scrollLeft(scrollTo);
// use an animation to scroll to the destination
$scroller
.animate({'scrollLeft': scrollTo}, 500);
});
.scroller {
width: 300px;
height: 100px;
overflow-x: auto;
overflow-y: hidden;
}
.container {
position: relative; /*important for the .position() method */
height: 100px;
width: 770px;
}
.container div {
height: 90px;
width: 60px;
float: left;
margin: 5px;
background: #39f;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="scroller">
<div class="container">
<div id="d1"></div>
<div id="d2"></div>
<div id="d3"></div>
<div id="d4"></div>
<div id="d5"></div>
<div id="d6"></div>
<div id="d7"></div>
<!-- ... -->
</div>
</div>
<button>Scroll to: </button> <input type="text" value="4"/>
попробуйте ниже функцию, чтобы сделать элемент или li в центре по щелчку
function centerItVariableWidth(target, outer){
var out = $(outer);
var tar = $(target);
var x = out.width();
var y = tar.outerWidth(true);
var z = tar.index();
var q = 0;
var m = out.find('li');
//Just need to add up the width of all the elements before our target.
for(var i = 0; i < z; i++){
q+= $(m[i]).outerWidth(true);
}
out.scrollLeft(Math.max(0, q - (x - y)/2));
}
код ниже должен сделать трюк:
document.addEventListener('DOMContentLoaded', function () {
var frames = document.getElementById('frames');
frames.addEventListener('click', function (e) {
if (e.target.classList.contains('item')) {
e.target.parentNode.scrollLeft = e.target.offsetLeft;
}
});
});
body {
background: red;
}
.group{
width: 300px;
display: flex;
position: relative; /* This is important for the js offsetLeft property */
overflow-x: scroll;
}
.item{
width: 200px;
background: #eee;
margin-right: 10px;
}
<div class="group" id="frames">
<div class="item frames-item">paul</div>
<div class="item frames-item">coucou</div>
<div class="item frames-item">jojoij</div>
<div class="item frames-item">zoie</div>
<div class="item frames-item">foez</div>
<div class="item frames-item">popze</div>
<div class="item frames-item">kvk</div>
<div class="item frames-item">poe</div>
<div class="item frames-item">hfihuazf</div>
<div class="item frames-item">jeeze</div>
<div class="item frames-item">pposd</div>
<div class="item frames-item">nvnn</div>
</div>
Если у вас есть элемент, который имеет внутреннюю горизонтальную прокрутку, вы можете сделать так, как следует из моего примера: две стрелки с классами, которые используются, будут прокручивать элемент в стороны.
в этом случае, у меня С класса .вкладки, которые мне нужно двигаться. 500-это время в миллисекундах для анимации прокрутки, так что вы можете иметь свой собственный слайдер..
var scroll = 0;
$('.js-move-list-right').click(function(){
scroll = scroll + 400;
$('#timeline .tabs').animate({scrollLeft: scroll}, 500);
});
$('.js-move-list-left').click(function(){
scroll = scroll - 400;
$('#timeline .tabs').animate({scrollLeft: scroll}, 500);
});