Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Появление при скролле и скрытие по клику (https://javascript.ru/forum/misc/80838-poyavlenie-pri-skrolle-i-skrytie-po-kliku.html)

samdo 12.08.2020 11:54

Появление при скролле и скрытие по клику
 
День добрый! Помогите по задачке, плиз: есть блок, который появляется/исчезает при скролле, также есть кнопка, чтобы его скрыть. При клике на это кнопку он скрывается, но если начинаем скроллить, то он опять появляется. Подскажите как сделать, чтобы он не появлялся при скролле если мы его закрыли кликом по кнопке. Вот код, которым я пытался это реализовать:

<div class="previous-post">
	<i class="fas fa-times prev-close"></i>
</div>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
  <script>
	$(document).ready(function(){
		$(window).scroll(function(){
			if($(window).scrollTop()>220){
				$('.previous-post').fadeIn(400)
			}else{
				$('.previous-post').fadeOut(400)
			}
		});
	})
	$(".prev-close").click(function() {
    $(".previous-post").slideToggle();
    $(this).hide();
	})
  </script>

<style>
.previous-post {
	display:none;
	position: fixed;
	right: 1%;
	bottom: 1%;
}
</style>

laimas 12.08.2020 12:17

$(window).one('scroll', ...


Если же это нужно запомнить навсегда или же на время сессии, то нужно запоминать состояние в локальном или сессионном хранилище браузера.

samdo 12.08.2020 12:22

Цитата:

Сообщение от laimas (Сообщение 527870)
$(window).one('scroll', ...


Если же это нужно запомнить навсегда или же на время сессии, то нужно запоминать состояние в локальном или сессионном хранилище браузера.

До первой перезагрузки страницы. Т.е. запоминается на то время, пока человек находится на этой странице.

laimas 12.08.2020 12:37

Цитата:

Сообщение от samdo
запоминается на то время, пока человек находится на этой странице

Ну значит так как написано.

samdo 12.08.2020 12:55

Что-то я по моему не так сделал)
$(document).ready(function(){
	$(window).one('scroll',function(){
			if($(window).scrollTop()>220){
				$('.previous-post').fadeIn(400)
			}else{
				$('.previous-post').fadeOut(400)
			}
		});
	})

laimas 12.08.2020 13:08

Я не знаю как вам надо, а чтобы поставить обработчик события единожды для этого используют метод .one(). А с проверкой, это нужно следить постоянно и при условии выключать обработчик - метод .off(). Видимо это нужно.

samdo 12.08.2020 13:13

Я добавил one (как выше я привёл), теперь блок при скролле не появляется) появляется только если я обновляю страницу, находясь внизу экрана.

laimas 12.08.2020 13:17

Если надо не скролл отследить, а некую позицию его, то не обработчик на один раз нужно устанавливать, а установить обработку события scroll методом .on(), и по вашему условию удалить его методом .off().

рони 12.08.2020 13:29

samdo,
заменить полностью на это
$(function() {
    var fn = function() {
        if ($(window).scrollTop() > 220) {
            $('.previous-post').stop().fadeIn(400)
        } else {
            $('.previous-post').stop().fadeOut(400)
        }
    }
    $(window).scroll(fn);
    $(".prev-close").click(function() {
        $(".previous-post").slideUp();
        $(window).off("scroll", fn);
    })
})

laimas 12.08.2020 13:34

А если быстро прокрутить, что будет со строками 4-6? Какой-то маразм во всем этом. Либо дошли до позиции, показали, задержка, скрыли и одновременно удалили обработчик. Либо хрен знает что хотят сделать, мало того, что это дерьмо всплывающее раздражает, так еще и мультик будет. :)


Часовой пояс GMT +3, время: 09:19.