#javascript #html #css
Вопрос:
пытаясь выполнить «прокрутку» события, и когда в функции обратного вызова запись div позиции только запись последней позиции, я хочу знать, находится ли этот div в центральной цели, которую я хочу
const slide = document.querySelector(".slides")
slide.addEventListener('scroll', function(e) {
const slide2 = document.querySelector("#slide-2")
console.log(slide2.offsetLeft)
})
<div class="slider">
<a href="#slide-1">1</a>
<a href="#slide-2">2</a>
<a href="#slide-3">3</a>
<a href="#slide-4">4</a>
<a href="#slide-5">5</a>
<div class="slides">
<div id="slide-1">1</div>
<div id="slide-2">2</div>
<div id="slide-3">3</div>
<div id="slide-4">4</div>
<div id="slide-5">5</div>
</div>
</div>
моя цель здесь Я хочу знать , есть ли у пользователя в этом разделе справа и слева для моего слайдера
, чтобы я мог делать активные точки, я пытаюсь просто использовать собственный javascript здесь 🙂
вот мой пример кода https://codepen.io/lpllplp222/pen/BaRvwKm
Комментарии:
1. Вам нужно проверить положение прокрутки
slides
родительского элемента, проверить, совпадает ли текущая позиция с каким слайдом, и активировать соответствующую точку2. это не реагирует на изменение, когда я вызываю slide.offsetWidth, как я могу правильно определить левое и правое положение??
3. Можете ли вы использовать jQuery ?
4. я понятия не имею о jquery :D, но существующий код использует чистый javascript :D, поэтому я спрашиваю, как узнать это событие прокрутки с помощью javascript 🙂 @Абинтаха
5. Вы можете использовать JavaScript для достижения этой цели, но это будет нелегкое решение. Вместо этого вы можете использовать jQuery, чтобы легко достичь этого.
Ответ №1:
Я привык jQuery
добиваться того же самого.
position()
функция из jQuery предоставляет текущее положение элемента сверху и слева, я использую левое значение для вычисления текущего активного элемента и получения его индекса, тем самым предоставляя активный класс соответствующей точке.
const slide = document.querySelector(".slides")
$('#slider-dots a').on('click', function(event) {
event.stopPropagation();
})
slide.addEventListener('scroll', function(e) {
var scrollLeft = $('#slides-wrapper').scrollLeft();
var currIndex = -1;
$('#slider-dots a').removeClass('active');
for(var i = 0; i<$('#slides-wrapper div').length; i ) {
if($($('#slides-wrapper div')[i]).position().left >= 0 amp;amp; currIndex === -1) {
currIndex = i;
}
}
$($('#slider-dots a')[currIndex]).addClass('active');
})
* {
box-sizing: border-box;
}
.slider {
width: 400px;
text-align: center;
overflow: hidden;
}
.slides {
display: flex;
overflow-x: auto;
scroll-snap-type: x mandatory;
scroll-behavior: smooth;
-webkit-overflow-scrolling: touch;
/*
scroll-snap-points-x: repeat(300px);
scroll-snap-type: mandatory;
*/
}
.slides::-webkit-scrollbar {
width: 10px;
height: 10px;
}
#slider-dots a.active {
color: violet;
background-color: #000;
}
.slides::-webkit-scrollbar-thumb {
background: black;
border-radius: 10px;
}
.slides::-webkit-scrollbar-track {
background: transparent;
}
.slides > div {
scroll-snap-align: start;
flex-shrink: 0;
width: 300px;
height: 200px;
margin-right: 50px;
border-radius: 10px;
background: #eee;
transform-origin: center center;
transform: scale(1);
transition: transform 0.5s;
position: relative;
display: flex;
justify-content: center;
align-items: center;
font-size: 100px;
}
.slides > div:target {
/* transform: scale(0.8); */
}
.author-info {
background: rgba(0, 0, 0, 0.75);
color: white;
padding: 0.75rem;
text-align: center;
position: absolute;
bottom: 0;
left: 0;
width: 100%;
margin: 0;
}
.author-info a {
color: white;
}
img {
object-fit: cover;
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
.slider > a {
display: inline-flex;
width: 1.5rem;
height: 1.5rem;
background: white;
text-decoration: none;
align-items: center;
justify-content: center;
border-radius: 50%;
margin: 0 0 0.5rem 0;
position: relative;
}
.slider > a:active {
top: 1px;
}
.slider > a:focus {
background: #000;
}
/* Don't need button navigation */
@supports (scroll-snap-type) {
.slider > a {
display: none;
}
}
html,
body {
height: 100%;
overflow: hidden;
}
body {
display: flex;
align-items: center;
justify-content: center;
background: linear-gradient(to bottom, #74abe2, #5563de);
font-family: "Ropa Sans", sans-serif;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="slider" id='slider-dots'>
<a href="#slide-1">1</a>
<a href="#slide-2">2</a>
<a href="#slide-3">3</a>
<a href="#slide-4">4</a>
<a href="#slide-5">5</a>
<div id='slides-wrapper' class="slides">
<div id="slide-1">
1
</div>
<div id="slide-2">
2
</div>
<div id="slide-3">
3
</div>
<div id="slide-4">
4
</div>
<div id="slide-5">
5
</div>
</div>
</div>
Комментарии:
1. когда я прокручиваю влево и вправо, число не совпадает с тем, в каком поле идет, также при нажатии, когда я нажимаю 3, оно должно быть активным на 3, но ваш код активирован на 2
2. Что касается меня, я не вижу тех 2 проблем, о которых вы упомянули.
3. dost 5 не активен
4. это не работает на полной странице, когда я запускаю фрагмент кода для точек