16. Reszponzív design és media queries
A reszponzív webdesign biztosítja, hogy a weboldal minden eszközön - asztali gépen, tableten és mobilon - jól jelenjen meg és használható legyen. Ebben a cikkben megtanulod a media queries használatát és a mobilbarát technikákat.
Érettségi információ
Ez a lecke BÓNUSZ anyag!
A reszponzív design és media queries NEM része az érettségi követelményeknek. Ez a lecke hasznos kiegészítő tudás a modern webfejlesztéshez, de a vizsgán nem kérdezik.
Mi a reszponzív design? BÓNUSZ
A reszponzív webdesign olyan megközelítés, ahol a weboldal automatikusan alkalmazkodik a különböző képernyőméretekhez és eszközökhöz.
A reszponzív design három pillére
- Rugalmas grid: Százalékos szélességek fix pixelek helyett
- Flexibilis képek: Képek skálázódnak a konténerhez
- Media queries: CSS szabályok eszközméret alapján
Viewport meta tag BÓNUSZ
A reszponzív design alapja a viewport meta tag a HTML <head> részében:
<!-- Kötelező minden reszponzív oldalon -->
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- Teljes szintaxis -->
<meta name="viewport" content="
width=device-width, /* Szélesség = eszköz szélessége */
initial-scale=1, /* Kezdeti zoom: 100% */
minimum-scale=1, /* Min zoom (opcionális) */
maximum-scale=5, /* Max zoom (opcionális) */
user-scalable=yes /* Zoom engedélyezve (ajánlott!) */
">Akadálymentesség: Ne tiltsd le a zoomot!
user-scalable=noésmaximum-scale=1kerülendő- Gyengénlátó felhasználóknak szükségük lehet a nagyításra
- Sok mobil böngésző figyelmen kívül hagyja ezeket az értékeket
Media queries alapok BÓNUSZ
A @media szabállyal feltételesen alkalmazhatunk CSS-t a képernyő mérete, típusa vagy egyéb jellemzői alapján.
/* Alapszintaxis */
@media típus and (feltétel) {
/* CSS szabályok */
}
/* Képernyő szélesség alapján */
@media screen and (min-width: 768px) {
.container {
max-width: 750px;
}
}
/* Maximum szélesség */
@media screen and (max-width: 767px) {
.sidebar {
display: none; /* Mobilon elrejtve */
}
}
/* Szélesség tartomány */
@media screen and (min-width: 768px) and (max-width: 1023px) {
/* Csak tablet méretben */
}
/* Több feltétel (OR) */
@media screen and (max-width: 600px), print {
/* Kis képernyőn VAGY nyomtatáskor */
}Media típusok
/* all - Minden eszköz (alapértelmezett) */
@media all { }
/* screen - Képernyős eszközök */
@media screen { }
/* print - Nyomtatás */
@media print {
.no-print { display: none; }
body { font-size: 12pt; }
}
/* A screen elhagyható, ha csak szélességet vizsgálsz */
@media (min-width: 768px) {
/* Ugyanaz mint @media screen and (min-width: 768px) */
}Breakpointok (töréspontok) BÓNUSZ
A breakpointok azok a képernyőszélességek, ahol a layout megváltozik.
/* Bootstrap 5 breakpointok */
/* xs: 0-575px (extra small - mobil) */
/* sm: 576px+ (small - nagy mobil) */
/* md: 768px+ (medium - tablet) */
/* lg: 992px+ (large - laptop) */
/* xl: 1200px+ (extra large - desktop) */
/* xxl: 1400px+ (extra extra large) */
/* Mobile-first megközelítés (ajánlott) */
/* Alap: mobil stílusok */
.container {
width: 100%;
padding: 0 15px;
}
/* Tablet (768px+) */
@media (min-width: 768px) {
.container {
max-width: 720px;
margin: 0 auto;
}
}
/* Desktop (992px+) */
@media (min-width: 992px) {
.container {
max-width: 960px;
}
}
/* Nagy desktop (1200px+) */
@media (min-width: 1200px) {
.container {
max-width: 1140px;
}
}Mobile-first vs Desktop-first
- Mobile-first (min-width): Alap stílus mobilra, majd felfelé bővítünk - AJÁNLOTT
- Desktop-first (max-width): Alap stílus desktopra, majd lefelé szűkítünk
- Előny: Mobile-first gyorsabb mobilon (kevesebb felülírás)
CSS változókkal definiált breakpointok
/* Megjegyzés: CSS változók nem használhatók media query-ben!
Csak dokumentációs célra: */
:root {
/* Breakpoint értékek referenciának */
--bp-sm: 576px;
--bp-md: 768px;
--bp-lg: 992px;
--bp-xl: 1200px;
}
/* Media query-ben fix értékeket kell használni */
@media (min-width: 576px) { /* sm */ }
@media (min-width: 768px) { /* md */ }
@media (min-width: 992px) { /* lg */ }
@media (min-width: 1200px) { /* xl */ }Reszponzív egységek BÓNUSZ
/* Százalék (%) - szülőhöz képest */
.half-width {
width: 50%; /* Szülő 50%-a */
}
/* Viewport egységek */
.full-screen {
width: 100vw; /* Viewport szélesség 100%-a */
height: 100vh; /* Viewport magasság 100%-a */
}
.half-viewport {
width: 50vw; /* Viewport fele */
height: 50vh;
}
/* vmin és vmax */
.responsive-square {
width: 50vmin; /* A kisebb viewport méret 50%-a */
height: 50vmin;
}
.large-element {
font-size: 5vmax; /* A nagyobb viewport méret 5%-a */
}
/* rem - Gyökér (html) font-size-hoz képest */
html { font-size: 16px; }
.text {
font-size: 1rem; /* 16px */
padding: 1.5rem; /* 24px */
margin-bottom: 2rem; /* 32px */
}
/* em - Szülő font-size-hoz képest */
.parent {
font-size: 20px;
}
.child {
font-size: 1.5em; /* 30px (20 × 1.5) */
padding: 1em; /* 30px (saját font-size) */
}clamp() - Fluid értékek
/* clamp(minimum, preferált, maximum) */
/* Fluid tipográfia */
h1 {
/* Min 24px, ideális 5vw, max 48px */
font-size: clamp(1.5rem, 5vw, 3rem);
}
p {
font-size: clamp(1rem, 2.5vw, 1.25rem);
}
/* Fluid padding */
.section {
padding: clamp(20px, 5vw, 60px);
}
/* Fluid konténer szélesség */
.container {
width: clamp(320px, 90%, 1200px);
margin: 0 auto;
}
/* Fluid gap */
.grid {
gap: clamp(10px, 2vw, 30px);
}Reszponzív képek BÓNUSZ
/* Alapvető reszponzív kép */
img {
max-width: 100%; /* Nem lehet szélesebb a szülőnél */
height: auto; /* Arányok megőrzése */
}
/* Object-fit: kép illesztése konténerhez */
.image-cover {
width: 100%;
height: 300px;
object-fit: cover; /* Kitölti, levághat */
object-position: center; /* Középre igazít */
}
.image-contain {
object-fit: contain; /* Teljes kép, üres hely maradhat */
}
/* Háttérkép reszponzívan */
.hero {
background-image: url('hero.jpg');
background-size: cover;
background-position: center;
min-height: 50vh;
}
/* Különböző képek különböző méretekhez (HTML) */<!-- srcset: különböző méretű képek -->
<img
src="image-800.jpg"
srcset="
image-400.jpg 400w,
image-800.jpg 800w,
image-1200.jpg 1200w
"
sizes="
(max-width: 600px) 100vw,
(max-width: 1200px) 50vw,
800px
"
alt="Termék kép"
>
<!-- picture: különböző képek különböző eszközökre -->
<picture>
<source media="(min-width: 1200px)" srcset="hero-desktop.jpg">
<source media="(min-width: 768px)" srcset="hero-tablet.jpg">
<img src="hero-mobile.jpg" alt="Hero kép">
</picture>Reszponzív grid rendszer BÓNUSZ
/* Auto-fit/auto-fill: automatikus oszlopok */
.product-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 20px;
}
/* Magyarázat:
- auto-fit: annyi oszlop, amennyi 250px-nél nem kisebb
- minmax(250px, 1fr): min 250px, max 1fr (egyenlő elosztás)
- Automatikusan reszponzív media query nélkül!
*/
/* Fix oszlopszám breakpointokkal */
.grid-fixed {
display: grid;
grid-template-columns: 1fr; /* Mobil: 1 oszlop */
gap: 15px;
}
@media (min-width: 576px) {
.grid-fixed {
grid-template-columns: repeat(2, 1fr); /* 2 oszlop */
}
}
@media (min-width: 992px) {
.grid-fixed {
grid-template-columns: repeat(3, 1fr); /* 3 oszlop */
}
}
@media (min-width: 1200px) {
.grid-fixed {
grid-template-columns: repeat(4, 1fr); /* 4 oszlop */
}
}Reszponzív navigáció BÓNUSZ
<!-- HTML -->
<header class="header">
<div class="logo">Logo</div>
<button class="menu-toggle" aria-label="Menü">☰</button>
<nav class="nav-menu">
<a href="#">Főoldal</a>
<a href="#">Termékek</a>
<a href="#">Kapcsolat</a>
</nav>
</header>
<!-- CSS -->
<style>
.header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 15px 20px;
background: #333;
}
.logo {
color: white;
font-weight: bold;
}
/* Hamburger gomb: csak mobilon látható */
.menu-toggle {
display: block; /* Mobilon látható */
background: none;
border: none;
font-size: 24px;
color: white;
cursor: pointer;
}
/* Mobil navigáció: alapból rejtett */
.nav-menu {
position: absolute;
top: 60px;
left: 0;
right: 0;
background: #333;
display: none; /* Alapból rejtett */
flex-direction: column;
}
.nav-menu.active {
display: flex; /* JavaScript kapcsolja */
}
.nav-menu a {
color: white;
padding: 15px 20px;
text-decoration: none;
border-top: 1px solid #444;
}
/* Desktop: 768px+ */
@media (min-width: 768px) {
.menu-toggle {
display: none; /* Hamburger elrejtése */
}
.nav-menu {
position: static;
display: flex;
flex-direction: row;
background: none;
}
.nav-menu a {
border: none;
padding: 10px 20px;
}
}
</style>Gyakori reszponzív minták BÓNUSZ
/* Mobil: egymás alatt */
.page-layout {
display: flex;
flex-direction: column;
}
.sidebar {
order: 2; /* Sidebar alulra mobilon */
}
.main-content {
order: 1;
}
/* Desktop: egymás mellett */
@media (min-width: 992px) {
.page-layout {
flex-direction: row;
}
.sidebar {
order: 1; /* Sidebar balra */
width: 250px;
flex-shrink: 0;
}
.main-content {
order: 2;
flex-grow: 1;
}
}/* Görgethető táblázat mobilon */
.table-container {
overflow-x: auto;
}
/* Vagy: kártya nézetbe alakítás */
@media (max-width: 768px) {
table, thead, tbody, tr, th, td {
display: block;
}
thead {
display: none; /* Fejléc elrejtése */
}
tr {
margin-bottom: 15px;
border: 1px solid #ddd;
border-radius: 8px;
}
td {
padding: 10px;
text-align: right;
border-bottom: 1px solid #eee;
}
td::before {
content: attr(data-label); /* data-label attribútumból */
float: left;
font-weight: bold;
}
}Összefoglalás
Ebben a cikkben megismerkedtél a reszponzív webdesign alapjaival:
- Viewport meta tag: Mobilbarát megjelenítés alapja
- Media queries: @media (min-width: ...) feltételes CSS
- Breakpointok: 576px, 768px, 992px, 1200px (mobile-first)
- Reszponzív egységek: %, vw, vh, rem, clamp()
- Reszponzív képek: max-width: 100%, object-fit, srcset
- CSS Grid auto-fit: Automatikus reszponzív rács
Következő lépések
Teszteld az oldalad különböző eszközökön: használd a böngésző DevTools responsive módját (F12 → mobil ikon)!
Következő cikk: Átmenetek és animációk - Ismerd meg a CSS transition és animation tulajdonságokat!