od Podstaw
9 godz. 20 min · JavaScript · Full-stack i Programowanie
Piotr PalarzWeb DeveloperJavaScript to język programowania, który napędza niemal wszystkie strony internetowe. Dopełnia on technologie HTML i CSS, za pomocą których tworzymy strukturę i wygląd dokumentu. Co jednak w sytuacji, gdy chcemy po kliknięciu w wybrany przycisk wyświetlić powiększone zdjęcie lub wczytać dodatkowe dane z serwera? To właśnie w takich sytuacjach przydaje się język JavaScript i tzw. DOM API, dostępne w przeglądarce. Jak się przekonasz, możliwości nowoczesnych przeglądarek w połączeniu z tym językiem są naprawdę ogromne.
Język JavaScript może być używany nie tylko na stronach internetowych. Z tego powodu, w kursie omówimy najpierw najważniejsze konstrukcje tego języka, które są niezależne od platformy uruchomieniowej. Dzięki temu zbudujesz fundamenty niezbędne do tego, by wykorzystać ten język np. w środowisku Node.js. Krok po kroku omówimy sposoby tworzenia zmiennych, dostępne typy danych i operatory. Następnie zobaczysz jak tworzyć tablice i obiekty, z jakich instrukcji warunkowych i pętli możesz korzystać, a także jak tworzyć własne funkcje. Przekazywana wiedza uwzględniać będzie nowości, które pojawiły się w języku wraz z rewolucyjnym standardem EcmaScript 6 (ES6).
Sam język JavaScript to nie wszystko, by tchnąć ducha w strony internetowe. Z tego powodu, przeglądarki internetowe udostępniają tzw. DOM API. To interfejs, który z użyciem języka JavaScript pozwala na manipulację treścią i wyglądem strony. W kursie bardzo dokładnie omówimy czym jest Obiektowy Model Dokumentu, a także jak z nim pracować. Zobaczysz jak tworzyć nowe elementy HTML i wstawiać je na stronę, jak modyfikować ich treść, atrybuty, style czy klasy CSS. Poznasz sposoby na odczytywanie położenia elementu na stronie i jego wymiarów, które będą niezbędne w wielu sytuacjach. Dowiesz się także, jak przypisywać obsługę zdarzeń w przeglądarce, by np. wywołać własną funkcję, gdy ktoś kliknie w wybrany przez Ciebie przycisk.
JSON to popularny format wymiany danych, a Ajax to potoczna nazwa dla asynchronicznych zapytań HTTP, które wysyłać możemy z poziomu kodu JavaScript. Dziś niemal każda strona internetowa wykorzystuje te technologie. W niektórych przypadkach jako dopełnienie podstawowej funkcjonalności witryny, a w innych jako główny motor napędzający stronę. Jeśli kiedykolwiek widziałeś, jak na stronie internetowej jakaś treść "doczytuje" się np. podczas przewijania - widziałeś w praktyce Ajax. W jednym z rozdziałów kursu zobaczysz, jak pracować z tym formatem, a także jak wysyłać wspomniane zapytania do serwera.
Choć kurs który masz przed sobą, jest kursem dla początkujących, to aby zrozumieć jak działa język JavaScript i jak z nim się współcześnie pracuje, omówimy dwa ważne tematy - zarządzanie zależnościami i bundlowanie kodu. Dowiesz się czym jest npm i jak z jego pomocą pobierać paczki gotowego kodu z internetu, a także jak sprawić, by bez trudnu dołączać je do własnego kodu. W tym celu skorzystamy z narzędzia snowpack, które pozwoli nam także na optymalizację kodu przed jego wypuszczeniem w świat. Na tym etapie omówimy również jak działają moduły ESM, pozwalające dzielić kod na mniejsze części.
Kurs podzielony został na możliwie krótkie lekcje, do których w każdej chwili możesz wrócić. Jeśli zatem zapomnisz jak odczytywać wymiary elementu na stronie, szybko odnajdziesz odpowiednią lekcję. Czym jednak była by sama teoria i proste przykłady, bez pokazania, jak połączyć je w całość i wykorzystać w praktyce? Dobra wiadomość jest taka, że w kursie stworzymy aż 5 praktycznych projektów, wykorzystujących zdobytą wcześniej wiedzę. Najpierw napiszemy program losujący Dużego Lotka, następnie dynamiczny pasek postępu przeczytania artykułu, dymek pojawiający się nad elementem po najechaniu na niego myszą, wygenerujemy tabelkę w użytkownikami na podstawie danych JSON, a na koniec tworzymy prosty odtwarzacz wideo, z możliwością pauzowania i przewijania filmu.
Kurs ten jest dla wszystkich osób, które znają już podstawy HTML i CSS i chciałyby przejść poziom wyżej i dodać do swoich stron dynamiczności. Żadna wcześniejsza wiedza z zakresu JavaScript nie jest wymagana, ale zalecana jest podstawowa wiedza z zakresu samego programowania (czym są zmienne, pętle, funkcje itd.). Materiał ten będzie również świetnym odświeżeniem i usystematyzowaniem wiedzy dla osób, które już z tym językiem miały do czynienia. Po przerobieniu tego kursu będziesz gotowy, by poznawać język JavaScript dalej i zacząć korzystać z nowoczesnych frameworków.
Teraz zajmiemy się odczytywaniem wymiarów elementu, czyli szerokość i wysokość.
I na początek zajmiemy się tym elementem tutaj
wewnątrz. Jest to przykład bardzo podobny
jak w akcji poprzedniej, więc pobrałem sobie ten box do stałej i
będę chciał odczytać sobie na początek jego szerokość i wysokość
jedną z metod. Tych metod jest kilka
i będę chciał omówić czym one się od siebie różnią.
Więc taką podstawową metodą, z której
zazwyczaj możesz korzystać jest offsetWidth.
W zasadzie to nawet nie jest metoda.
Jest to właściwość, którą można odczytać i zostanie nam zwrócona wartość o typie number,
więc możemy spokojnie w JavaScript wtedy wykonywać różne obliczenia czy dodawać te
wartości i będzie to wartość wyrażona w pikselach.
Więc zobaczmy.
Wychodzi na to, że ten element ma 200px,
więc jeżeli chodzi o jego wysokość będzie to offsetHeight,
zobaczmy, jest to również 200 pikseli i
zgadza się to z tym, co jest tutaj przypisane
oczywiście w CSS. Mamy również takie właściwości jak clientWidth
i clientHeight i w przypadku tego boxa one zwrócą identyczne wartości.
Dlatego spróbujmy je wykonać na tym wrapperze, który mamy tutaj wyżej.
Czyli zrobimy sobie wrapper.offsetHeight
najpierw albo offsetWidth i w zasadzie z Height będzie tak samo.
Zobaczmy jakie nam zwróci wartości, zobacz,
jest to 600 na 600 i to jest właśnie ten większy element, ale on ma border 2px
tutaj i tutaj też ma 2 px, więc zobaczmy co się stanie w momencie, kiedy
chciałbym skorzystać ze wspomnianych wcześniej clientWidth
i zróbmy sobie
clientHeight. Bo wspomniałem, że w przypadku
tego boxa to byłyby identyczne wartości, a w przypadku tego wrappera nie
I pytanie dlaczego?
Zobacz jest to 596 na 596.
I teraz chodzi o to, że offsetWidth,
i offsetHeight zwracają szerokość i wysokość, która uwzględnia padding.
Czyli jeśli ten element ma jakiś padding,
uwzględnia także border, a także scrollbar, który mógłby być tutaj w środku.
Natomiast w przypadku clientWidth
i clientHeight nie jest uwzględniany border i nie są uwzględniane scrollbary.
W obu tych metodach, czyli i w offsetWidth i clientWidth, a także Height
nie jest również uwzględniany margines,
czyli gdyby ten element miał jeszcze jakiś
margines z tej strony, to nie jest brane do jego szerokości.
A więc tutaj jest taka subtelna różnica,
acz myślę, że istotna i w większości przypadków będziemy chcieli sobie pobrać jednak
całą szerokość danego elementu, a nie wykluczać z niej np.
marginesów.
Dlatego zazwyczaj będziemy korzystać z metody offsetWidth i offsetHeight.
Natomiast metoda clientHeight jak widzisz
również działa, ale ona nam wyklucza border.
Być może w poprzedniej lekcji zauważyłeś,
że kiedy skorzystaliśmy z getBoundingClientRect to tam również były
informacje odnośnie szerokości i wysokości elementu.
Więc spróbujmy sobie to teraz odczytać.
Odwołamy się do
box.getBoundingClientRect, to jest metoda,
która zwraca obiekt, więc jak jest zwrócony to możemy na nim po kropce
odwołać się do jego właściwości. I zobaczmy sobie width oraz zróbmy to samo dla height.
I to będzie dla tego boxa dla tego, który jest w środku.
Zobacz zwróciło 200 na 200.
Czyli można byłoby pomyśleć, że to znowu
zwraca nam identyczne wartości jak offsetWidth i offsetHeight.
Jednak jest tutaj jedna subtelna różnica, o której również warto wiedzieć, więc
polecam Ci, żebyś sobie być może to zanotował.
Chodzi o to, że jeżeli mamy taki element i zaaplikujemy do niego jakieś CSS -owe
transformacje, czyli mamy tego boxa i jeśli teraz bym powiedział transform np.
scale czyli chcę go powiększyć o 1,5
zauważ, że on się powiększył i teraz jeżeli bym sobie go tutaj
zaznaczył w konsoli do niego będziemy mieli odwołanie pod dolar 0
i odczytamy sobie jego offsetWidth, zobacz nadal pokazuje, że jest to 200.
Podobnie będzie z offsetHeight.
Natomiast jeżeli odczytamy jego getBoundingClientRect width,
to zwróci nam już 300 i podobnie będzie z height. Czyli innymi słowy metoda
getBoundingClientRect zwraca nam zawsze faktyczne wymiary tego elementu,
jakie są widoczne na ekranie. I czasami jest to właśnie pożądany przez
nas efekt. Bo zazwyczaj nie wiemy też, czy zostały do elementu zaaplikowane jakieś
transformacje czy nie, bo dzieje się to z użyciem CSS.
A zatem można powiedzieć, że najbezpieczniej będzie odczytywać wymiary
elementu z użyciem getBoundingClientRect i wtedy width i height.
Następną rzeczą, którą chcę Ci pokazać, ja tutaj odświeżę, żeby to przestało działać,
jest coś takiego jak scrollWidth i scrollHeight.
Tutaj nie mamy żadnego scrolla, ale
gdybyśmy zrobili tak, że ten element box byłby jakoś bardzo wysoki i np.
miałby 2000 pikseli, a do tego elementu wrapper dostalibyśmy overflow
scroll, to wtedy będziemy mogli wewnątrz scrollować.
Bo ten element jest zbyt duży, więc tak naprawdę rozciąga nam tego wrappera.
I teraz jeżeli na tym wrapperze byśmy się
odwołali i zrobimy sobie to również w konsoli, to jego dolar zero
scrollWidth, pokaże nam to 596, czyli zwraca taką samą wartość jak clientWidth,
ale jeżeli się odwołamy do scrollHeight, bo tutaj zauważ nie mamy poziomego suwaka,
ale też mógłby być, to scrollHeight pokaże nam 2030 pikseli.
Czyli jeżeli chciałbyś sobie odczytać jakby
całą wielkość tego elementu nie taką jak jest widoczna na ekranie, ale jaka jest
fizycznie, bo on jest przewijamy, czyli można powiedzieć, że jest znacznie
dłuższy ten element, to możesz to zrobić z użyciem scrollHeight.
Ja dodam teraz tutaj te dwie metody
żebyś
również mógł sobie to w plikach źródłowych podejrzeć.
I są sytuacje, kiedy to również będzie bardzo przydatne np.
kiedy będziemy chcieli sprawdzić czy jakiś element posiada scrollbar. Nie ma do tego
innej metody, ale jeżeli sobie sprawdzimy czy jego scrollHeight jest większe od
jego clientHeight, no to oznacza, że ten element ma jakiś scrollbar. I na tej
podstawie czasami chcemy zaaplikować trochę inne style itd.
I ostatnia rzecz, którą chciałbym Ci pokazać dotyczy stricte obiektu window.
Jeżeli chcielibyśmy sprawdzić jakich
wymiarów jest nasze okno, czyli tak naprawdę viewport,
nawet nie cały dokument, bo większość stron internetowych jest scrollowalna w dół
możemy dużo przeskalować, to cały ten dokument będzie wysoki,
ale samo window to będzie dokładnie to, co
tutaj widzimy teraz na ekranie, czyli ten viewport, to
mamy do tego dwie właściwości na obiekcie
window i jest to window.innerWidth to będzie szerokość i innerHeight.
Czyli one są dostępne tylko na tym
obiekcie window wyglądają troszeczkę inaczej bo
mamy inneWidth, innerHeight, zobaczmy,
zwróci nam to 1072 i 1001
jeżeli chodzi o wysokość. To może być z kolei przydatne, jeżeli
chciałbyś warunkowo coś zrobić na stronie, np.
sprawdzić sobie, czy jeżeli strona jest
mniejsza niż powiedzmy 1000 pikseli to chcesz coś zrobić inaczej.
Oczywiście jeśli chodzi o kwestie czysto stylowe, to możemy to zrobić z użyciem
media queries w CSS, ale często również w języku JavaScript
potrzebujemy znać te wymiary, aby podjąć na tej podstawie jakąś decyzję.
Podsumowując, zazwyczaj będziesz mógł
odczytywać szerokość i wysokość za pomocą offsetWidth, ale bezpieczniej jest to
robić za pomocą getBoundingClientRect na wypadek gdyby elementy były w jakiś sposób
przetransformowane i fizycznie na stronie były większe.
Natomiast rzadziej będziesz prawdopodobnie
korzystał z clientWidth i clientHeight, bo tutaj są odejmowane bordery
i czasami możesz również korzystać ze scrollWidth i scrollHeight, kiedy chcesz poznać
prawdziwe wymiary elementu, czyli ile tej treści w nim się znajduje.