<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Martin Pešout &#187; BEM</title>
	<atom:link href="https://www.martinpesout.cz/tag/bem/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.martinpesout.cz</link>
	<description>Front-end vývojář</description>
	<lastBuildDate>Thu, 26 Jun 2025 22:12:07 +0000</lastBuildDate>
	<language>cs-CZ</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.6</generator>
		<item>
		<title>Metodika BEM</title>
		<link>https://www.martinpesout.cz/metodika-bem/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=rss</link>
		<comments>https://www.martinpesout.cz/metodika-bem/#comments</comments>
		<pubDate>Thu, 10 Apr 2014 23:01:49 +0000</pubDate>
		<dc:creator>Martin Pešout</dc:creator>
				<category><![CDATA[Kódování]]></category>
		<category><![CDATA[BEM]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[metodika]]></category>

		<guid isPermaLink="false">http://www.martinpesout.cz/?p=2029</guid>
		<description><![CDATA[Na začátku minulého roku jsem si říkal, že 2013 bude ve znamení optimalizací. Řada firem totiž vytvářela &#8222;responsivní&#8220; webové stránky, které šlo zobrazit na mobilních zařízeních, ale ve finále byl uživatel stejně nucen stahovat megabajty dat, aby si mohl výsledný]]></description>
				<content:encoded><![CDATA[<div class="l-submain"><div class="l-submain-h g-html i-cf"><p>Na začátku minulého roku jsem si říkal, že 2013 bude ve znamení optimalizací. Řada firem totiž vytvářela &#8222;responsivní&#8220; webové stránky, které šlo zobrazit na mobilních zařízeních, ale ve finále byl uživatel stejně nucen stahovat megabajty dat, aby si mohl výsledný web prohlédnout. Rok poté vidíme, že situace stále není ideální, ale určitá osvěta v tomhle směru už zafungovala. Nicméně objevil se tu ještě jeden problém. Větší poptávka po responsivních webech opět o něco zesložitila vývojářům psaní kaskádových stylů. Minulý rok se tak začalo více hovořit o používání standardů jako jsou <a href="http://oocss.org/">OOCSS</a>, <a href="http://webdesign.tutsplus.com/articles/quick-tip-fix-your-messy-css-with-smacss--webdesign-18489">SMACSS</a> a <a href="http://bem.info/method/">BEM</a>, které mají za cíl zlepšit strukturu psaní CSS. Ve své praxi se mně zatím nejvíce osvědčila metodika BEM. Proto bych rád tento článek věnoval jejím základům a položil tak úvod pro další zajímavé články do budoucna.</p>
<p><span id="more-2029"></span></p>
<h2>Jak tato metodika vznikla?</h2>
<p>Metodika <i>Block Element Modifier</i>, zkráceně BEM, byla poprvé použita ve společnosti <a href="http://company.yandex.com/">Yandex</a> při vývoji robustního interního systému. Na počátku bylo potřeba dosáhnout několika cílů:</p>
<ul>
<li>Najít postup pro rychlý vývoj komponent, které přežijí uvnitř rozrůstajícího se projektu</li>
<li>Znovu použitelnost kódu</li>
<li>Snadná a rychlá pochopitelnost pro nové členy v týmu</li>
</ul>
<p>BEM se tak postupně zformovala po několika letech práce na projektu. Výsledkem je poměrně přísný, ale na druhou stranu velice přehledný způsob pojmenovávání CSS tříd. To dělá tuto metodiku ideální pro vývoj projektů, které bude třeba udržovat i několik let.</p>
<h2>BEM nepoužívá ID selektory</h2>
<p>BEM nepočítá s používáním #ID selektoru v CSS. Já s tímto přístupem naprosto souhlasím a hned vysvětlím proč.</p>
<p>První nevýhodou totiž je, že takovéto elementy není možné znovu použít v kódu. Obečně totiž platí, že na vykreslené HTML stránce musí být každá ID použita pouze jednou. Můžeme sice říct, že naše kaskádové styly se aplikují i v případě, že bude konkrétní ID použito několikrát na stránce. Problém však nastává u JavaScriptu, kde se zohledňuje pouze první výskyt daného ID a dál už se nehledá. To je také důvod, proč použití ID je pro JavaScript rychlejší. Pokud se ale vyhneme tvorbě zbytečně složitých webů, bude tento rozdíl nepatrný.</p>
<p>Druhou větší nevýhodou, je priorita ID selektoru. Důležitější selektor &#8222;přebíjí&#8220; méně důležitý. A právě ID selektory mají vyšší prioritu než běžné třídy u HTML elementů. To je taky důvod proč vznikl v CSS zápis <em>!important</em>. Naštěstí všechno, co dokážeme vyjádřit pomocí ID selektoru, můžeme hezky popsat pomocí běžných tříd. Navíc získáme znovupoužitelné komponenty a právě to je pro tuto metodiku podstatná vlastnost.</p>
<h2>BLOCK, ELEMENT, MODIFIER</h2>
<h3>Základem je blok</h3>
<p>Jednotlivé části webové stránky lze rozdělit do ucelených komponent - <strong>bloků</strong>. Jeden blok tak představuje skupinu prvků sdílejících společné vlastnosti. Příkladem může být například hlavička, patička, hlavní menu, produkt, filtr produktů atd. Ukažme si vše na bloku znázorňujícím hlavičku webové stránky, kterou označíme následující třídou.</p>
<pre class="brush: css; title: ; notranslate">
.header {}
</pre>
<h3>Blok může mít své části</h3>
<p>Samotné bloky se můžou skládat z více součástí &#8211; <strong>elementů</strong>. Aby bylo zřejmé, že tyto části patří k naší komponentě, označíme je pomocí vzoru:</p>
<pre class="brush: css; title: ; notranslate">
.block__element {}
</pre>
<p>V zápisu používáme k odlišení bloku a elementu dvojí podtržítko. Naše ukázková hlavička může obsahovat např. logo, navigaci, vyhledávání.</p>
<pre class="brush: css; title: ; notranslate">
.header__logo {}
.header__nav {}
.header__searchbar {}
</pre>
<h3>Specifické elementy</h3>
<p>Může se stát, že takto vytvořené bloky a elementy budeme potřebovat ještě v určitých situacích modifikovat. K těmto účelům slouží v BEM takzvané <strong>modifikátory</strong>. V zápisu používáme k odlišení dvojí pomlčku:</p>
<pre class="brush: css; title: ; notranslate">
.block--modifier {}
.block__element--modifier {}
</pre>
<p>Pokud si vezmeme náš ukázkový příklad, může být takovým modifikátorem třeba třída, která z naší navigace udělá navigaci fixní:</p>
<pre class="brush: css; title: ; notranslate">
.header__nav--sticky {}
</pre>
<p>Nebo hlavičku roztáhneme na 100% šířky stránky:</p>
<pre class="brush: css; title: ; notranslate">
.header--fullscreen {}
</pre>
<h3>Jak na zápis v HTML?</h3>
<p>Jednotlivé komponenty se můžou dále navzájem prolínat. Náš ukázkový příklad s hlavičkou z předchozího odstavce obohatíme ještě o blok <em>.main-nav</em>, který ponese styly pro hlavní navigaci na webu. Výsledný zápis může vypadat v HTML třeba takto:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;header class=&quot;header header--fullscreen&quot;&gt;
  &lt;a href=&quot;/&quot; class=&quot;header__logo&quot;&gt;&lt;img src=&quot;logo.png&quot; alt=&quot;Logo webu&quot; title=&quot;Velké logo&quot; /&gt;&lt;/a&gt;
  &lt;nav class=&quot;header__nav main-nav&quot;&gt;
    &lt;ul&gt;
      &lt;li class=&quot;main-nav__link&quot;&gt;&lt;a href=&quot;/str1.html&quot;&gt;Stránka 1&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;main-nav__link main-nav__link--active&quot;&gt;&lt;a href=&quot;/str2.html&quot;&gt;Stránka 2&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/nav&gt;
  &lt;form class=&quot;header__searchbar&quot; action=&quot;process.php&quot;&gt;
    &lt;input type=&quot;text&quot; name=&quot;searchtext&quot; /&gt;
    &lt;input type=&quot;submit&quot; value=&quot;Hledat&quot; /&gt;
  &lt;/form&gt;
&lt;/header&gt;
</pre>
<h2>Závěrem</h2>
<p>Pokud jste metodiku BEM ještě nepoužili v praxi, může vám připadat podobný zápis tříd poměrně upovídaný. Ano, názvy tříd jsou o něco delší, nicméně je potřeba se přes to trochu přenést. Až si BEM více osvojíte, tak zjistíte, že vám do vaší práce vnese pořádek a nestane se vám, že byste si začali jednotlivé definice kaskádových stylů mezi sebou omylem přepisovat.</p>
</div></div>]]></content:encoded>
			<wfw:commentRss>https://www.martinpesout.cz/metodika-bem/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>
