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

Animacje CSS dodawane poprzez JS

Object Storage Arubacloud
0 głosów
542 wizyt
pytanie zadane 28 listopada 2017 w JavaScript przez lapacz.kornel Mądrala (6,930 p.)

Piszę sobie bibliotekę, która ma być lżejszą, modularną wersją jQ (robię to bardziej dla własnej satysfakcji, nie sądzę, żeby ktoś chciał korzystać). Aktualnie tworzę funkcję hide(). Wydaje mi się, że nie ma co pisać wszystkiego w JS skoro jest CSS 3, napisałem więc taki kod:

function addCss(styles) {
  const css = document.createElement('style');
  css.type = 'text/css';
  css.textContent = styles;
  document.head.appendChild(css);
}

function cssSearch(name) {
  for(let i = 0; i < document.styleSheets.length; i++)
    if(document.styleSheets[i].cssRules) {
      for(let y = 0; y < document.styleSheets[i].cssRules.length; y++) {
      if(document.styleSheets[i].cssRules[y].name === name) {
        return true;
      }
    }
  }
}

function hide(time = 0) {
  if(!cssSearch('q-h')) {
    addCss('@keyframes q-h{0%{opacity:1}100%{opacity:0;transform:translateY(-100%);visibility:hidden}}');
  }

  this.each(el => el.style.animation = `${time}ms q-h forwards`);
  return this;
}

Teraz pytanie: czy to optymalne rozwiązanie?

1 odpowiedź

0 głosów
odpowiedź 29 listopada 2017 przez rafal.budzis Szeryf (85,260 p.)
wybrane 29 listopada 2017 przez lapacz.kornel
 
Najlepsza

można prościej ;) dodaj sobie ID 

const styles = {
    "q-h" : '@keyframes q-h{0%{opacity:1}100%{opacity:0;transform:translateY(-100%);visibility:hidden}}'
};

function addCss(stylesId) {
  const css = document.createElement('style');
  css.type = 'text/css';
  css.textContent = styles[stylesId];
  css.id = stylesId;
  document.head.appendChild(css);
}

function cssExist(stylesId) {
  return document.getElementById(stylesId) !== null;
}

Co do samego kodu ma wiele minusów. Pierwszy najprostszy do naprawy to nazewnictwo els i sel bardzo słabo wygląda ;) Napisz całe słowo. Drugi to brak prototypu z funkcjami on i each. Przez to twoja biblioteka będzie wolniejsza od jQuery. Ready nie zwraca this.

komentarz 29 listopada 2017 przez lapacz.kornel Mądrala (6,930 p.)
Na jakiej podstawie wnioskujesz że będzie wolniejsza? Po co ready ma zwracać this?
komentarz 29 listopada 2017 przez rafal.budzis Szeryf (85,260 p.)

W tej chwili podczas wywoływania $('jakiś selektor') za każdym razem tworzysz na nowo te dwie funkcje. Gdyby były one w prototypie stworzone były by tylko raz.

w jQuery zwraca i jest to wygodne :D 

https://api.jquery.com/ready/

komentarz 29 listopada 2017 przez lapacz.kornel Mądrala (6,930 p.)

Nigdy nie widziałem żeby ktoś cokolwiek dopisywał po ready(). Co do nazw wydaje mi się że dopuki sam tą bibliotekę rozwijam jest to sprawa indywidualna.

za każdym razem tworzysz na nowo te dwie funkcje. 

 I to znacząco obniża wydajność?

komentarz 29 listopada 2017 przez rafal.budzis Szeryf (85,260 p.)

Skoro jest to sprawa indywidualna to po co pytasz nas na forum i angażujesz inne osoby? Są to podstawy pisania czystego kodu ułatwia to potem znalezienie pomocy na forach. Staram się tobie pomóc ale widzę ze nie jesteś z tego powodu zadowolony. 

Co to tworzenia 2 funkcji to jest to jakiś problem. Np w tym kodzie zakładając ze mamy 10 znaczników <li> w pamięci tworzysz 22 funkcje co zabiera pamięć RAM.

$("ul li").each(() => {
  $(this).hide();
})

Nie są to duże różnice ale skoro zależało ci zrobić optymalną funkcje do CSSa to nie rozumiem dlaczego nie zależy ci na stworzeniu optymalniej funkcji na której opiera sie cała twoja biblioteka. 

komentarz 29 listopada 2017 przez lapacz.kornel Mądrala (6,930 p.)

Skoro jest to sprawa indywidualna to po co pytasz nas na forum i angażujesz inne osoby? Są to podstawy pisania czystego kodu ułatwia to potem znalezienie pomocy na forach. Staram się tobie pomóc ale widzę ze nie jesteś z tego powodu. 

 Ależ jestem zadowolony. To że dopytuje/kwestionuje niektóre kwestie nie znaczy że jestem  nie zadowolony tylko ciekawy. Zapisy „sel” i „els” (a także „el”) uważam za czytelne i nie raz widziałem je w kodach źródłowych. Pozatym inni na forum nie uznawali ich chyba za nieczytelne (przynajmniej nic o tym nie napisali)... Jeśli jednak uważasz że są naprawdę nieczytelne gdy tylko siądę do komputera zmienie je wink.

1
komentarz 29 listopada 2017 przez Comandeer Guru (600,810 p.)
Akurat wydajność jest najmniej ważnym powodem, dla którego trzon biblioteki powinien być klasą. O wiele ważniejszym powodem jest bardzo łatwa rozszerzalność. Jeśli będziemy eksportować klasę, to proces rozszerzania przez pluginy będzie się sprowadzał do importu klasy i dopisania nowej metody do prototypu → https://github.com/BEMQuery/bemquery-dom-events/blob/master/src/listeners.js
komentarz 29 listopada 2017 przez lapacz.kornel Mądrala (6,930 p.)
edycja 29 listopada 2017 przez lapacz.kornel

Przepisałem pod prototypy i zmieniłem nazwy zmiennych. Animacje planuję zrealizować w Web Animations API (Jeśli przeglądarka takowych nie będzie wspierać skrypt nada po prostu display none).

$("ul li").each(() => {
  $(this).hide();
})

Tak z ciekawości, co kryje się pod this ?(obstawiam window cheeky

Podobne pytania

0 głosów
2 odpowiedzi 424 wizyt
pytanie zadane 27 sierpnia 2018 w JavaScript przez bulit000 Początkujący (460 p.)
0 głosów
2 odpowiedzi 485 wizyt
0 głosów
4 odpowiedzi 512 wizyt
pytanie zadane 20 czerwca 2018 w JavaScript przez Paweł Kościelny Początkujący (360 p.)

92,551 zapytań

141,393 odpowiedzi

319,523 komentarzy

61,936 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!

...