как узнать дочерние дивы в центре div контейнера при прокрутке события вправо и влево?

#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. это не работает на полной странице, когда я запускаю фрагмент кода для точек