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.
Kontynuujemy pracę nad Tooltip i poprzednią lekcję skończyliśmy na tym, że
po najechaniu na jakiś element jego tooltip jest wstawiany na stronę.
I teraz będziemy chcieli się zająć tym, żeby ten tooltip wypozycjonować tak, aby
znalazł się nad elementem, na który najechaliśmy.
A zatem przejdźmy do kodu.
I jesteśmy tutaj funkcji createTooltip.
Po pierwsze na początku będę chciał zrobić tak, żeby ten element tooltip był ukryty.
Czyli dodam mu klase hidden, którą zdefiniowałem w CSS,
następnie będziemy chcieli tutaj wypozycjonować ten element na stronie i
dopiero wtedy go pokazać, aby nie było jakiegoś np.
mignięcie, że ten element dodaliśmy itd.
A poza tym tak naprawdę tutaj głównym powodem jest to,
że za pomocą takiego zapisu ten tooltip w zasadzie będzie tak ładnie pokazywany, bo
tutaj mamy przypisane transition do opacity i do visibility. Więc dzięki
temu po prostu ten element będzie płynnie pokazywany.
Czyli przypisuję klasę hidden i dodaję go do body.
No i zobacz co się dzieje. On jest wstawiany do body, ale go nie widać
za pomocą właśnie tej klasy hidden. A więc tutaj go sobie wypozycjonujemy i następnie
będziemy go chcieli dodać do body i usunąć mu klasę hidden.
Czyli możemy powiedzieć, że na tym etapie
tooltip.classList.remove, usuwamy mu klasę hidden,
dzięki temu on zostanie pokazany.
Sprawdźmy, po najechaniu na ten element
jak widać tooltip się pojawia.
Czyli zajmiemy się teraz punktem czwartym.
Wypozycjonuj element tooltip w odpowiednim miejscu i wstaw go na stronę.
I to jest coś, co może się wydawać
skomplikowane, dlatego zróbmy sobie to krok po kroku.
Skąd ta funkcja
createTooltip ma wiedzieć, jaka powinna być pozycja tooltipa?
Otóż chciałbym ją tutaj przekazywać w formie options.
Czyli nazwiemy sobie tutaj parametr options i przy wywołaniu tej funkcji
createTooltip będę chciał tutaj przekazać jakiś obiekt z opcjami.
Skąd my ten obiekt weźmiemy?
Otóż utworzymy sobie go w tym miejscu.
A więc skoro pobraliśmy pozycję elementu,
na który jechaliśmy, a więc na przykład z tego obrazka, wiemy ile on jest odsunięty
od lewej strony, wiemy jaka jest jego szerokość i ile jest odsunięty od góry.
To wszystko mamy zapisane tutaj w pos. Więc będę chciał sobie utworzyć taki
obiekt, który nazwiemy options i w środku będę chciał zapisać trzy właściwości.
Pierwsza to będzie w, ale możesz ją nazwać jak chcesz np.
width i ona będzie właśnie nam reprezentować
szerokość powiedzmy tego obrazka, na który najechaliśmy.
A więc możemy z tej metody getBoundimgClientRect
wyciągnąć to za pomocą po prostu width.
Następnie będę chciał podać pozycję tutaj
lewej krawędzi tego elementu i zapiszę sobie to pod nazwą x.
Będzie to pos.left.
To też pokazywałem już w osobnej lekcji.
I następnie górną pozycję pos i tutaj będziemy mieli top.
A więc to są pozycje elementu, na które najechaliśmy. I właśnie takie opcje będę
chciał przekazać do funkcji createTooltip, aby mogła ona z nich skorzystać.
Zatem przekazujemy tam odczytany tekst, a
także odczytane szerokości i pozycje X i Y.
Tak sobie je nazwaliśmy. Zatem możemy już
nie patrzeć na tą funkcję, ale wrócić do tej funkcji.
Wiemy teraz, że pod options będziemy mieli
właśnie taki obiekt, gdzie będzie w, x i y. I za pomocą tych danych wypozycjonujemy
odpowiednio ten tooltip. Żeby ten tooltip wyświetlić w odpowiednim miejscu
to ja Ci pokazywałem, że trzeba mu
przypisać style po prostu left i top w CSS.
A zatem odwołajmy się do niego
i następnie do style, co też Ci już pokazywałem i do left.
I tutaj za pomocą Template Stringu
przypiszemy odpowiednią wartość w pikselach.
Zastanówmy się na początek co w zasadzie chcemy tutaj zrobić.
A więc mamy taki tooltip i gdzie powinna być jego lewa krawędź?
Tak naprawdę jeżeli byśmy najechali na ten
obrazek to chciałbym odczytać, w którym miejscu jest środek tego obrazka.
A więc mając szerokość tego obrazka
pod options w, tutaj sobie to możemy zinterpolować, w, w ten sposób.
To jest cała szerokość
czyli w tym przypadku jak byśmy sobie sprawdzili ten obrazek on ma szerokość
960. Więc jeżeli byśmy tylko tak to przypisali dodali tutaj piksele, zobacz,
to po najechaniu na ten obrazek ten tooltip pojawia się w tym miejscu.
Natomiast chcemy go wyświetlać na środku
tego obrazka, a więc szerokość tego obrazka możemy podzielić przez 2.
Teraz już powinno być znacznie lepiej.
Zgadza się.
Jeszcze nie do końca to wszystko, bo my
pozycjonujemy ten Tooltip względem body, czyli całkowicie tej lewej krawędzi,
a szerokość obrazka bierzemy odtąd dotąd i dzielimy na pół.
Czyli wychodzi nam, że to jest jakby w tym miejscu,
ale ten obrazek, jak widzisz, ma tutaj
jeszcze taką przestrzeń, więc musimy ją wziąć pod uwagę.
I mamy ją zapisaną już w x, czyli pobraliśmy sobie ją jako position left.
To jest właśnie odległość tej krawędzi od krawędzi okna.
I dzięki temu będziemy również mogli sobie to odjąć.
Przejdźmy zatem tutaj.
I w zasadzie nawet nie będziemy tego odejmować, tylko dodawać do tej szerokości
czyli napiszmy options x
a więc ta odległość od lewej krawędzi
i do tego dodamy właśnie to.
To się wykona najpierw, a później to.
Więc co tutaj się tak naprawdę stanie?
Po pierwsze zobaczmy, bo tak jest łatwiej sprawdzić.
Jest już lepiej.
Można powiedzieć, że lewa krawędź tego
tooltipa jest teraz dokładnie na środku tego obrazka.
Dlaczego tak się stało?
Wzięliśmy sobie szerokość tego obrazka, czyli 960 pikseli,
podzieliliśmy to na pół,
wyszło nam z tego 480 pikseli i do tego dodaliśmy sobie jeszcze tę odległość.
Nie wiem, ile tutaj jest dokładnie musielibyśmy zmierzyć.
Powiedzmy, że jest tutaj 60 pikseli ok.
I właśnie na taką wartość ustawiliśmy left.
Tych tooltipów nam się tutaj trochę
natworzyło, ale zobacz, że wyszła nam dokładnie taka oto wartość.
Odświeżę stronę, najadę jeszcze raz żeby ten tooltip był 1.
Czyli widzimy, że on teraz dokładnie jest na środku tego obrazka.
Podobnie będzie jak sobie najadę na inny
element, zauważ, że tooltip pojawi się na środku tego elementu
i podobnie tutaj u góry. Najeżdżam na ten
element i ten tooltip jest na środku tego elementu.
Natomiast teraz jeszcze będziemy musieli
zrobić dwie rzeczy. Czyli ten tooltip wyświetlić na odpowiedniej wysokości,
czyli przypisać mu top, a także przesunąć go o połowę jego szerokości w lewo.
Wtedy będzie dokładnie na środku.
Więc najpierw zajmiemy się tym topem.
A zatem przypiszemy tooltip.style.top
i tutaj również sobie zrobimy taki Template String, też będzie to wartość w
pikselach, a resztę sobie zinterpolujemy w tym miejscu.
A zatem będziemy chcieli się odwołać do tej wartości y, czyli powiedzmy po
najechaniu na obrazek mamy odczytane ile on się od góry znajduje.
I na początek właśnie to przypiszmy, czyli options y.
I zobaczmy co się stanie, najeżdżam sobie tutaj i jak widać górna krawędź naszego tooltip,
zobacz, tutaj wyszło nam to top 193,
została ustawiona tak jak górna krawędź obrazka. Więc teraz chciałbym ten tooltip
wyjąć tutaj jeszcze do góry o tyle jaka jest jego wysokość.
Jak możemy pobrać wysokość tego tooltip?
Otóż możemy to zrobić za pomocą np.
offset height, co też Ci już w tym kursie pokazywałem.
Czyli do tego co już tutaj przypisaliśmy,
a w zasadzie od tego chcemy odjąć tooltip.offsetHeight,
zobaczmy, teraz po najechaniu tutaj
coś chyba nam nie zadziałało.
Zgadza się, tutaj mamy jeden kardynalny błąd.
Mianowicie chcemy odczytać wysokość tego tooltipa, ale on nie został jeszcze
wstawiony na stronę, więc nie wiadomo jaka jest jego wysokość.
A zatem musimy najpierw go wstawić na stronę i dzięki klasie hidden on jest
ukryty, ale ma już wymiary na stronie i możemy je odczytać.
I teraz to powinno działać, więc to jest tutaj kluczowe.
Po najechaniu jak widzisz ten tooltip teraz został przesunięty do góry właśnie o tę
jego wysokość, ale nie została ona w stu procentach dobrze odczytana, dlatego, że
mamy w nim jeszcze taki mały element pozycjonowany
absolutnie. To jest ten trójkącik, więc w zasadzie
tutaj możemy sobie jeszcze od tego odjąć wartość np.
10. To już w ten sposób ręczny wpisać.
I teraz jak widzisz będzie idealnie.
Więc po najechaniu na dany element tooltip
pojawia się idealnie nad nim, ale jeszcze nie pojawia się idealnie na środku, bo
pojawia się na środku tego elementu, czyli tutaj,
ale teraz chcemy go w lewo przesunąć o właśnie połowę szerokości tego tooltipa.
To skoro wysokość tooltipa odczytaliśmy
za pomocą offsetHeight, to jego szerokość odczytamy za pomocą offsetWidth i tutaj
będziemy chcieli również ją odjąć. A zatem w dowolnym miejscu np.
tutaj napiszemy minus tooltip.offsetWidth ale dzielone na dwa.
Tutaj kolejność działań będzie automatycznie przez JavaSctipt dobrze zrobiona.
Nie trzeba żadnych nawiasów, czyli
najpierw będzie dzielenie, potem odejmowanie.
Zobaczmy.
I teraz po najechaniu na taki element jak widzisz jest on
ten tooltip dokładnie na środku wyświetlany. Również tutaj
tak to będzie wyglądać i również tutaj.
A więc nasz tooltip już prawie działa, ale
chcielibyśmy jeszcze po zjechaniu z tego elementu ukrywać taki tooltip i np.
pozbyć się tego domyślnego dymka, który
się pojawia, a także wszystko zawrzeć w fajnym module
dlatego podzielimy sobie to jeszcze na trzecią lekcję, w której to wszystko Ci pokażę.