• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

wysokość diva zależna od scrolla

Object Storage Arubacloud
0 głosów
115 wizyt
pytanie zadane 25 grudnia 2022 w JavaScript przez jasper93 Obywatel (1,310 p.)

Witam, próbuje zrobić program, który zmieniałby wysokość diva podczas scrollowania strony, mam mały problem utworzyłem zmienna globalna gdzie wartość będzie powiększana z każdym scrollem. Niestety efekt jest taki, że zmienna "vh" cały czas ma wartość 0. Może mi ktoś wytłumaczyć, gdzie jest błąd?

  <script>
      document.body.style.height = 10000 + "px";
      const divEl = document.createElement("div");
      document.body.appendChild(divEl);
      let vh = 0;
      divEl.style.cssText =
        "width:100%;position:fixed;top:0;left:0;background-color:green;height: " +
        vh +
        "px";
      function changeHeight() {
        vh += 1500;
        if (window.innerHeight / 2 <= vh) {
          vh -= 1000;

          divEl.style.backgroundColor = "red";
        }
      }
      window.addEventListener("scroll", changeHeight);
    </script>

 

komentarz 25 grudnia 2022 przez VBService Ekspert (253,340 p.)

Może spróbuj użyć w obliczeniach window.pageYOffset wink

 [ on-line ]

div {
  --height: 0;
  height: calc(var(--height) * 1px);
  
  ...
}
...

function changeHeight() {
  ...
  divEl.style.setProperty('--height', window.pageYOffset);
}

window.addEventListener("scroll", changeHeight);

 

1 odpowiedź

+1 głos
odpowiedź 25 grudnia 2022 przez ScriptyChris Mędrzec (190,190 p.)
wybrane 25 grudnia 2022 przez jasper93
 
Najlepsza

To, że zmieniasz wartość zmiennej vh to jedno, ale powinieneś też aktualizować styl height za każdym razem, bo on się sam nie zmieni (przynajmniej nie w Twoim kodzie). Zatem:

divEl.style.backgroundColor = "red";
divEl.style.height = `${vh}px`;
komentarz 25 grudnia 2022 przez jasper93 Obywatel (1,310 p.)
Dziękuje za wyjaśnienie, czyli nie ma innej opcji poza przypisywaniem zmiennej vh do wysokości?;)
komentarz 25 grudnia 2022 przez ScriptyChris Mędrzec (190,190 p.)

Możesz skorzystać ze zmiennej CSS, wtedy będziesz aktualizować tylko samą wartość, już bez konkatenacji z jednostką.

komentarz 25 grudnia 2022 przez VBService Ekspert (253,340 p.)

@ScriptyChris, 

aktualizować tylko samą wartość, już bez konkatenacji z jednostką.

jestem ciekaw jak to zaimplementować w js np. na tym przykładowym kodzie

div {
  --height: 0vh;
  height: var(--height);
  width: 100%;
  position: fixed;
  top: 0;
  left: 0;
  background-color:green;  
}
document.body.style.height = 10000 + "px";
const divEl = document.createElement("div");
document.body.appendChild(divEl);
let vh = 0;

function changeHeight() {
  divEl.style.backgroundColor = "red";
  // divEl.style.setProperty('--height', (++vh) + 'vh');
  divEl.style.setProperty('--height', ++vh);
  //console.log(vh);
}
window.addEventListener("scroll", changeHeight);

 

komentarz 25 grudnia 2022 przez ScriptyChris Mędrzec (190,190 p.)

Na oko, sama zmienna --height powinna mieć tylko wartość (którą JS modyfikuje), a już jej przypisanie do property height powinno dopisywać jednostkę (poprzez mnożenie w calc), czyli:

  --height: 0;
  height: calc(var(--height) * 1vh);

 

komentarz 25 grudnia 2022 przez VBService Ekspert (253,340 p.)

Czyli jednak jest w pewnym sensie wykonywana konkatenacji z jednostką, ale na poziomie css-a, poprzez użycie calc.

1
komentarz 25 grudnia 2022 przez ScriptyChris Mędrzec (190,190 p.)

Tak, AFAIK powinno dać się niejako zamaskować konkatenację przy użyciu @property w CSS, ale gdzieś musi być ten moment, że sama wartość otrzymuje jednostkę.

komentarz 26 grudnia 2022 przez jasper93 Obywatel (1,310 p.)

Jeszcze chciałem zapytać o jedną rzecz, generalnie nie działa mi warunek else if(divEl.style.height == 0) w poniższym kodzie, wiecie może dlaczego? Jeśli zrobię else if(vh == 0) wtedy wszystko jest ok.

<script>
      document.body.style.height = 10000 + "px";
      const divEl = document.createElement("div");
      document.body.appendChild(divEl);
      let vh = 0;
      let check = true;
      divEl.style.cssText =
        "width:100%;position:fixed;top:0;left:0;background-color:green;height: " +
        vh +
        "px";
      function changeHeight() {
        if (check) {
          vh += 10;
          divEl.style.height = `${vh}px`;
        } else {
          vh -= 10;
          divEl.style.height = `${vh}px`;
          divEl.style.backgroundColor = "red";
        }
        if (window.innerHeight / 2 <= vh) {
          check = false;
        } else if (vh == 0) {
          check = true;
        }
      }
      window.addEventListener("scroll", changeHeight);
    </script>

 

komentarz 26 grudnia 2022 przez VBService Ekspert (253,340 p.)
edycja 26 grudnia 2022 przez VBService

Zobacz co zwraca divEl.style.height

document.body.style.height = 10000 + "px";
const divEl = document.createElement("div");
document.body.appendChild(divEl);
let vh = 0;
let check = true;
divEl.style.cssText =
  "width:100%;position:fixed;top:0;left:0;background-color:green;height: " +
  vh +
  "px";
function changeHeight() {
  if (check) {
    vh += 10;
    divEl.style.height = `${vh}px`;
  } else {
    vh -= 10;
    divEl.style.height = `${vh}px`;
    divEl.style.backgroundColor = "red";
  }
  if (window.innerHeight / 2 <= vh) {
    check = false;
  } else if (vh == 0) {
    check = true;
  }
  
  console.clear();
  console.log('height: ' + divEl.style.height)
  console.log('vh: ' + vh);
}
window.addEventListener("scroll", changeHeight);

 

i zadaj sobie Sam pytanie jeszcze raz dlaczego nie działa wink

if (divEl.style.height == 0) ...

 

spróbuj np. z takim zapisem parseInt(divEl.style.height)

1
komentarz 26 grudnia 2022 przez jasper93 Obywatel (1,310 p.)
Fakt, zgapiłem się. Dziękuje jeszcze raz ;)

Podobne pytania

0 głosów
2 odpowiedzi 263 wizyt
pytanie zadane 13 września 2016 w HTML i CSS przez Maciek Gamrot Bywalec (2,830 p.)
0 głosów
0 odpowiedzi 138 wizyt
pytanie zadane 1 września 2017 w JavaScript przez paciek Początkujący (480 p.)
+1 głos
1 odpowiedź 267 wizyt

92,573 zapytań

141,423 odpowiedzi

319,645 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...