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.
Wszędzie tam, gdzie możesz zmienić wygląd
strony internetowej lub jakiegoś elementu za pomocą dodania lub usunięcia klasy CSS,
powinieneś to robić. Czyli wcześniej w kodzie CSS zdefiniować sobie klasy
odpowiedzialne za wygląd i z użyciem JavaScript te klasy dodawać lub usuwać.
Natomiast czasami są takie sytuacje, że
chcemy przypisać liniowe style do elementów.
I mówiąc liniowe mam na myśli tak jakbyśmy
tutaj do tego paragrafu przypisali po prostu style i np.
line -height 30 pikseli itd.
Taki konkretny przykład może nie jest najlepszy, ale są czasami takie sytuacje,
gdzie chcemy tutaj coś przypisać dynamicznie i będą to np.
jakieś rzeczy związane z pozycjonowaniem absolutnym takie jak np.
top 126 px itd.
I to mogą być jakieś wartości wyliczone dynamicznie z użyciem języka JavaScript,
co jeszcze będziemy później robić w tym kursie.
Wyobraź sobie np.
że możemy kliknąć na jakiś element i go przeciągać.
Na pewno wielokrotnie spotkałeś się w
przeglądarkach internetowych z czymś takim.
To działa w ten sposób, że będziemy odczytywać pozycję kursora myszy
i na podstawie tej pozycji przypisywać odpowiednie atrybuty, takie jak np.
top czy left do danego elementu.
My w tej lekcji nie będziemy robić takiego
zaawansowanego przykładu, ale chcę Ci właśnie wyjaśnić, kiedy musimy skorzystać
z takich styli, a kiedy możemy korzystać z klas.
Czyli nie możemy skorzystać z klas, kiedy potrzebujemy dynamicznie wyliczyć np.
pozycję jakiegoś elementu i takie style musimy ustawić, bo nie jesteśmy w stanie
wcześniej określić w klasie właśnie takich wartości jak top 126 pikseli.
Czyli czasami zachodzi taka potrzeba, aby
przypisać style liniowe do danego elementu.
I w tej lekcji pokażę Ci jak możemy to zrobić. Żeby nie tracić czasu
tutaj pobrałem sobie już do stałych jak
widzisz odpowiednie elementy i na nich będziemy chcieli sobie pracować.
Więc żeby przypisać liniowe style np.
do elementu h1 powiedzmy, że chcę zmienić jego kolor, ale tak jak wspomniałem takimi
rzeczami zajęli byśmy się raczej w CSS i dodawali byśmy odpowiednią klasę.
Niemniej jednak zasada przypisywania dowolnych właściwości CSS jest taka sama,
więc odwołuję się do h1 i mamy właściwość style.
To jest taki specjalny obiekt, który będzie miał różne właściwości
i mogę powiedzieć kolor równa się i przypisać mu wartości np.
kolor czerwony.
Zobacz co się stanie jak zapiszę, ta h1
powinna mieć kolor czerwony.
OK, tak się nie stało, więc sprawdźmy dlaczego.
OK, dlatego, że podałem niepoprawną wartość.
To powinno być jeszcze jedno zero.
Teraz jak sobie odświeżmy
jak widzisz jak najbardziej tutaj jest
kolor czerwony i ten styl został tutaj przypisany.
Przeglądarka zamieniła go na inną notację, ale to nie ma żadnego znaczenia.
No i dokładnie w ten sam sposób moglibyśmy
przypisać wspomniane wcześniej właściwości np.
top czy left.
Jeżeli chcemy ich przypisać więcej, to
musielibyśmy ponowić tą linijkę pod spodem i przypisać jakąś inną właściwość.
Więc spróbujmy zrobić np.
style.font-size.
I teraz od razu ważna uwaga, nie możemy tego zapisać tak jak nazwa właściwości w
CSS, bo ta pauza będzie potraktowana jako minus.
Więc tutaj albo musimy się odwołać tak jak to w obiektach już w tym kursie
pokazywałem w ten sposób do właściwości i ją przypisać tutaj albo możemy skorzystać
z notacji camelCase, która będzie wyglądała tak.
A więc wszystkie właściwości CSS, które
mają w sobie pauzę możesz zamienić właśnie na taką notację.
I teraz przypiszemy sobie tutaj wartość np.
20 pikseli.
Ważne, żeby podać tutaj jednostki.
I przy okazji jak widzisz zawsze te
wartości to będą po prostu wartości typu string.
OK, jak sobie coś takiego zapiszemy, od razu ten nagłówek się zmniejszył
i jak widzisz te style zostały również tutaj w dynamiczny sposób przypisane.
Możemy również od razu przypisać więcej styli, ale wtedy musimy mieć świadomość,
że te które już tam były zostaną nadpisane, czyli podobnie jak w przypadku className.
Spróbujmy zrobić to na container.
Możemy się odwołać do style
i następnie do takiej specjalnej właściwości jak cssText.
Wtedy przypiszemy cały ciąg czy cały
kod CSS jaki chcemy tutaj dodać i mogę powiedzieć np.width
600 px i od razu powiedzmy margin
0 auto. Coś w tym stylu i to zostanie przypisane do naszego kontenera.
Zauważ, że on teraz został wyśrodkowany.
Dokładnie tak się stało, że te style zostały tutaj przypisane, ale gdyby jakieś
inne tam były, zostałyby nadpisane właśnie takim ciągiem.
Mamy na stronie również dwa paragrafy i
chciałbym Ci pokazać, że na nich możemy bez problemu wykonać pętle,
gdybyśmy im wszystkim chcieli przypisać na przykład lineHeight, czyli pobrałem je za
pomocą querySelectorAll co zwraca nam kolekcję.
Na kolekcjach moglibyśmy wykonać jakąś pętlę, taką standardową pętlę for np.
i jest mniejsze od p.length i
i + +
czyli chcę przeiterować po wszystkich tych paragrafach i następnie odwołam się do p[i], co zwróci mi
pierwszy taki paragraf, potem drugi, no i tyle generalnie ile ich będzie.
Następnie do właściwości style.lineHeight
również w notacji camelCase ustawimy na 30 pikseli. Więc to jest
sposób na to, aby wszystkim elementom, które masz pobrane z użyciem querySelectorAll
przypisać jakieś style, a nie tylko pierwszemu elementowi, tak jak to
się dzieje, kiedy korzystamy z querySelector.
Zauważ teraz wszystkie paragrafy na stronie również otrzymały takie style.
Teraz mógłbyś zapytać w jaki sposób usuwać takie style?
Bo jeżeli dodamy line-height, to jak go
teraz wyczyścić w taki sposób, żeby nie był już brany pod uwagę?
I wtedy pod uwagę będzie wzięty line-height,
który jest zdefiniowany w jakimś arkuszu styli.
Bo takie liniowe style oczywiście mają
pierwszeństwo przed tymi, które są gdzieś tam zdefiniowane w dodatkowych arkuszach.
Otóż wystarczy taką wartość ustawić na pusty ciąg znaków.
I teraz pokażę Ci to może w przypadku display block, bo mamy również na stronie
pewien link i to jest coś, z czego bardzo często korzystam.
Wyobraź sobie, że do jakiegoś elementu przypiszesz np.
style.display block
i to jest powiedzmy po to, żeby pokazać taki element,
bo załóżmy, że ten element byłby ukryty. Przypiszmy mu np.
klasę link
i zrobimy coś takiego, że dodamy sobie tutaj style
i powiemy, że link jest domyślnie ukryty, czyli ma display none, a więc my go nie
widzimy i powiedzmy po kliknięciu w jakiś przycisk wykonali byśmy taką linijkę
a więc ustawili byśmy style.display block.
Ten element by się pokazał. I potem powiedzmy jeszcze raz kliknęlibyśmy w
jakiś przycisk i chcielibyśmy go ukryć to nie musimy mu przypisywać już display
noon, tylko wystarczy, że zresetujemy tę wartość.
Czyli moglibyśmy to zrobić np.
w ten sposób link.style.display i ustawiamy na taką wartość.
To sprawi, że oryginalne style, które
gdzie indziej są zdefiniowane, zostaną przypisane.
Zobaczmy. Po odświeżeniu ten element znika i jak
sobie zerkniemy, to nie ma na nim żadnych naszych styli.
Mamy tutaj tylko taki pusty atrybut, bo ustawiliśmy display na pustą wartość i
teraz pod uwagę brane jest to co zdefiniowałem przed momentem.
Możesz to zobaczyć w tym miejscu.
Na koniec pokażę Ci jeszcze jak możemy
odczytywać style aktualnie przypisane do elementu, czyli jak mamy ten element link
i bym tego nie usunął to mógłbym w console.log zrobić link.style.display
i odczytali byśmy jaka jest aktualna wartość właśnie takiego stylu.
Zobaczmy to nam zwróci blok.
Ale pytanie co by było gdybym chciał
zapytać jaki jest aktualny kolor tego elementu?
Czy mogę się odwołać do kolor?
Tak po prostu?
Zobaczmy.
Okazuje się, że zostaje tutaj zwrócony
pusty ciąg, dlatego, że w ten sposób możemy odczytać tylko style przypisane w
tym atrybucie, a nie ogólnie jakie style są dostępne na elemencie.
Natomiast mamy ciekawą metodę na obiekcie
Window, która nazywa się Get Computer Style i ona pozwala nam odczytać wszystkie
style, które są zaaplikowane do tego elementu.
Bo zauważ, że on ma jakiś kolor,
a to oznacza, że możemy ten kolor odczytać i ten kolor jest zdefiniowany gdzieś
zupełnie indziej. Więc możemy zrobić coś takiego.
Zrobimy console.log i w środku window.getComputedStyle,
tutaj przekazujemy odwołanie do elementu. Więc mamy odwołanie do linku tutaj
i następnie to zwraca nam taki duży obiekt, gdzie są wszystkie wyliczone style
dla tego elementu i możemy po właściwości odwołać się np.
do color.
Zobacz jak to będzie wyglądać w konsoli.
Teraz ten kolor został zwrócony. Natomiast
on może być zwrócony właśnie w takiej notacji rgb i jako string,
ale jak widzisz on jest.
Jeżeli bym się odwołał do fontSize,
również dowiedzielibyśmy się jaki fontSize jest tam aktualnie ustawiony.
To zatem tyle. Czyli podsumowując ja w tej lekcji
pokazałem jak przypisać style takie jak fontSize czy color,
natomiast tak naprawdę w większości przypadków to można załatwić odpowiednią
klasą CSS a takie style za pomocą atrybutu style,
czy takiej właściwości, czyli liniowe
style będziemy przypisywać wszędzie tam, gdzie będziemy potrzebowali jakiś
dynamicznych wartości, które będą wyliczane,
czyli na przykład
tak jak wspomniałem, aby chwycić i przeciągać jakiś element, będziemy
odczytywać pozycję kursora myszy i na jej podstawie manipulować np.
właściwością top i left, kiedy element będzie miał position absolute.
W ten sposób ten element na stronie będzie się przesuwał.