Opracowanie własnych projektów stron internetowych

INF.03 — Techniki tworzenia stron w HTML i CSS oraz zaawansowane style

1. Samodzielne tworzenie strony w HTML i CSS — Podstawy

Projektowanie strony wymaga metodycznego podejścia, od struktury po zaawansowaną stylizację:

  1. Planowanie Struktury: Używaj semantycznych tagów HTML5 (<header>, <nav>, <main>, <aside>, <article>, <section>, <footer>), aby nadać znaczenie treści, co poprawia SEO i dostępność.
  2. Tworzenie HTML: Zadbaj o hierarchię nagłówków (<h1><h6>), używaj list (<ul>, <ol>) i paragrafów (<p>).
  3. Stylizacja (CSS): Używaj zewnętrznych arkuszy stylów. Organizuj selektory, stosuj dziedziczenie i kaskadę.
  4. Zaawansowana Stylizacja i Układy: Opanuj **Flexbox** (jednowymiarowy układ) i **Grid** (dwuwymiarowy układ) do tworzenia skomplikowanych i elastycznych layoutów.
  5. Responsywność: Użyj Media Queries, aby dostosować stronę do różnych rozmiarów ekranów (desktop, tablet, mobile).
  6. Testowanie: Sprawdź działanie na różnych przeglądarkach (Chrome, Firefox, Edge) oraz urządzeniach.

2. Zaawansowana teoria Flexbox i Grid

2.1. Flexbox (Flexible Box Layout)

Flexbox jest modułem jednowymiarowego układu, który pozwala na elastyczne rozmieszczanie elementów wzdłuż jednej osi (głównej lub poprzecznej). Stosujemy go do komponentów interfejsu (np. menu nawigacyjne, paski boczne).

Właściwości kontenera Flex (Rodzica):
  • display: flex;: Włącza tryb flex.
  • justify-content: <wartość>;: Wyrównuje elementy wzdłuż osi głównej (np. space-between, center).
  • align-items: <wartość>;: Wyrównuje elementy wzdłuż osi poprzecznej (np. center, stretch).
  • flex-direction: <wartość>;: Definiuje oś główną (row, column).
Ćwiczenie 2.1. (Flexbox)

Stwórz menu nawigacyjne, które na dużych ekranach wyświetla elementy w poziomie (row), a na małych w pionie (column), używając flex-direction i @media.

Zadbaj, aby linki były wyśrodkowane w pionie i miały równe odstępy (space-around).

2.2. CSS Grid Layout

Grid jest modułem dwuwymiarowego układu. Umożliwia definiowanie rzędów i kolumn oraz precyzyjne umieszczanie elementów w tych komórkach. Idealny do tworzenia głównej struktury strony (layoutu).

Właściwości kontenera Grid (Rodzica):
  • display: grid;: Włącza tryb grid.
  • grid-template-columns: <definicja>;: Definiuje liczbę i szerokość kolumn (np. 1fr 1fr 1fr lub repeat(3, 1fr)).
  • grid-template-rows: <definicja>;: Definiuje wysokość rzędów.
  • gap: 20px;: Określa odstępy między komórkami.
Właściwości elementu Grid (Dziecka):
  • grid-column: 1 / 3;: Element zajmuje kolumny od linii 1 do 3.
  • grid-area: nazwa;: Nazwanie obszaru w siatce dla łatwiejszego umieszczania.
Ćwiczenie 2.2. (Grid)

Zbuduj layout strony głównej używając Grid. Zdefiniuj trzy obszary:

  1. header (cała szerokość).
  2. sidebar (1/4 szerokości).
  3. content (3/4 szerokości).

Użyj grid-template-areas oraz jednostek fr (np. 1fr 3fr) do definiowania kolumn.

3. Responsywność i Media Queries

Responsywny design polega na tym, że strona automatycznie dostosowuje swój układ i elementy do rozmiaru ekranu użytkownika.

3.1. Konieczne meta-tagi

Aby przeglądarka poprawnie skalowała stronę na urządzeniach mobilnych, musisz mieć w sekcji <head>:

<meta name="viewport" content="width=device-width,initial-scale=1" />

3.2. Media Queries (Zapytania Mediów)

Pozwalają na stosowanie różnych stylów CSS w zależności od cech urządzenia, najczęściej od szerokości ekranu.

Przykład: Zmiana tła dla ekranów mniejszych niż 600px
/* Style dla ekranów do 600px */
@media screen and (max-width: 600px) {
  body {
    background-color: lightcoral;
  }
  .grid {
    /* Na małych ekranach kolumny są jedna pod drugą */
    grid-template-columns: 1fr; 
  }
}
/* Style dla ekranów od 601px do 900px */
@media screen and (min-width: 601px) and (max-width: 900px) {
  /* ... inne style dla tabletów ... */
}
Ćwiczenie 3.1. (Media Queries)

Napisz zapytanie mediów, które zmienia rozmiar czcionki nagłówka <h1> na 24px, jeśli szerokość ekranu jest **mniejsza niż 768px** (typowa granica dla tabletów).

Dodatkowo, dla ekranów mniejszych niż 768px, ustaw padding kontenera (.container) na 15px, aby lepiej wykorzystać przestrzeń mobilną.

4. Animacje i Przejścia CSS (Transitions)

Przejścia i animacje poprawiają doświadczenie użytkownika (UX), dodając płynności do interakcji.

4.1. Przejścia (Transitions)

Służą do płynnej zmiany wartości CSS po zmianie stanu elementu (np. najechaniu myszą :hover).

Płynne przejście koloru tła i cienia
.card {
  background-color: var(--card);
  box-shadow: var(--shadow);
  /* Określenie, że przejście ma trwać 0.4s dla wszystkich zmiennych */
  transition: all 0.4s ease-in-out; 
}
.card:hover {
  background-color: #f0faff; /* Nowy kolor */
  box-shadow: 0 10px 30px rgba(10,102,194,0.2); /* Nowy cień */
  transform: translateY(-5px); /* Lekkie podniesienie */
}

4.2. Animacje (@keyframes)

Pozwalają na zdefiniowanie sekwencji stylów w różnych punktach czasowych (procentowo: 0%, 50%, 100%).

Ćwiczenie 4.1. (Keyframes)

Zdefiniuj prostą animację @keyframes o nazwie pulsuj, która zmienia krycie (opacity) elementu z 1 na 0.5 i z powrotem. Następnie zastosuj tę animację do przycisku (.btn-primary) na 2s i ustaw ją jako nieskończoną (infinite).

5. Praktyczne wskazówki i dostępność (A11Y)

6. Checklist — gotowa praca projektowa

7. Szablon projektowy (Layout Grid/Flex)

Poniżej przedstawiono standardowy, responsywny szablon, łączący techniki Grid (do głównej struktury) i Flexbox (do komponentów wewnątrz, np. nawigacji).

Wizualizacja Layoutu

Oto jak wygląda struktura strony, w której używamy CSS Grid do definicji głównych obszarów (Header, Menu, Content, Footer) i Flexbox do zarządzania wewnętrznym układem (np. w Menu).

Kod CSS Grid dla głównego layoutu

Definicja obszarów strony za pomocą grid-template-areas oraz ustawienie dwóch kolumn: sidebar (250px) i content (resztę).

CSS Grid (dla szerokich ekranów)
.wrapper {
  display: grid;
  /* Definicja obszarów: Header zawsze cała szerokość */
  grid-template-areas: 
    "header header"
    "nav content"
    "footer footer";
  /* 250px na sidebar, reszta (1fr) na content */
  grid-template-columns: 250px 1fr; 
  gap: 20px;
  min-height: 100vh;
}
.header { grid-area: header; }
.nav { grid-area: nav; }
.content { grid-area: content; }
.footer { grid-area: footer; }
Media Query dla responsywności (ekrany mobilne)

Gdy ekran jest wąski, zmieniamy układ na jedną kolumnę, gdzie wszystkie elementy układają się pionowo.

@media (max-width: 800px) {
  .wrapper {
    /* Wszystkie elementy w jednej kolumnie */
    grid-template-columns: 1fr;
    /* Nowa definicja obszarów dla mobile (nav idzie pod header) */
    grid-template-areas: 
      "header"
      "nav"
      "content"
      "footer";
  }
}

Przykładowe użycie Flexbox w komponencie (Menu/Nav)

Wewnątrz obszaru .nav (nawigacja) wykorzystujemy Flexbox, aby elementy menu były równomiernie rozmieszczone w pionie lub poziomie.

CSS Flexbox (w komponencie nawigacji)
.nav ul {
  list-style: none;
  padding: 0;
  display: flex; /* Włącza Flexbox */
  flex-direction: column; /* Ustawia elementy w kolumnie (np. dla sidebara) */
  gap: 10px;
}

@media (max-width: 800px) {
  .nav ul {
    flex-direction: row; /* Zmienia na wiersz na mobile */
    justify-content: space-around; /* Równomierne rozłożenie w poziomie */
  }
}