DEV Community

itachiszep24
itachiszep24

Posted on

# Responsive Tailwind CSS: The Universal Pattern You'll Use Every Day


import React, { useState } from "react";
// Importuj ikony hamburger i X z biblioteki lucide-react
import { Menu, X } from "lucide-react";

const Navbar = () => {
// State do przechowywania stanu menu (otwarte/zamknięte)
const [open, setOpen] = useState(false);

return (
// Nav - główny element, fixed aby przylepił się do góry, z-50 żeby był nad innymi elementami

  {/* Kontener wewnętrzny - flex do rozprowadzenia elementów */}
  <div className="mx-auto px-6 h-12 flex items-center justify-between">

    {/* Logo - po lewej stronie */}
    <div className="text-white font-bold text-lg">KnopersShop</div>

    {/* 
      === DESKTOP MENU ===
      $ $ $ NAJWAŻNIEJSZY BREAKPOINT 1 $ $ $
      Widoczne TYLKO na dużych ekranach (md+)

      $ "hidden" = domyślnie ukryto (dotyczy: < 768px, czyli telefon i mały tablet)
      $ "md:flex" = od 768px POKAŻ menu jako flex (dotyczy: ≥ 768px, czyli tablet i desktop)

      LOGIKA:
      - Telefon (< 768px): klasa "hidden" → menu UKRYTE ❌
      - Desktop (≥ 768px): klasa "md:flex" → menu WIDOCZNE ✅
    */}
    <ul className="hidden md:flex gap-6 absolute left-1/2 transform -translate-x-1/2">
      <li><a className="text-red-400 hover:text-white transition" href="">Home</a></li>
      <li><a className="text-red-400 hover:text-white transition" href="">About</a></li>
      <li><a className="text-red-400 hover:text-white transition" href="">Contact</a></li>
      <li><a className="text-red-400 hover:text-white transition" href="">Products</a></li>
    </ul>

    {/* 
      $ $ $ NAJWAŻNIEJSZY BREAKPOINT 2 $ $ $
      Hamburger przycisk - widoczny TYLKO na małych ekranach (< md)

      $ "md:hidden" = od 768px UKRYJ button (dotyczy: ≥ 768px, czyli tablet i desktop)
      $ Brak "hidden" = domyślnie POKAŻ button (dotyczy: < 768px, czyli telefon)

      LOGIKA:
      - Telefon (< 768px): brak "hidden" → button WIDOCZNY ✅
      - Desktop (≥ 768px): klasa "md:hidden" → button UKRYTY ❌

      onClick={() => setOpen(!open)} = przełącz stan menu (otwórz/zamknij)
    */}
    <button
      onClick={() => setOpen(!open)}
      className="md:hidden text-white"
      aria-label="Toggle menu"
    >
      {/* Jeśli menu otwarte pokaż X, jeśli zamknięte pokaż Menu */}
      {open ? <X size={24} /> : <Menu size={24} />}
    </button>
  </div>

  {/* 
    === MOBILE MENU ===
    Mobile menu dropdown - pokazuje się TYLKO:
    1. Gdy state "open" jest true (użytkownik kliknął hamburger)
    2. Gdy ekran jest < md (768px)

    "md:hidden" = od 768px tego ukryj (nawet jeśli by miało się pokazać)
  */}
  {open && (
    <div className="md:hidden bg-gray-900 px-6 py-4 flex flex-col gap-3">
      <a href="" className="text-red-400 hover:text-white transition">Home</a>
      <a href="" className="text-red-400 hover:text-white transition">About</a>
      <a href="" className="text-red-400 hover:text-white transition">Contact</a>
      <a href="" className="text-red-400 hover:text-white transition">Products</a>
    </div>
  )}
</nav>
Enter fullscreen mode Exit fullscreen mode

);
};

export default Navbar;

/*
╔════════════════════════════════════════════════════════════════════╗
║ PODSUMOWANIE BREAKPOINTÓW - NAJWAŻNIEJSZE ║
╚════════════════════════════════════════════════════════════════════╝

md = 768px (punkt przełączenia)

$ REGUŁA 1: "hidden md:flex"
< 768px (telefon): hidden → UKRYTO ❌
≥ 768px (desktop): md:flex → WIDOCZNE ✅

$ REGUŁA 2: "md:hidden"
< 768px (telefon): brak hidden → WIDOCZNE ✅
≥ 768px (desktop): md:hidden → UKRYTO ❌

WYNIK:
Telefon: hamburger ✅, menu ❌
Desktop: hamburger ❌, menu ✅
*/

// Menu/elementy które chcesz na DUŻYCH ekranach
className="hidden md:flex"

// Elementy które chcesz na MAŁYCH ekranach
className="md:hidden"


**Niezależnie od projektu:**
- Navbar → `hidden md:flex` i `md:hidden`
- Sidebar → `hidden md:flex` i `md:hidden`
- Header → `hidden md:flex` i `md:hidden`
- Footer sekcje → `hidden md:flex` i `md:hidden`

**To jest SZABLON:**
Enter fullscreen mode Exit fullscreen mode

Coś dla dużych ekranów? → hidden md:flex ✅
Coś dla małych ekranów? → md:hidden ✅

Responsive Tailwind CSS: The Universal Pattern You'll Use Every Day
Responsywność w Tailwindzie nie musi być skomplikowana. Istnieje jeden uniwersalny pattern, który rozwiąże 95% Twoich problemów.
The Golden Rule

Responsive Tailwind CSS: The Universal Pattern You'll Use Every Day

Responsywność w Tailwindzie nie musi być skomplikowana. Istnieje jeden uniwersalny pattern, który rozwiąże 95% Twoich problemów.

The Golden Rule

// Dla dużych ekranów (desktop)
className="hidden md:flex"

// Dla małych ekranów (mobile)
className="md:hidden"
Enter fullscreen mode Exit fullscreen mode

To jest wszystko. Tyle potrzebujesz.


Dlaczego Ten Pattern Działa

Tailwind pracuje na zasadzie mobile-first. Oznacza to, że:

  1. Domyślny stan - zawsze zakładasz telefon (< 768px)
  2. Breakpoint modifier - dodajesz klasę, aby zmienić styl od pewnego rozmiaru (md+)
// Czytaj to tak:
// "Domyślnie hidden, od md pokaż jako flex"
className="hidden md:flex"

// "Domyślnie widoczne, od md ukryj"
className="md:hidden"
Enter fullscreen mode Exit fullscreen mode

Praktyczne Zastosowanie

Navbar (Desktop Menu + Hamburger)

// Desktop menu - ukryto na telefonie, flex od md
<ul className="hidden md:flex gap-6">
  <li><Link href="">Home</Link></li>
  <li><Link href="">About</Link></li>
</ul>

// Hamburger button - widoczny na telefonie, ukryty od md
<button className="md:hidden">
  <Menu size={24} />
</button>

// Mobile menu - widoczny na telefonie, ukryty od md
<div className="md:hidden">
  <a href="">Home</a>
  <a href="">About</a>
</div>
Enter fullscreen mode Exit fullscreen mode

Sidebar

<aside className="hidden lg:flex flex-col w-64">
  {/* Sidebar visible only on large screens */}
</aside>
Enter fullscreen mode Exit fullscreen mode

Responsive Grid

<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4">
  {/* 1 col on mobile, 2 cols on tablet, 4 cols on desktop */}
</div>
Enter fullscreen mode Exit fullscreen mode

Responsive Spacing

<div className="px-4 md:px-8 lg:px-16">
  {/* 4px padding on mobile, 8px on tablet, 16px on desktop */}
</div>
Enter fullscreen mode Exit fullscreen mode

Tailwind Breakpoints Reference

Breakpoint Min Width Użyj Kiedy
sm 640px Rzadko
md 768px Zawsze (default)
lg 1024px Dla dużych desktop'ów
xl 1280px Wyjątki
2xl 1536px Monitor 4K

Profesjonalny porada: Trzymaj się md:hidden i hidden md:flex. Inne breakpointy to wyjątki.


The Pattern Applied to Everything

Ta sama logika działa dla każdej CSS właściwości:

// Display
className="hidden md:block"
className="block md:hidden"

// Flexbox
className="flex-col md:flex-row"

// Grid
className="grid-cols-1 md:grid-cols-2"

// Typography
className="text-sm md:text-base lg:text-lg"

// Colors
className="bg-red-400 md:bg-blue-400"

// Width
className="w-full md:w-1/2"
Enter fullscreen mode Exit fullscreen mode

Why This Matters

  1. Consistency - Ten sam pattern we wszystkich projektach
  2. Predictability - Zawsze wiesz gdzie szukać breakpoint'ów
  3. Performance - Mniej CSS na urządzeniach mobilnych
  4. Maintainability - Łatwo dodawać responsive warianty

Podsumowanie

Chcesz element na DUŻYCH ekranach?    → hidden md:flex ✅
Chcesz element na MAŁYCH ekranach?    → md:hidden ✅
Chcesz element na OBU ekranach?       → flex (bez breakpoint) ✅
Enter fullscreen mode Exit fullscreen mode

To jest całe Tailwind responsiveness. Mistrz się robi przez powtórzenie.


TL;DR: Używaj hidden md:flex i md:hidden. Koniec. Prawie nigdy nie potrzebujesz nic innego.

Top comments (0)