Условный addEventListener, когда идентификатор div находится в верхней части окна

Я пытаюсь использовать addEventListener, когда пользователь scroll в поле зрения <div id = "container">. Я сделал это по высоте прокрутки, но мои попытки addEventListener, когда <div> находится в верхней части окна.

handleHeaderStuck = () => {
    if (this.innerContainer.scrollTop <= 500 && this.state.isStuck === true) {
        this.setState({isStuck: false});
    }
    else if (this.innerContainer.scrollTop >= 500 && this.state.isStuck !== true) {
        this.setState({isStuck: true});
    }
}

Это будет setState при прокрутке 500px.

Как я могу заменить условие 500px, которое будет установлено, когда пользователь находится с id = "container" в верхней части окна? Также замените состояние isStuck на isStuckBottom, когда пользователь достигает нижней части div.

Полный код

constructor(props) {
    super(props)
    this.state = {
      isStuck: false,
    }
    this.handleHeaderStuck = this.handleHeaderStuck.bind(this)
  }

  innerContainer = null

  componentDidMount () {
    this.innerContainer.addEventListener("scroll", this.handleHeaderStuck);
  }

  componentWillUnmount () {
    this.innerContainer.removeEventListener("scroll", this.handleHeaderStuck);    
  }

  handleHeaderStuck = () => {
     if (this.innerContainer.scrollTop <= 500 && this.state.isStuck === true) {
        this.setState({isStuck: false});
     }
     else if (this.innerContainer.scrollTop >= 500 && this.state.isStuck !== true) {
        this.setState({isStuck: true});
     }
  }
github.com/joshwnj/react-visibility-sensor
Max Baldwin 24.04.2018 22:21

Спасибо @MaxBaldwin. Я проверю это.

Darren 24.04.2018 22:22

Комментарий @Andreas действителен. Я собирался упомянуть getBoundingClientRect, но кто-то уже решил эту проблему в React. Зачем решать самому?

Max Baldwin 24.04.2018 22:25

@MaxBaldwin. Проблема, которую я обнаружил с react-visibility-sensor, заключается в том, что нет возможности заставить датчик реагировать на то, как div достигает 0px в окне. Знаете ли вы, как этого можно достичь с помощью этого решения?

Darren 25.04.2018 00:20

Посмотрите на пример в отправленных мною документах. Вы оборачиваете свой компонент датчиком видимости, а затем передаете датчику видимости функцию его опоры onChange. Эта функция получает isVisible в качестве параметра. Если под 0px вы имеете в виду вход в область просмотра, тогда isVisible переходит из false в true. Если вам нужен пример, дайте мне знать, и я напишу ответ, когда вернусь домой

Max Baldwin 25.04.2018 00:25

Спасибо за ответ @MaxBaldwin. Да, эта часть работает без проблем. Пытаюсь найти способ определить, когда верхняя часть контейнера div находится на 0 пикселей.

Darren 25.04.2018 01:36

@ Даррен, посмотрим, поможет ли это? jsfiddle.net/tarunlalwani/xmfxpmf5

Tarun Lalwani 29.04.2018 08:30

@Darren «верх контейнера div равен верхнему 0 пикселей». Что ты имеешь в виду? На scrollTop 0?

Max Baldwin 30.04.2018 17:27

Когда верхняя часть div достигает верха области просмотра.

Darren 30.04.2018 17:41
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
7
10
735
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

  var atTop = false;
    var atBotton = false;
    document.addEventListener("scroll", e => {

      var elemInfo = document.getElementById("container").getClientRects()[0];
      if (parseInt(elemInfo.bottom) >= window.innerHeight) 
      {
      	if (!atBottom){
          console.info("I touche the bottom")
          document.getElementById("information").innerHTML = "mouse  reached the bottom";
          atBottom = true;
        }
        atTop = false;
      } else if (parseInt(elemInfo.top) <= 0) {
        if (!atTop) {
          console.info("Mouse at top")
          document.getElementById("information").innerHTML = "I touched the top";
          atTop = true;
        }
        atBottom = false;
      } else {
          console.info("I touched the nothing")
      }
    });
body {
      margin: 0px;
      padding: 0px;
      border: 0px;
    }

    .first, .bottom {
      width: 100%;
      height: 200px;
      background-color: Green;
    }

    #container {
      width: 100%;
      background-color: Yellow;
      margin: 0px;
      padding: 0px;
      border: 1 px solid black;
      height: 200px;
    }

    #infomation {
      font-size: 50px;
    }
    <div class = "example">

    </div>
    <div id=container>
    <div id=information></div></div>
    <div class = "bottom">

    </div>

Вы добавляете "scroll" в document и проверяете, находится ли div в настоящее время на 0 относительно текущего окна просмотра. Чтобы получить позицию относительно текущего представления пользователя, вы можете использовать getBoundingClientRect(). Реализовать это можно так:

document.addEventListener("scroll", () => {
  div = document.querySelector("#container")
  if (div.getBoundingClientRect().top == 0) {
    //Do what you need to do here, this executes whenever the
    //top of the container is at the top of the screen.
  }
})

Другие вопросы по теме