Výška závislá na šířce

Jak v CSS nastavit výšku v závislosti na procentuální i pevné šířce.

4 minuty

Při tvorbě webu, který má být responsivní, se můžeme dostat do situace, kdy je šířka neznámá (zadána v procentech) a výšku potřebujeme takovou, aby se v určitém poměru odvozovala od výšky.

Stanovení výšky podle šířky

Poznámka: Nastavování výšky (height) často značí špatný postup. V případě, že v elementu s natvrdo nastavenou výškou bude nějaký text, je prakticky nemožné zajistit, aby se při různých velikostech písma řádně vešel.

Řešení

Celý trik spočívá v tom, že procentuální hodnota vlastnosti padding se počítá z šířky rodiče. Stačí tedy:

  1. výšku vynulovat (height: 0),
  2. spodní padding nastavit na požadovaný procentuální podíl na šířce,
  3. použít obsahový box model (box-sizing: content-box – výchozí), který sčítá okraje a právě padding připočítává do výsledných rozměrů (výška je ale nulová, takže ji celou zajistí právě padding).
.box {
  height: 0;
  padding-bottom: 25%;
}

Níže uvedený <div> má vždy čtvrtinovou výšku (25 %) oproti šířce, přesvědčte se změnou šířky jeho rodiče.

0 % 100 %

Pevná šířka v pixelech

Je-li potřeba, aby byla výška závislá na šířce, ale ta má být zadaná v pixelech, není to problém. Obal elementu, co má mít výšku podle šířky, zkrátka bude mít rozměry v px. Ukázka.

Proč spodní padding?

Natáhnout výšku je možné i horním paddingem nebo kombinací (padding-top + padding-bottom). V případě samostatného padding-top to však má nevýhodu, že do elementu nepůjde rozumně vkládat obsah, protože celý začátek obsahu zabere právě padding.

Teoreticky to jde řešit odečtením marginu (ukázka) nebo absolutně posicovaným dalším elementem uvnitř (ukázka).

Použít kombinaci může mít smysl právě pro cílené odsazení obsahu shora bez dalšího vnořeného <div>u (ukázka).

Přetečení

V případě, že by se obsah náhodou nevešel do vymezeného prostoru, nabízí se:

  • oříznutí (overflow: hiddenukázka),
  • zobrazení rolovací lišty (overflow: autoukázka), k tomu se ale hodí spíš ono absolutní posicování, jinak by se spodní padding započítal do výšky a vytvořil by ve Webkitu nežádoucí prostor na konci obsahu (ukázka).

Řešení v JavaScriptu

Ve stanoveném podílu lze výšku nastavovat i JavaScriptem. Jako výška se v takovém případě použije vydělená vlastnost clientWidth.

el.style.height = (el.clientWidth / 4) + "px";

Ukázka obou postupů

Co si myslíte o tomto článku?

Diskuse

Související články

CSS item-pack: balance – vyvážené rozložení flex položek

Vlastnost item-pack: balance rozděluje flex položky rovnoměrně mezi řádky, podobně jako text-wrap: balance vyvažuje řádky textu.

11 minut

CSS Container Queries – responsivní komponenty

Jak pomocí @container, container-type a container-name vytvářet komponenty, které se přizpůsobí velikosti svého rodiče místo viewportu.

16 minut

CSS Anchor Positioning – posicování elementů relativně k jiným

Jak pomocí anchor-name, position-anchor a funkce anchor() posicovat elementy relativně k jiným bez JavaScriptu.

6 minut

Centrování na webových stránkách

Moderní způsoby vertikálního i horizontálního centrování v CSS. Flexbox, Grid, margin auto a další techniky.

8 minut

Novinky e-mailem

Když budu mít něco opravdu zajímavého, můžu vám to poslat e-mailem

Přidej se k 500+ čtenářům
Jen kvalitní obsah
Žádný spam

Web jecas.cz píše Bohumil Jahoda, kontakt
Seznam všech článků · Témata · Zkratky
2013–2026