Определение расстояние от края браузера и элемента
Я помню что уже делал такой скрипт но не могу найти, пробую по памяти сделать все не работает.
Смысл в том что бы при достижение элемента определенного расстояние до края браузера сверху, ну что бы поменялся стиль. Вроде написал все правильно но не работает и даже нету ошибки.
<!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>
|
Вспомнил еще вот тко вариант и тоже не сработало
<!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>
|
Код не глядел, мож потом, но сходу могу сказать, что сейчас такие задачи решаются через Intersection Observer.)
|
Цитата:
pos что это? строка 48 код 2 |
Сергей Ракипов,
<!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>
|
рони,
Спасибо завтра сяду разбираться. Aetae, А этот способ чем лучше? |
рони,
Видимо к вечеру вчера устал и наделал кучу ошибок. Сейчас все понятно. Вопрос а если мне нужно учитывать ширину браузера и в зависимости от ширины браузера делать другие значение от высоты экрана, к примеру top не 100 а 300 если ширина экрана 320 То мне нужно использовать window.innerwidth, но мне нужно это прямо в той функции писать или отдельно? |
Aetae,
Я прочитал о преимуществах, а есть какой то рабочий пример что бы так сказать разбираться методом тыка, мне сложно в тексте все понимать мне нужно менять пробовать тогда я лучше понимаю |
Я все правильно сделал или можно лучше или что то не учел?
Должно работать что если ширина такая то то значение высоты такое то.
<!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>
|
Сергей Ракипов,
изменяемый параметр лучше проверять перед условием! строку 51 перенесите в начало функции. |
Цитата:
с переносом строки все понятно
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();
|
Сергей Ракипов,
windowInnerWidth --- ширину экрана можно изменить, поэтому использовать значение измеренное один раз, может дать неверный результат, лучше использовать текущее значение, а не то, которое было при загрузке страницы. |
Цитата:
|
Цитата:
в anim1 надо измерять и да назначить эту функцию на события, и resize и scroll |
Цитата:
Ну то есть в anim1 нужно повесить два события, а разве так можно что на одну функцию вещать два события resize и scroll |
Цитата:
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(); //запуск при формировании страницы(загрузка)
|
рони,
Ну я так и подумал. Просто засомневался когда про два событие и в моей голове начало рисовать что то не вообразимое из серии вот так
window.addEventListener("scroll", "resize", anim1);
А так спасибо. И тут больше вопрос из любопытство, а когда вот это "resize" вешаешь это не сильно загружает страницу браузера? |
А интересно вместо пикселей можно сделать проценты?
|
Цитата:
Цитата:
|
Цитата:
|
Цитата:
Как бы то не было, как всегда СПАСИБО! |
Цитата:
https://javascript.ru/forum/dom-wind...tml#post533705 https://javascript.ru/forum/dom-wind...tml#post534123 |
рони,
Спасибо это то что нужно, я еще видео уроки нашел Спасибо |
Я посмотрел почитал.
И из всего этого я могу сделать тоже самое но только идентичный код. Я пробую его подстроить по свои нужды и у меня не выходит я не понимаю последовательность того что и должно быть написано. Да я читаю и вроде все понятно но когда сам пробую не понимаю как правильно все сделать. Я понимаю что нужно записать вот эти переменные
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, время: 05:15. |