Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Определение расстояние от края браузера и элемента (https://javascript.ru/forum/dom-window/83074-opredelenie-rasstoyanie-ot-kraya-brauzera-i-ehlementa.html)

Сергей Ракипов 07.09.2021 13:34

Определение расстояние от края браузера и элемента
 
Я помню что уже делал такой скрипт но не могу найти, пробую по памяти сделать все не работает.

Смысл в том что бы при достижение элемента определенного расстояние до края браузера сверху, ну что бы поменялся стиль. Вроде написал все правильно но не работает и даже нету ошибки.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        header{
            height: 200px;
        
        }
        footer{
            height: 1000px;
        }
        .blok{
            width: 80px;
            height: 80px;
            background-color:#000;
            background-image: url(https://rakipov.ru/files/tsifra1.svg);
            background-repeat: no-repeat;
            background-position: center;
            background-size: 70%;
            border-radius: 7px;
        }
        .blok2{
            width: 80px;
            height: 80px;
            background-color:#000;
            background-image: url(https://rakipov.ru/files/icon1.svg);
            background-repeat: no-repeat;
            background-position: center;
            background-size: 70%;
            border-radius: 7px;
        }
    </style>
</head>
<body>
    <header></header>
    <section>
        <div class="blok"></div>
    </section>
    <footer></footer>
    <script>
        const blok = document.querySelector(".blok");

        let anim1 = () => {
            let ikonka1 = tsifra1.getBoundingClientRect();
            if (ikonka1.top >= 100) {
                blok.classList.add("blok2");
            }
        };
        window.addEventListener("scroll", anim1);
    </script>
</body>
</html>

Сергей Ракипов 07.09.2021 14:06

Вспомнил еще вот тко вариант и тоже не сработало

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        header{
            height: 500px;
        
        }
        footer{
            height: 1500px;
        }
        .blok{
            width: 80px;
            height: 80px;
            background-color:#000;
            background-image: url(https://rakipov.ru/files/tsifra1.svg);
            background-repeat: no-repeat;
            background-position: center;
            background-size: 70%;
            border-radius: 7px;
        }
        .blok2{
            width: 80px;
            height: 80px;
            background-color:#000;
            background-image: url(https://rakipov.ru/files/icon1.svg);
            background-repeat: no-repeat;
            background-position: center;
            background-size: 70%;
            border-radius: 7px;
        }
    </style>
</head>
<body>
    <header></header>
    <section>
        <div class="blok"></div>
    </section>
    <footer></footer>
    <script>
        const blok = document.querySelector(".blok");

        let anim1 = () => {
            if (pos >= 100) {
                blok.style.backgroundImage = "url('https://rakipov.ru/files/icon1.svg')";
            }
            console.log(blok.offsetTop);
        };
        window.addEventListener("scroll", anim1);
    </script>
</body>
</html>

Aetae 07.09.2021 14:13

Код не глядел, мож потом, но сходу могу сказать, что сейчас такие задачи решаются через Intersection Observer.)

рони 07.09.2021 15:05

Цитата:

Сообщение от Сергей Ракипов
не работает

tsifra1 что это? строка 48 код 1

pos что это? строка 48 код 2

рони 07.09.2021 15:07

Сергей Ракипов,
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        header{
            height: 200px;

        }
        footer{
            height: 1000px;
        }
        .blok{
            width: 80px;
            height: 80px;
            background-color:#D3D3D3;
            background-image: url(https://rakipov.ru/files/tsifra1.svg);
            background-repeat: no-repeat;
            background-position: center;
            background-size: 70%;
            border-radius: 7px;
        }
        .blok.blok2{
            width: 80px;
            height: 80px;
            background-color:#000;
            background-image: url(https://rakipov.ru/files/icon1.svg);
            background-repeat: no-repeat;
            background-position: center;
            background-size: 70%;
            border-radius: 7px;
        }
    </style>
</head>
<body>
    <header></header>
    <section>
        <div class="blok"></div>
    </section>
    <footer></footer>
    <script>
        const blok = document.querySelector(".blok");

        let anim1 = () => {
            let ikonka1 = blok.getBoundingClientRect();
            blok.classList.toggle("blok2", ikonka1.top >= 100);
        };
        window.addEventListener("scroll", anim1);
        anim1(); 
    </script>
</body>
</html>

Сергей Ракипов 07.09.2021 17:06

рони,
Спасибо завтра сяду разбираться.

Aetae,
А этот способ чем лучше?

Сергей Ракипов 08.09.2021 09:25

рони,
Видимо к вечеру вчера устал и наделал кучу ошибок. Сейчас все понятно.
Вопрос а если мне нужно учитывать ширину браузера и в зависимости от ширины браузера делать другие значение от высоты экрана, к примеру top не 100 а 300 если ширина экрана 320

То мне нужно использовать window.innerwidth, но мне нужно это прямо в той функции писать или отдельно?

Сергей Ракипов 08.09.2021 09:27

Aetae,
Я прочитал о преимуществах, а есть какой то рабочий пример что бы так сказать разбираться методом тыка, мне сложно в тексте все понимать мне нужно менять пробовать тогда я лучше понимаю

Сергей Ракипов 08.09.2021 10:03

Я все правильно сделал или можно лучше или что то не учел?
Должно работать что если ширина такая то то значение высоты такое то.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        header{
            height: 500px;

        }
        footer{
            height: 1000px;
        }
        .blok{
            width: 80px;
            height: 80px;
            background-color:#D3D3D3;
            background-image: url(https://rakipov.ru/files/tsifra1.svg);
            background-repeat: no-repeat;
            background-position: center;
            background-size: 70%;
            border-radius: 7px;
        }
        .blok.blok2{
            width: 80px;
            height: 80px;
            background-color:#000;
            background-image: url(https://rakipov.ru/files/icon1.svg);
            background-repeat: no-repeat;
            background-position: center;
            background-size: 70%;
            border-radius: 7px;
        }
    </style>
</head>
<body>
    <main>
        <header></header>
        <section>
            <article>
                <div class="blok"></div>
            </article>
        </section>
    </main>
    <footer></footer>

    <script>
        const blok = document.querySelector(".blok");
        const windowInnerWidth = document.documentElement.clientWidth;

        let anim1 = () => {
            if(windowInnerWidth >= 600){
            let ikonka1 = blok.getBoundingClientRect();
            blok.classList.toggle("blok2", ikonka1.top >= 100);
            }
            else if(windowInnerWidth >= 400){
            let ikonka1 = blok.getBoundingClientRect();
            blok.classList.toggle("blok2", ikonka1.top >= 200);
            }
            console.log(windowInnerWidth);
        };

        window.addEventListener("scroll", anim1);
        anim1(); 
    </script>
</body>
</html>

рони 08.09.2021 10:36

Сергей Ракипов,
изменяемый параметр лучше проверять перед условием! строку 51 перенесите в начало функции.

Сергей Ракипов 09.09.2021 07:01

Цитата:

Сообщение от рони (Сообщение 540091)
Сергей Ракипов,
изменяемый параметр лучше проверять перед условием!

Что то вот это не понял это как?

с переносом строки все понятно

const tsifra_1 = document.querySelector(".tsifra_1");

let anim1 = () => {
    const windowInnerWidth = document.documentElement.clientWidth
    if(windowInnerWidth >= 800){
    let ikonka1 = tsifra_1.getBoundingClientRect();
    tsifra_1.classList.toggle( "tsifra_1_1", ikonka1.top <= 500 );
    }
    else if(windowInnerWidth <= 800){
        let ikonka1 = tsifra_1.getBoundingClientRect();
        tsifra_1.classList.toggle( "tsifra_1_1", ikonka1.top <= 100 );
        }
    console.log(windowInnerWidth);
};
window.addEventListener( "scroll", anim1);
anim1();

рони 09.09.2021 07:15

Сергей Ракипов,
windowInnerWidth --- ширину экрана можно изменить, поэтому использовать значение измеренное один раз, может дать неверный результат, лучше использовать текущее значение, а не то, которое было при загрузке страницы.

Сергей Ракипов 09.09.2021 08:11

Цитата:

Сообщение от рони (Сообщение 540129)
Сергей Ракипов,
windowInnerWidth --- ширину экрана можно изменить, поэтому использовать значение измеренное один раз, может дать неверный результат, лучше использовать текущее значение, а не то, которое было при загрузке страницы.

А понял вот о чем речь то есть нужно отслеживать событие ресайз?

рони 09.09.2021 09:05

Цитата:

Сообщение от Сергей Ракипов
А понял вот о чем речь то есть нужно отслеживать событие ресайз?

???
в anim1 надо измерять и да назначить эту функцию на события, и resize и scroll

Сергей Ракипов 09.09.2021 09:16

Цитата:

Сообщение от рони (Сообщение 540135)
???
в anim1 надо измерять и да назначить эту функцию на события, и resize и scroll


Ну то есть в anim1 нужно повесить два события, а разве так можно что на одну функцию вещать два события resize и scroll

рони 09.09.2021 09:56

Цитата:

Сообщение от Сергей Ракипов
Ну то есть в anim1 нужно повесить два события,

...
const tsifra_1 = document.querySelector(".tsifra_1");

        let anim1 = () => {
            const windowInnerWidth = document.documentElement.clientWidth
            if (windowInnerWidth >= 800) {
                let ikonka1 = tsifra_1.getBoundingClientRect();
                tsifra_1.classList.toggle("tsifra_1_1", ikonka1.top <= 500);
            } else if (windowInnerWidth <= 800) {
                let ikonka1 = tsifra_1.getBoundingClientRect();
                tsifra_1.classList.toggle("tsifra_1_1", ikonka1.top <= 100);
            }
            console.log(windowInnerWidth);
        };
        window.addEventListener("scroll", anim1); //запуск во время прокрутки
        window.addEventListener("resize", anim1); //запуск при изменении размеров окна
        anim1(); //запуск при формировании страницы(загрузка)

Сергей Ракипов 09.09.2021 10:22

рони,
Ну я так и подумал.
Просто засомневался когда про два событие и в моей голове начало рисовать что то не вообразимое из серии вот так

window.addEventListener("scroll", "resize", anim1);


А так спасибо.
И тут больше вопрос из любопытство, а когда вот это "resize" вешаешь это не сильно загружает страницу браузера?

Сергей Ракипов 09.09.2021 10:45

А интересно вместо пикселей можно сделать проценты?

рони 09.09.2021 11:06

Цитата:

Сообщение от Сергей Ракипов
а когда вот это "resize" вешаешь это не сильно загружает страницу браузера?

раз в 100 меньше чем scroll
Цитата:

Сообщение от Сергей Ракипов
А интересно вместо пикселей можно сделать проценты?

можно если использовать IntersectionObserver параметр threshold

Сергей Ракипов 09.09.2021 11:18

Цитата:

Сообщение от рони (Сообщение 540152)
раз в 100 меньше чем scroll

Звучит очень логично.

Сергей Ракипов 09.09.2021 11:21

Цитата:

Сообщение от рони (Сообщение 540152)
можно если использовать IntersectionObserver параметр threshold

Я думал об этом но мне не хватает "живого" примера что бы разобраться. не поможете?

Как бы то не было, как всегда СПАСИБО!

рони 09.09.2021 11:34

Цитата:

Сообщение от Сергей Ракипов
не хватает "живого" примера

https://javascript.ru/forum/misc/828...tml#post538886

https://javascript.ru/forum/dom-wind...tml#post533705

https://javascript.ru/forum/dom-wind...tml#post534123

Сергей Ракипов 09.09.2021 12:47

рони,
Спасибо это то что нужно, я еще видео уроки нашел
Спасибо

Сергей Ракипов 09.09.2021 14:18

Я посмотрел почитал.
И из всего этого я могу сделать тоже самое но только идентичный код.
Я пробую его подстроить по свои нужды и у меня не выходит я не понимаю последовательность того что и должно быть написано. Да я читаю и вроде все понятно но когда сам пробую не понимаю как правильно все сделать.

Я понимаю что нужно записать вот эти переменные

const blok = document.querySelector(".blok");
        const windowInnerWidth = document.documentElement.clientWidth;
        const intersectionObserver = new IntersectionObserver;


Понимаю что вот это

let ikonka1 = blok.getBoundingClientRect();
blok.classList.toggle("blok2", ikonka1.top >= 100);


Заменить на это

let options = {  
            root: document.querySelector('.blok'),  
            rootMargin: '5px',  
            threshold: 0.5
        };


И как то нужно правильно записать

blok.classList.toggle("blok2",


Я прочитал и понял как это работает, но не могу все это реализовать.


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