Dlaczego developer musi znać CSS?
Jako developer często musisz szybko poprawić wygląd interfejsu, zrozumieć dlaczego coś się nie wyświetla poprawnie, lub stworzyć prototyp. Bez podstawowej znajomości CSS każda zmiana w wyglądzie aplikacji oznacza czekanie na frontend developera lub designer-a.
Co się nauczysz:
- Czym jest CSS i jak działa kaskadowość stylów
- Najważniejsze selektory CSS i jak wybierać elementy HTML
- Model pudełkowy (box model) – fundament layoutu
- Właściwości tekstowe i kolorystyczne
- Podstawy pozycjonowania i układania elementów
- Responsywność – jak dostosować stronę do różnych urządzeń
Czym jest CSS?
CSS to jak ubranie dla HTML. HTML to szkielet (struktura), a CSS to wygląd (styl). Podobnie jak w programowaniu obiektowym oddzielasz dane od prezentacji, CSS oddziela treść od wyglądu.
/* Podstawowa składnia CSS */ selektor { właściwość: wartość; inna-właściwość: inna-wartość; } /* Przykład */ p { color: blue; font-size: 16px; margin: 10px; }
Trzy sposoby dodawania CSS
<!-- 1. Inline style (nie zalecane) --> <p style="color: red; font-size: 18px;">Czerwony tekst</p> <!-- 2. Wewnętrzny CSS w <head> --> <head> <style> p { color: blue; } </style> </head> <!-- 3. Zewnętrzny plik CSS (zalecane) --> <head> <link rel="stylesheet" href="styles.css"> </head>
Selektory CSS – jak wybierać elementy
Podstawowe selektory
/* Selektor elementu - wszystkie paragrafy */ p { color: black; } /* Selektor klasy - elementy z class="highlight" */ .highlight { background-color: yellow; } /* Selektor ID - element z id="header" */ #header { font-size: 24px; } /* Selektor uniwersalny - wszystkie elementy */ * { margin: 0; padding: 0; }
Kombinatory selektorów
/* Selektor potomka - wszystkie <p> wewnątrz <div> */ div p { color: gray; } /* Selektor dziecka - bezpośrednie dzieci */ div > p { font-weight: bold; } /* Selektor sąsiada - pierwszy <p> po <h2> */ h2 + p { margin-top: 0; } /* Selektory atrybutów */ input[type="email"] { border: 2px solid blue; } /* Pseudoklasy - super przydatne dla interakcji */ a:hover { color: red; } button:active { background-color: darkblue; }
Model pudełkowy (Box Model) – fundament CSS
Każdy element HTML to pudełko składające się z czterech warstw:
.box { width: 200px; /* Szerokość treści */ height: 100px; /* Wysokość treści */ padding: 20px; /* Odstęp wewnętrzny */ border: 5px solid black; /* Ramka */ margin: 15px; /* Odstęp zewnętrzny */ } /* Całkowita szerokość = width + padding*2 + border*2 + margin*2 */ /* 200 + 40 + 10 + 30 = 280px */
Box-sizing – ułatwienie życia developera
/* Domyślnie - content-box (problematyczne) */ .box-default { width: 200px; padding: 20px; /* Rzeczywista szerokość: 240px - WTF! */ } /* Lepsze podejście - border-box */ .box-border { box-sizing: border-box; width: 200px; padding: 20px; /* Rzeczywista szerokość: 200px - jak należy! */ } /* Globalne ustawienie (zalecane dla każdego projektu) */ * { box-sizing: border-box; }
Właściwości tekstowe i kolorystyczne
Stylowanie tekstu
.text-styling { /* Czcionka */ font-family: Arial, sans-serif; /* Fallback fonts ważne! */ font-size: 16px; /* Lub em, rem */ font-weight: bold; /* normal, bold, 100-900 */ font-style: italic; /* normal, italic */ /* Wyrównanie i spacing */ text-align: center; /* left, center, right, justify */ line-height: 1.5; /* Wysokość linii - czytelność */ letter-spacing: 1px; /* Odstęp między literami */ /* Dekoracje */ text-decoration: underline; /* none, underline, line-through */ text-transform: uppercase; /* lowercase, uppercase, capitalize */ }
Kolory – różne sposoby definiowania
.colors { /* Różne sposoby definiowania kolorów */ color: red; /* Nazwa koloru */ color: #ff0000; /* HEX - najczęściej używane */ color: rgb(255, 0, 0); /* RGB */ color: rgba(255, 0, 0, 0.5); /* RGBA z przezroczystością */ color: hsl(0, 100%, 50%); /* HSL - intuicyjne */ background-color: #f0f0f0; /* Tło */ border-color: #333; /* Kolor ramki */ }
Layout i pozycjonowanie elementów
Display – jak elementy się zachowują
/* Najpopularniejsze wartości display */ .block { display: block; /* Blokowy - pełna szerokość, nowa linia */ } .inline { display: inline; /* W linii - nie można ustawić width/height */ } .inline-block { display: inline-block; /* W linii ale z możliwością wymiarów */ } .hidden { display: none; /* Ukryty - nie zajmuje miejsca w DOM */ } .flex { display: flex; /* Flexbox - nowoczesny layout */ }
Position – kontrola nad umiejscowieniem
.positioning { position: static; /* Domyślne - w normalnym przepływie */ position: relative; /* Względem normalnej pozycji */ position: absolute; /* Względem rodzica z position != static */ position: fixed; /* Względem okna przeglądarki - sticky header */ position: sticky; /* Hybrydowe - relative + fixed */ top: 10px; /* Współpracuje z position */ right: 20px; bottom: 15px; left: 5px; }
Flexbox – nowoczesny sposób na layout
.flex-container { display: flex; justify-content: center; /* Wyrównanie poziome: center, space-between */ align-items: center; /* Wyrównanie pionowe: center, flex-start */ flex-direction: row; /* row, column, row-reverse */ flex-wrap: wrap; /* wrap, nowrap */ gap: 20px; /* Odstęp między elementami - super wygodne */ } .flex-item { flex: 1; /* Elastyczny rozmiar - wypełnia przestrzeń */ flex-basis: 200px; /* Bazowy rozmiar przed elastycznością */ flex-grow: 1; /* Współczynnik rozrastania */ flex-shrink: 0; /* Współczynnik kurczenia */ }
Responsywność – media queries
/* Mobile first approach - zalecane */ .responsive { width: 100%; padding: 10px; font-size: 14px; } /* Tablet */ @media (min-width: 768px) { .responsive { width: 50%; padding: 20px; font-size: 16px; } } /* Desktop */ @media (min-width: 1024px) { .responsive { width: 30%; padding: 30px; font-size: 18px; } } /* Popularne breakpoints */ /* Mobile: 320px - 767px */ /* Tablet: 768px - 1023px */ /* Desktop: 1024px+ */
Praktyczny przykład – stylowanie formularza
Ostylujmy formularz z artykułu o HTML:
/* Reset podstawowy - zawsze na początku */ * { box-sizing: border-box; margin: 0; padding: 0; } body { font-family: Arial, sans-serif; background-color: #f5f5f5; line-height: 1.6; } /* Kontener formularza */ .form-container { max-width: 500px; margin: 50px auto; padding: 30px; background-color: white; border-radius: 8px; box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); } .form-title { text-align: center; color: #333; margin-bottom: 30px; font-size: 24px; font-weight: 300; } /* Grupa pól formularza */ .form-group { margin-bottom: 20px; } .form-label { display: block; margin-bottom: 5px; color: #555; font-weight: 500; } /* Stylowanie inputów */ .form-input { width: 100%; padding: 12px; border: 2px solid #ddd; border-radius: 4px; font-size: 16px; transition: border-color 0.3s ease; } /* Focus state - ważne dla UX */ .form-input:focus { outline: none; border-color: #007bff; box-shadow: 0 0 5px rgba(0, 123, 255, 0.3); } /* Stylowanie przycisku */ .form-button { width: 100%; padding: 15px; background-color: #007bff; color: white; border: none; border-radius: 4px; font-size: 16px; font-weight: 500; cursor: pointer; transition: background-color 0.3s ease; } /* Hover effect */ .form-button:hover { background-color: #0056b3; } /* Active state - feedback dla użytkownika */ .form-button:active { transform: translateY(1px); } /* Responsywność */ @media (max-width: 600px) { .form-container { margin: 20px; padding: 20px; } .form-title { font-size: 20px; } }
CSS w praktyce – integracja z backendem
Struktura plików w Spring Boot
src/ main/ resources/ static/ css/ styles.css <- Główne style admin.css <- Style dla panelu admin components.css <- Style dla komponentów js/ images/ templates/ index.html <- Template z linkami do CSS admin/ users.html
Thymeleaf + CSS – dynamiczne klasy
<!-- Template Thymeleaf --> <div th:class="${user.isActive() ? 'user-active' : 'user-inactive'}"> <span th:text="${user.name}">Jan Kowalski</span> <span th:text="${user.email}">jan@example.com</span> </div> <!-- Linki do CSS w <head> --> <link rel="stylesheet" th:href="@{/css/styles.css}">
/* Odpowiadające style CSS */ .user-active { color: #28a745; background-color: #d4edda; border-left: 4px solid #28a745; padding: 10px; } .user-inactive { color: #6c757d; background-color: #e2e3e5; border-left: 4px solid #6c757d; padding: 10px; }
Częste problemy i rozwiązania
Problem z centrowanie (klasyk!)
/* Centerowanie poziome - tekst */ .text-center { text-align: center; } /* Centerowanie poziome - blok */ .block-center { margin: 0 auto; width: 300px; /* Musi mieć określoną szerokość! */ } /* Centerowanie pionowe i poziome - flexbox magic */ .flex-center { display: flex; justify-content: center; align-items: center; height: 100vh; }
Problem ze specyficznością
/* Słaba specyficzność - może być nadpisana */ p { color: blue; } /* Mocniejsza specyficzność */ .content p { color: red; } /* Jeszcze mocniejsza */ #main .content p { color: green; } /* Nuclear option - unikaj !important */ p { color: purple !important; }
Debugowanie CSS – narzędzia
1. F12 – otwórz narzędzia deweloperskie
2. Elements – podgląd HTML i CSS na żywo
3. Computed – zobacz wszystkie style elementu
4. Box Model – wizualizacja padding, border, margin
CSS Reset/Normalize – czysta karta
/* Prosty reset - wystarczy na początek */ * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: Arial, sans-serif; line-height: 1.6; } /* Lub użyj gotowego Normalize.css */ /* https://necolas.github.io/normalize.css/ */
Nie! Wystarczy znać podstawy: model pudełkowy, selektory, flexbox, kolory i umieć googować resztę. CSS ma setki właściwości, ale 80% pracy robi się 20% z nich.
Flexbox do układów 1D (rząd lub kolumna), Grid do układów 2D (siatka). Dla większości przypadków wystarczy flexbox. Grid przydaje się do kompleksowych layoutów jak dashboard.
Użyj Developer Tools (F12), sprawdź Computed styles, wyłączaj style jeden po drugim. Dodaj border: 1px solid red; żeby zobaczyć granice elementów.
W 2016 już można ignorować IE8 i niższe. IE9+ obsługuje większość nowoczesnego CSS. Używaj caniuse.com do sprawdzania kompatybilności.
Bootstrap czy Foundation przyspieszają development, ale dodają weight. Dla prototypów – tak, dla produkcji lepiej custom CSS. To jak używanie bibliotek w programowaniu.
Przydatne zasoby:
- MDN CSS Documentation
- CSS Tricks – praktyczne tutoriale i trickie
- Flexbox Froggy – gra do nauki flexbox
- Can I Use – kompatybilność CSS z przeglądarkami
🚀 Zadanie dla Ciebie
Ostyluj formularz HTML z poprzedniego artykułu:
- Użyj maksymalnej szerokości 400px i wycentruj go
- Dodaj padding 20px i subtle box-shadow
- Ostyluj inputy z focus states (niebieski border)
- Zrób przycisk z hover effect (ciemniejszy background)
- Dodaj responsywność dla mobile (max-width: 480px) – mniejszy padding
Bonus: Stwórz prostą tabelę użytkowników z zebra striping (naprzemienne kolory wierszy) używając :nth-child(even).
Czy już używasz CSS w swoich projektach? Jakie masz największe problemy ze stylowaniem? Flexbox czy nadal walczysz z float? Podziel się swoimi doświadczeniami!