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.
W tej lekcji pokażę Ci, w jaki sposób
możemy odczytywać współrzędne położenia elementu względem jego rodzica, tzw.
offset parent, ale także względem viewportu,
czyli wszystkiego, co widzimy na ekranie.
I w tym celu mamy dwa elementy.
Mamy taki wrapper, to jest ten z czarnym borderem i wewnątrz
taki box to jest ten taki pomarańczowy
element i będę chciał odczytać ile jego lewa krawędzi jest oddalona tutaj od lewej
strony, a także jego górna krawędź od góry.
I pokażę Ci na to dwa sposoby i wytłumaczę czym się różnią.
Natomiast do czego to może być przydatne? W bardzo wielu sytuacjach
to może być przydatne i w tym kursie stworzymy później praktyczny projekt tooltipa,
gdzie po najechaniu na jakiś element będziemy chcieli odczytać,
gdzie znajduje się jego lewa krawędź, jaka jest jego szerokość i nad nim ustawić
taki element tooltip. Więc to będzie naprawdę bardzo przydatne,
w tej lekcji natomiast omówimy sposoby na
to, jak te rzeczy odczytywać, a potem, kiedy będziemy tworzyć praktyczny projekt,
już będziemy wiedzieli jak z tego skorzystać.
Pobrałem sobie do stałej tutaj box,
to jest właśnie ten element, to jest ten
pomarańczowy, a to jest ten wrapper i będę chciał ci pokazać, jak odczytać jego lewą
krawędź, czyli ile ona jest położona względem body
w tym przypadku. Zrobimy sobie to w console.log
i na dowolnym elemencie, który sobie znalazłeś na stronie
możesz skorzystać z czegoś takiego jak
offsetLeft i to w pikselach zwróci Ci odpowiednią wartość.
Tutaj nam podświetla edytor, ale znowu to nie jest żaden błąd.
To wynika z tego TypeScript sprawdzenia, więc to możemy zignorować.
Jak widzimy jest to 258 pikseli, czyli odtąd tutaj jest 258.
Jeżeli będziemy chcieli odczytać górną krawędź offset top to będzie to 164.
No i właśnie teraz mógłbyś zapytać
względem czego. Wydaje się, że względem całego dokumentu,
bo jeżeli ja bym sobie tutaj spróbował
zmierzyć, to takim narzędziem rzeczywiście widać, że to będzie 164.
I tutaj na bok
mniej więcej widzimy 258.
Czyli to się zgadza, ale okazuje się, że te właściwości takie jak offsetTop i
offsetLeft zwracają nam położenie względem tzw.
offsetParent.
I teraz co to oznacza?
Kto jest tym offsetParent dla tego elementu?
Możemy to sprawdzić wyświetlając w konsoli offsetParent.
Zobaczmy.
Jest to body. Czyli względem body, teraz po najechaniu widzimy jak wygląda body,
to jest cały nasz dokument,
więc te wartości były podane względem body.
I teraz o co chodzi z offsetParent?
Bo to też ma znaczenie w przypadku CSS.
W momencie gdybyśmy do takiego elementu do
tego boxa przypisali np. position absolute i następnie byśmy zrobili top np.
50 pikseli, to jeżeli znasz CSS to wiesz, że on będzie pozycjonowany absolutnie 50px
od góry względem właśnie jego offsetParent.
Czyli w tym przypadku byłoby to body. Zobaczmy.
Ten element byłby przesunięty w to miejsce.
Natomiast jeżeli byśmy dla tego wrappera, który
jest tutaj nad nim, bo ten element jest w tym wrapperze,
jeżeli byśmy jemu przypisali np. position relative,
to teraz on staje się tym offsetParent dla tego elementu i te 50 pikseli
będzie od właśnie tego elementu, od jego górnej krawędzi.
Zobacz teraz to będzie wyglądać inaczej.
Czyli swoją drogą to też jest taki trick,
że możesz sobie sprawdzić względem jakiego elementu będzie
pozycjonowany inny element czyli jaki jest jego offsetParent.
No właśnie i teraz jeżeli temu daliśmy
position relative, to te wartości będą już względnie
właśnie tego wrappera. Zobaczysz, że one się zmieniły na 20 i 30.
Bo dokładnie gdybyśmy podejrzeli tutaj od góry będzie 30
a tutaj z boku
będzie 20.
Zapamiętaj zatem, że offsetLeft i offsetTop
zwracają wartości względem offsetParent, a samo to offsetParent
zwraca nam właśnie odwołanie do tego elementu.
Jak zwróciło body, to tutaj też pamiętaj,
podobnie jak było w przypadku parentNode
masz po prostu odwołanie do takiego elementu i na nim możesz wykonywać różne
akcje tak jakbyś go znalazł z użyciem querySelector.
Więc to nie jest żaden string, który nam się wyświetla.
To jest prawdziwe odwołanie do elementu w drzewie DOM.
Mamy jeszcze jedną metodę, która może się przydać w innych sytuacjach.
Jest to getBoundingClientRect.
Będziemy sobie chcieli taki obiekt, który
zostanie zwrócony zapisać w takiej stałej pos jak positions
i odwołamy się do box i na każdym innym elemencie możesz tego użyć i metoda
getBoundingClientRect ją trzeba wywołać i ona zwraca obiekt.
Zobaczmy sobie w konsoli co w tym obiekcie jest.
Zobacz, jest to taki obiekt, który ma różne właściwości i jeżeli byśmy spojrzeli sobie
np. na left to jest tutaj 258, czyli to co mieliśmy wcześniej
a top 164. To mówi nam, że getBoundingClientRect zwraca nam obiekt, w którym mamy
jeżeli chodzi o left i top, czyli te
współrzędne położenia elementu, mamy je już nie względem jego offsetParent, czyli w
tym przypadku teraz tego wrappera, ale względem viewportu, który widzimy.
Czyli tutaj będzie to 258, tutaj 164.
Ale to też nie do końca jest tak, że to
jest od góry dokumentu, ale od góry viewportu. Czyli tutaj
teraz nie możemy przescrollować, ale zobacz
co by było, gdybyśmy powiedzieli, że body ma mieć wysokości np.
niech będzie to 3000 pikseli.
Dzięki temu moglibyśmy tutaj scrollować.
I teraz jeżeli sobie trochę zescrollujemy to górna krawędź tego elementu
tutaj nam pokazywało przy top, że jest to
164 to już nie będzie liczona od samej góry tutaj, ale od viewportu.
Czyli będzie to tylko ta wartość.
I przy okazji pokażę Ci fajny trik, bo
teraz jak odświeżę stronę to ten scroll nam się przesunie z powrotem do góry.
Możemy sobie tutaj w panelu elements zaznaczyć dowolny element,
będzie to ten box.
Jak on jest zaznaczony to w konsoli pod
dolar 0 mamy do niego odwołanie. Takie samo odwołanie jak tutaj w kodzie kiedy
wyszukaliśmy sobie go z querySelector. Więc możemy na nim wykonać pewne akcje. I zróbmy
sobie na nim getBoundingClientRect i zobaczmy jaki top zostanie zwrócony.
Jak widzisz teraz top jest 152, czyli to
będzie ta wartość dokładnie odtąd dotąd, a nie do góry całego dokumentu.
Gdybyśmy chcieli pobrać wartość do góry
całego dokumentu, to musielibyśmy sobie jeszcze pobrać ile zostało przezscrollowane
a o tej pozycji suwaków powiemy sobie w jednej z kolejnych lekcji.
Możesz zauważyć, że tutaj są jeszcze inne wartości, np.
right 458.
To oznacza, że ta krawędź prawa jest
odsunięta od lewej strony viewportu o 458 pikseli.
Mamy tutaj również szerokość tego elementu i jego wysokość,
ale o tych wymiarach powiemy sobie jeszcze w jednej z kolejnych lekcji.
Zatem na razie może Ci się wydawać, że te
rzeczy są ciekawe, ale nie bardzo przydatne,
niemniej jednak w tym kursie zobaczysz, że one będą wręcz niezbędne do tego, aby
stworzyć tooltip, który będzie wyświetlany nad elementem, na który jedziemy.