Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JavaScript]Pobieranie danych z CSS
Forum PHP.pl > Forum > Przedszkole
Sueroski
Witam mam problem. Chciałbym zrobić powoli zanikające okienko, więc wykombinowałem coś takiego:
  1. <style type="text/css">
  2. #tresc{
  3. position: absolute;
  4. width: 100px;
  5. height: 100px;
  6. margin-top: 120px;
  7. margin-left: 120px;
  8. opacity: 1;
  9. filter: alpha(opacity=100);
  10. }
  11. <script type="text/javascript">
  12. function display(){
  13. document.getElementById('tresc').style.opacity=document.getElementById('tresc').style.opacity-0.01;
  14. }
  15. <a onclick="document.getElementById('tresc').style.visibility='visible';setTimeout('display()',100)" href="#">a</a>
  16. <div id="tresc">a <a onclick="document.getElementById('tresc').style.visibility='hidden';" href="#">a</a></div>

Niestety po kliknięciu na przycisk okienko (ten div z "a" i zamykającym okno "x") całkowicie znika zamiast stopniowo robić się przeźroczyste. Podejrzewam, że po prostu nie może odczytać coś danych z css. Pytanie tu - jak to zrobić?
Wicepsik
Użyj frameworka jQuery.
piotrooo89
a dokładnie fadeIn() i/lub fadeOut().
Sueroski
Ok. Udało mi się coś wykombinować. Oto działający kod:
  1. <style type="text/css">
  2. #tresc{
  3. position: absolute;
  4. width: 100px;
  5. height: 100px;
  6. margin-top: 120px;
  7. margin-left: 120px;
  8. opacity: 1;
  9. filter: alpha(opacity=100);
  10. }
  11. <script type="text/javascript">
  12. a=1;
  13. function display(){
  14. document.getElementById('tresc').style.opacity=a-0.1;
  15. a=a-0.1;
  16. //alert(1)
  17. setTimeout('display()',100)
  18. }
  19. <a onclick="document.getElementById('tresc').style.visibility='visible';setTimeout('display()',100)" href="#">a</a>
  20. <div id="tresc">a <a onclick="document.getElementById('tresc').style.visibility='hidden';" href="#">a</a></div>
kamil4u
A jeśli jednak chcesz zrobić to w czystym JS, co jest bardzo proste to:
- nie setTimeout, a setInterval
- element.style pobiera style tylko z atrybutu style, więc po prostu przypisz przezroczystość w tym atrybucie
- jeżeli jednak nie możesz tego zrobić pobaw się z getComputedStyle - https://developer.mozilla.org/en/DOM:window.getComputedStyle
- użyj operatora -=
- referencję do elementu możesz zapisać do zmiennej globalnej, zamiast szukać elementu co sekundę w drzewie DOM

@up: popraw ten kod, stosując się do moich wskazówek, bo niestety zbyt ładnie on nie wygląda.
Sueroski
Aha dzięki. A możesz mi wytłumaczyć, że za pomocą tego kodu:
  1. <style type="text/css">
  2. #tresc{
  3. position: absolute;
  4. width: 100px;
  5. height: 100px;
  6. margin-top: 120px;
  7. margin-left: 120px;
  8. opacity: 1;
  9. filter: alpha(opacity=100);
  10. }
  11. <script type="text/javascript">
  12. a=1;
  13. function close(){
  14. document.getElementById('tresc').style.opacity=a-0.01;
  15. a=a-0.01;
  16. }
  17. function open(){
  18. document.getElementById('tresc').style.opacity=a+0.01;
  19. a=a+0.01;
  20. }
  21. <a onclick="document.getElementById('tresc').style.visibility='visible';setInterval('open()',100)" href="#">a</a>
  22. <div id="tresc">a <a onclick="document.getElementById('tresc').style.visibility='hidden';setTimeout('close()',100)" href="#">a</a></div>

Okienko zamyka się bez efektu zanikania? Po prostu normalnie? Gdzie jest błąd?
kamil4u
Błędów jest bardzo dużo(lepiej zrób to według moich wskazówek, bo inaczej będzie tylko ciężej):
- document.getElementById('tresc').style.visibility='hidden'; <-- już na wstępie chowasz tego div-a, więc nie może być mowy o żadnym efekcie
- nie setTimeout, a setInterval (już Ci to pisałem)
- zmienna a rośnie w nieskończoność, a może być jedynie w przedziale <0,1>
- podpowiedź: użyj tej funkcji: clearInterval

https://developer.mozilla.org/pl/DOM/window.setInterval
https://developer.mozilla.org/en/DOM/window.clearInterval
Sueroski
Ok. Dzięki za porady smile.gif
Jednak muszę was jeszcze troszkę pomęczyć haha.gif
Otóż warunek nie chce się spełnić. Postawiłem alert, żeby mi pokazywał wartość "a" i przy 3 wykonaniu odliczenia wychodzi "0.7000000000000001" i dalej ten błąd się cały czas ciągnie i warunek nie może się wykonać. JS kiepski z matmy, że nie potrafi poprawnie odliczać po 0.1? Proszę o pomoc (zaś haha.gif )
  1. <style type="text/css">
  2. #tresc{
  3. position: absolute;
  4. width: 100px;
  5. height: 100px;
  6. margin-top: 120px;
  7. margin-left: 120px;
  8. opacity: 1;
  9. filter: alpha(opacity=100);
  10. }
  11. <script type="text/javascript">
  12. a=1;
  13. function close(){
  14. document.getElementById('tresc').style.opacity=a-0.1;
  15. a=a-0.1;
  16. alert(a)
  17. if(a==0){
  18. clearInterval(intervalID)
  19. alert('close end')
  20. }
  21. }
  22. function open(){
  23. document.getElementById('tresc').style.opacity=a+0.1;
  24. a=a+0.1;
  25. if(a==1){
  26. clearInterval(intervalID)
  27. alert('open end')
  28. }
  29. }
  30. <a onclick="intervalID =setInterval('open()',10)" href="#">a</a>
  31. <div id="tresc">a <a onclick="intervalID=setInterval('close()',10)" href="#">a</a></div>
kamil4u
Nigdy nie dawaj alertów w nieskończonej pętli tongue.gif
Szczerze powiedziawszy nie wiem, dlaczego tak się dzieje, a nie chce mi się tego dokładnie analizować. Zamiast znaku równości(==)zastosuj znaki mniejsze równe i większe równe. I dla pewności w if-e przypisz od a dokładnie 1 lub 0.

Po co na siłę, chcesz korzystać z tej zmiennej a?
Kod
<style type="text/css">
#tresc{
    position: absolute;
    width: 100px;
    height: 100px;
    margin-top:  120px;
    margin-left: 120px;
    background-color: red;
}
</style>
<script type="text/javascript">
window.onload = function(){el = document.getElementById('tresc'); }
function close(){
    el.style.opacity-=0.1;
    if(el.style.opacity<=0){
        clearInterval(intervalID);
        alert('close end');
    }
}
function open(){
    el.style.opacity-=-0.1;

    if(el.style.opacity>=1){
        clearInterval(intervalID);
        alert('open end');
    }
}
</script>
<a onclick="intervalID=setInterval('open()',50);" href="#">a</a>
<div id="tresc" style="opacity: 1;">a <a onclick="intervalID=setInterval('close()',50);" href="#">a</a></div>
Nie wiem dlaczego, ale w funkcji open, nie specjalnie chce dzialac +=
Sueroski
Dzięki. Odświeżam, bo może ktoś wie czemu nie chce się dodawać? (wersja z odejmowaniem liczb ujemnych to też dobre wyjście, ale jestem ciekaw)
JS ma chyba jakąś inną logikę myślenia
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.