Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 26.12.2022, 02:34
Интересующийся
Отправить личное сообщение для sega1821 Посмотреть профиль Найти все сообщения от sega1821
 
Регистрация: 30.10.2020
Сообщений: 29

Добавить класс во время скролла
Здравствуйте. Есть кастомный курсор к которому добавляется класс в определенном блоке. Проблема в том, что не могу отследить событие мыши во время скролла колесиком. Событие pointerover вроде как добавляет класс при скролле, а вот pointerleave удалить не может.

<body>
<div class="hover-block"></div>  
<div id="cursor"></div> 
</body>


body{ padding:400px 0 1000px;}  
body *{cursor:none!important}

.hover-block{
  width:100%;  
  height:400px;
  background-color:red;  
} 
#cursor{position:fixed;}
#cursor.is-slider{
	z-index:100000;
	pointer-events:none;
	border-radius:50%;
	background:green;
	opacity:.75;
	width:30px;
	height:30px;
	margin:-15px 0 0 -15px;
	background-repeat:no-repeat;
	background-size:100% 100%
}


customCursor()
function customCursor(e) {
    const cursor = document.querySelector('#cursor')

    document.addEventListener('mousemove', e => {
        const target = e.target
        const diff = 2
        const x = e.clientX
        const y = e.clientY

        cursor.classList.remove('is-hide')
        // cursor.style.opacity = 1

        cursor.style.left = x + 'px'
        cursor.style.top = y + 'px'

        
         if (target.closest('.hover-block')) {
            cursor.classList.add('is-slider')
             $('body').addClass('cursnone');
        }
        else {
            $('body').removeClass('cursnone');
            cursor.classList.remove('is-slider')
        }
    })

    document.addEventListener('mouseout', e => {
        cursor.classList.add('is-hide')
        // cursor.style.opacity = 0
    })  
    
    document.addEventListener('pointerover', e => {
        cursor.classList.add('is-slider')
        $('all').addClass('cursnone');
        // cursor.style.opacity = 0
    })  
}
Ответить с цитированием
  #2 (permalink)  
Старый 26.12.2022, 17:22
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,704

Надо ловить события scroll и пересчитывать координаты курсора
До ума доводить лень, но что то такое
<head>
<style>
body{ padding:400px 0 1000px;} 
body *{cursor:none!important}
 
.hover-block{
  width:100%; 
  height:400px;
  background-color:red; 
}
#cursor{position:absolute;}
#cursor.is-slider{
    z-index:100000;
    pointer-events:none;
    border-radius:50%;
    background:green;
    opacity:.75;
    width:30px;
    height:30px;
    margin:-15px 0 0 -15px;
    background-repeat:no-repeat;
    background-size:100% 100%
}
</style>
</head>
<body>
<div class="hover-block"></div> 
<div id="cursor"></div>
<script>
function customCursor(e) {
    const cursor = document.querySelector('#cursor')
    const hoverblock = document.querySelector('.hover-block')
    let {top, bottom} = hoverblock.getBoundingClientRect()
    let x0, y0;
    let st0 = document.body.scrollTop;
    top += st0;
    bottom += st0;
    console.log('customCursor', top, bottom, st0);
 
    document.addEventListener('mousemove', e => {
        const target = e.target
        const diff = 2
        x0 = e.pageX;
        y0 = e.pageY;
		st0 = document.body.scrollTop;
		
        cursor.classList.remove('is-hide')
        // cursor.style.opacity = 1
 
        cursor.style.left = x0 + 'px'
        cursor.style.top = y0 + 'px'
        
        if (top<= y0 && y0 <= bottom) {
            cursor.classList.add('is-slider')
            document.body.classList.add('cursnone');
        }
        else {
            document.body.classList.remove('cursnone');
            cursor.classList.remove('is-slider')
        }
    })
    
    document.addEventListener('scroll', e => {
		const st = document.body.scrollTop;
		d = st - st0;
		y0 += d;
		st0 = st;
        cursor.style.left = x0 + 'px'
        cursor.style.top = y0 + 'px'        
        if (top<= y0 && y0 <= bottom) {
            cursor.classList.add('is-slider')
            document.body.classList.add('cursnone');
        }
        else {
            document.body.classList.remove('cursnone');
            cursor.classList.remove('is-slider')
        }
		
    }) 
}
customCursor()
</script>
</body>
Ответить с цитированием
  #3 (permalink)  
Старый 26.12.2022, 20:12
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,069

изменение курсора над блоком
sega1821,
как вариант ... на всякий случай, перед прокруткой, кликнуть по странице(макету).
(вопрос знатокам: куда курсор пропадает при прокрутке? )
<!DOCTYPE html>
<html>

<head>
    <style>
        body {
            padding: 400px 0 1000px;
            position: relative;
        }

        body * {
           cursor: none !important;
        }

        .hover-block {
            width: 100%;
            height: 400px;
            background-color: red;
        }

        #cursor {
            position: absolute;
        }

        #cursor.is-slider {
            z-index: 100000;
            pointer-events: none;
            border-radius: 50%;
            background: green;
            opacity: .75;
            width: 30px;
            height: 30px;
            margin: -15px 0 0 -15px;
            background-repeat: no-repeat;
            background-size: 100% 100%
        }
    </style>
</head>

<body>
    <div class="hover-block"></div>
    <div id="cursor"></div>
    <script>
        function customCursor(e) {
            const cursor = document.querySelector('#cursor');
            const body = document.body;
            let xMousePos = 0;
            let yMousePos = 0;
            let scrollTop = 0;
            let scrollLeft = 0;
            const toggle = e => {

                if (e.type === 'scroll') {

                    scrollLeft -= window.pageXOffset;
                    xMousePos -= scrollLeft;
                    scrollLeft = window.pageXOffset;

                    scrollTop -= window.pageYOffset;
                    yMousePos -= scrollTop;
                    scrollTop = window.pageYOffset;
                } else {
                    xMousePos = e.pageX;
                    yMousePos = e.pageY;
                };
                let clientX = xMousePos - scrollLeft , clientY = yMousePos - scrollTop;
                let elem = document.elementFromPoint(clientX, clientY)?.closest('.hover-block');
                cursor.classList.toggle('is-slider', elem);
                body.classList.toggle('cursnone', !elem);
                cursor.style.left = (xMousePos - 5) + 'px'
                cursor.style.top = (yMousePos - 5) + 'px'
            }

            document.addEventListener('mousemove', toggle)

            document.addEventListener('scroll', toggle)
        }
        customCursor()
    </script>
</body>

</html>

Последний раз редактировалось рони, 26.12.2022 в 20:16.
Ответить с цитированием
  #4 (permalink)  
Старый 26.12.2022, 20:50
Интересующийся
Отправить личное сообщение для sega1821 Посмотреть профиль Найти все сообщения от sega1821
 
Регистрация: 30.10.2020
Сообщений: 29

Спасибо большое, ваш вариант работает, однако при загрузке страницы если двигать курсором, то сразу добавляются и удаляются классы к курсору и body, до тех пор пока я не сделаю скролл колесом. После чего всё работает нормально, не считая того, что у body остаётся класс cursnone. Тут на сайте всё хорошо, буду думать
Ответить с цитированием
  #5 (permalink)  
Старый 26.12.2022, 20:50
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,069

или так )))
<!DOCTYPE html>
<html>
<head>
    <style>
        body {
            padding: 400px 0 1000px;
            position: relative;
        }
        body * {
            cursor: none !important;
        }
        .hover-block {
            width: 100%;
            height: 400px;
            background-color: red;
        }
        #cursor {
            position: absolute;
        }
        #cursor.fixed {
            position: fixed;
        }
        #cursor.is-slider {
            z-index: 100000;
            pointer-events: none;
            border-radius: 50%;
            background: green;
            opacity: .75;
            width: 30px;
            height: 30px;
            margin: -15px 0 0 -15px;
            background-repeat: no-repeat;
            background-size: 100% 100%
        }
    </style>
</head>
<body>
    <div class="hover-block"></div>
    <div id="cursor"></div>
    <script>
        function customCursor(e) {
            const cursor = document.querySelector('#cursor');
            const body = document.body;
            let xMousePos = 0;
            let yMousePos = 0;
            const toggle = e => {
                if (e.type === 'scroll') {
                    cursor.style.left = (xMousePos - 5) + 'px';
                    cursor.style.top = (yMousePos - 5) + 'px';
                    cursor.classList.add('fixed');
                }
                if (e.type === 'mousemove') {
                    cursor.classList.remove('fixed');
                    cursor.style.left = (e.pageX - 5) + 'px';
                    cursor.style.top = (e.pageY - 5) + 'px';
                    xMousePos = e.clientX;
                    yMousePos = e.clientY;
                };
                let elem = document.elementFromPoint(xMousePos, yMousePos)?.closest('.hover-block');
                cursor.classList.toggle('is-slider', elem);
                body.classList.toggle('cursnone', !elem);
            }
            document.addEventListener('mousemove', toggle)
            document.addEventListener('scroll', toggle)
        }
        customCursor()
    </script>
</body>
</html>
Ответить с цитированием
  #6 (permalink)  
Старый 27.12.2022, 00:16
Интересующийся
Отправить личное сообщение для sega1821 Посмотреть профиль Найти все сообщения от sega1821
 
Регистрация: 30.10.2020
Сообщений: 29

Спасибо)
Ответить с цитированием
  #7 (permalink)  
Старый 27.12.2022, 01:52
Интересующийся
Отправить личное сообщение для sega1821 Посмотреть профиль Найти все сообщения от sega1821
 
Регистрация: 30.10.2020
Сообщений: 29

Заметил, что в вашем примере класс добавляется при наведении на стандартный скролл. Как я понял это происходит из за clientX. Можно ли чем то его заменить?
Ответить с цитированием
  #8 (permalink)  
Старый 27.12.2022, 01:58
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,069

sega1821,
не понимаю.
Ответить с цитированием
  #9 (permalink)  
Старый 27.12.2022, 02:11
Интересующийся
Отправить личное сообщение для sega1821 Посмотреть профиль Найти все сообщения от sega1821
 
Регистрация: 30.10.2020
Сообщений: 29

Справа есть сайтбар. Если на него навестись, то появляется курсор, такой же как в красном блоке.

Сообщение от рони Посмотреть сообщение
или так )))
<!DOCTYPE html>
<html>
<head>
    <style>
        body {
            padding: 400px 0 1000px;
            position: relative;
        }
        body * {
            cursor: none !important;
        }
        .hover-block {
            width: 100%;
            height: 400px;
            background-color: red;
        }
        #cursor {
            position: absolute;
        }
        #cursor.fixed {
            position: fixed;
        }
        #cursor.is-slider {
            z-index: 100000;
            pointer-events: none;
            border-radius: 50%;
            background: green;
            opacity: .75;
            width: 30px;
            height: 30px;
            margin: -15px 0 0 -15px;
            background-repeat: no-repeat;
            background-size: 100% 100%
        }
    </style>
</head>
<body>
    <div class="hover-block"></div>
    <div id="cursor"></div>
    <script>
        function customCursor(e) {
            const cursor = document.querySelector('#cursor');
            const body = document.body;
            let xMousePos = 0;
            let yMousePos = 0;
            const toggle = e => {
                if (e.type === 'scroll') {
                    cursor.style.left = (xMousePos - 5) + 'px';
                    cursor.style.top = (yMousePos - 5) + 'px';
                    cursor.classList.add('fixed');
                }
                if (e.type === 'mousemove') {
                    cursor.classList.remove('fixed');
                    cursor.style.left = (e.pageX - 5) + 'px';
                    cursor.style.top = (e.pageY - 5) + 'px';
                    xMousePos = e.clientX;
                    yMousePos = e.clientY;
                };
                let elem = document.elementFromPoint(xMousePos, yMousePos)?.closest('.hover-block');
                cursor.classList.toggle('is-slider', elem);
                body.classList.toggle('cursnone', !elem);
            }
            document.addEventListener('mousemove', toggle)
            document.addEventListener('scroll', toggle)
        }
        customCursor()
    </script>
</body>
</html>
Ответить с цитированием
  #10 (permalink)  
Старый 27.12.2022, 02:54
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,069

sega1821,
а так?
<!DOCTYPE html>
<html>
<head>
    <style>
        body {
            padding: 400px 0 1000px;
            position: relative;
        }
        body * {
            cursor: none !important;
        }
        .hover-block {
            width: 100%;
            height: 400px;
            background-color: red;
        }
        #cursor {
            position: absolute;
        }
        #cursor.fixed {
            position: fixed;
        }
        #cursor.is-slider {
            z-index: 100000;
            pointer-events: none;
            border-radius: 50%;
            background: green;
            opacity: .75;
            width: 30px;
            height: 30px;
            margin: -15px 0 0 -15px;
            background-repeat: no-repeat;
            background-size: 100% 100%
        }
    </style>
</head>
<body>
    <div class="hover-block"></div>
    <div id="cursor"></div>
    <script>
        function customCursor(e) {
            const cursor = document.querySelector('#cursor');
            const body = document.body;
            let xMousePos = 0;
            let yMousePos = 0;
            const toggle = e => {
                if (e.type === 'scroll') {
                    cursor.style.left = (xMousePos - 5) + 'px';
                    cursor.style.top = (yMousePos - 5) + 'px';
                    cursor.classList.add('fixed');
                }
                if (e.type === 'mousemove') {
                    cursor.classList.remove('fixed');
                    cursor.style.left = (e.pageX - 5) + 'px';
                    cursor.style.top = (e.pageY - 5) + 'px';
                    xMousePos = e.clientX;
                    yMousePos = e.clientY;
                };
                let elem = document.elementFromPoint(xMousePos, yMousePos);
                elem = elem && elem.closest('.hover-block');
                cursor.classList.toggle('is-slider', elem);
                body.classList.toggle('cursnone', !elem);
            }
            document.addEventListener('mousemove', toggle)
            document.addEventListener('scroll', toggle)
        }
        customCursor()
    </script>
</body>
</html>
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
scr заменить на data-src и добавить класс igorfelix89 Общие вопросы Javascript 2 26.07.2021 07:46
Как добавить класс при открытии страницы? ekad Элементы интерфейса 1 01.08.2019 17:39
Как правильно добавить класс при наведении mitrich38 Events/DOM/Window 9 19.09.2016 23:40
Как добавить и удалить класс при нажатии на div? Jeick9 Events/DOM/Window 23 10.03.2015 16:05
Нужно добавить блокировку ссылки на время выполнения скрипта aidka Events/DOM/Window 1 02.08.2009 20:11