<?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; kódování</title>
	<atom:link href="https://www.martinpesout.cz/tag/kodovani/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>Přehlednější definice z-index v jazyce SASS</title>
		<link>https://www.martinpesout.cz/prehlednejsi-definice-z-index-v-jazyce-sass/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=rss</link>
		<comments>https://www.martinpesout.cz/prehlednejsi-definice-z-index-v-jazyce-sass/#comments</comments>
		<pubDate>Mon, 16 May 2016 05:14:41 +0000</pubDate>
		<dc:creator>Martin Pešout</dc:creator>
				<category><![CDATA[Kódování]]></category>
		<category><![CDATA[kódování]]></category>

		<guid isPermaLink="false">http://www.martinpesout.cz/?p=2387</guid>
		<description><![CDATA[CSS vlastnost z-index určuje prioritu při překrývání HTML elementů. Jedná se vlastně o výšku prvku na ose z. Definice se provádí pomocí celého čísla a čím větší číslo prvek dostane, tím více v popředí se bude nacházet. Ať chceme nebo]]></description>
				<content:encoded><![CDATA[<div class="l-submain"><div class="l-submain-h g-html i-cf"><p>CSS vlastnost <code>z-index</code> určuje prioritu při překrývání HTML elementů. Jedná se vlastně o výšku prvku na ose z. Definice se provádí pomocí celého čísla a čím větší číslo prvek dostane, tím více v popředí se bude nacházet. Ať chceme nebo ne, použití vlastnosti <code>z-index</code> se u větších projektů časem nevyhneme. Asi si dokážete představit, že pokud takových definic budeme mít v kódu více, je rázem těžší udržovat správné pořadí. Nehledě na to, že jakákoliv změna pořadí v budoucnu je poměrně pracná a náchylnější na vznik chyb. V tomto článku bych chtěl ukázat jednoduchý trik, jak lze zkrotit definici <code>z-index</code> v jazyce SASS.</p>
<p><span id="more-2387"></span></p>
<p>Celé kouzlo spočívá v tom, že všechny výskyty <code>z-index</code> definujeme pouze na jednom místě v kódu. V SASS k tomuto účelu můžeme použít tzv. <a href="http://sass-lang.com/documentation/file.SASS_REFERENCE.html#maps">mapy</a>. Jedná se o asociativní datový typ, který nám dovoluje definovat více hodnot v rámci jedné proměnné. Každá hodnota má svůj unikátní klíč. Například takto:</p>
<pre class="brush: css; title: ; notranslate">
$colors: (
  primary: #FFBB00,
  secondary: #0969A2,
);
</pre>
<p>Podobně si uložíme do jedné proměnné všechny hodnoty <code>z-index</code>, které na projektu používáme:</p>
<pre class="brush: css; title: ; notranslate">
/**
 * Global definitions for all z-indexes on the web
 */

$layer: (
  disabled-element: 20,
  panel: 950,
  form-bubble: 985,
  header-dropdown: 1100,
  page-sidebar: 1200,
  date-range-picker: 1500,
  modal: 2000,
);
</pre>
<p>Konkrétní hodnotu lze v SASS získat pomocí funkce <a href="http://sass-lang.com/documentation/Sass/Script/Functions.html#map_get-instance_method">map-get</a>, které předáme jako parametr právě námi definovanou mapu <code>$layer</code> a požadovaný klíč.</p>
<pre class="brush: css; title: ; notranslate">
.modal {
  z-index: map-get($layer, modal);
}
</pre>
<p>Já si celý zápis ještě více zjednodušuji pomocí vhodně definované funkce:</p>
<pre class="brush: css; title: ; notranslate">
/**
 * Function for better work with z-indexes;
 */

@function layer($name) {
  @if map-has-key($layer, $name) {
    @return map-get($layer, $name);
  }

  @warn &quot;The key '#{$name}' is not in the map '$layer'&quot;;
  @return null;
};
</pre>
<p>Výhodou použítí této funkce je, že si nemusím pamatovat název proměnné, ve které mám uložené hodnoty <code>z-index</code>. V kódu pak použiji pouze jednoduchý zápis:</p>
<pre class="brush: css; title: ; notranslate">
.modal {
  z-index: layer(modal);
}
</pre>
<p>Díky tomu, že mám všechny hodnoty uložené na jednom místě, se výrazně zjednoduší a zpřehlední všechny budoucí úpravy. Například takové přečíslování hodnot <code>z-index</code> je rázem velice jednoduchý úkon a není třeba pracně procházet celý kód. Upravíme pouze jednu proměnou.</p>
</div></div>]]></content:encoded>
			<wfw:commentRss>https://www.martinpesout.cz/prehlednejsi-definice-z-index-v-jazyce-sass/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Velikosti dotykových oblastí pod drobnohledem</title>
		<link>https://www.martinpesout.cz/velikosti-dotykovych-oblasti-pod-drobnohledem/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=rss</link>
		<comments>https://www.martinpesout.cz/velikosti-dotykovych-oblasti-pod-drobnohledem/#comments</comments>
		<pubDate>Wed, 16 Mar 2016 13:32:12 +0000</pubDate>
		<dc:creator>Martin Pešout</dc:creator>
				<category><![CDATA[Použitelnost]]></category>
		<category><![CDATA[Přístupnost]]></category>
		<category><![CDATA[kódování]]></category>
		<category><![CDATA[použitelnost]]></category>

		<guid isPermaLink="false">http://www.martinpesout.cz/?p=2271</guid>
		<description><![CDATA[Zamýšleli jste se někdy nad tím, jak veliké mají být dotykové prvky, které máte umístěny na webu? Totiž ne každý element, který vytvoříte, je snadno dostupný pro všechny uživatele. Kurzor myši je velice přesný a dokážete s ním zaměřit i]]></description>
				<content:encoded><![CDATA[<div class="l-submain"><div class="l-submain-h g-html i-cf"><p>Zamýšleli jste se někdy nad tím, jak veliké mají být dotykové prvky, které máte umístěny na webu? Totiž ne každý element, který vytvoříte, je snadno dostupný pro všechny uživatele. Kurzor myši je velice přesný a dokážete s ním zaměřit i poměrně malé oblasti. Situace se však změní, když použijete jiné zařízení a zkusíte web ovládat pomocí prstu na tabletu nebo na mobilním telefonu. Pojďme se společně podívat na doporučení, které nám dávají společnosti Google, Apple a Microsoft.<span id="more-2271"></span></p>
<p>Proč ale dát na rady zrovna těchto společností? Google stojí za vznikem operačního systému Android, Apple je tvůrcem iOS a Microsoft má svůj Windows (Phone). Jeden z těchto tří operačních systémů tvoří základ dnešních chytrých telefonů. Aby byla zajištěna dobrá použitelnost webů i na mobilních zařízeních, vydávají tyto společnosti doporučení, jak by měla vypadat ideální velikost dotykových oblastí.</p>
<h2>Dotykové oblasti podle Google</h2>
<p><a href="https://www.google.com/design/spec/layout/metrics-keylines.html#metrics-keylines-touch-target-size">Specifikace Google</a> doporučuje volit rozměry jednotlivých dotykových oblastí alespoň <strong>48 × 48 dp</strong> pro zachování ideální použitelnosti na dotykových zařízeních. Zároveň by měl být dodržen rozestup mezi více dotykovými prvky nejméně 8 dp. Rozměr 48 dp lze přirovnat fyzickému rozměru 9 mm v závisloti na typu displeje.</p>
<p>Jednotka <code>dp</code> je zkratkou pro <a href="https://www.google.com/design/spec/layout/units-measurements.html#units-measurements-density-independent-pixels-dp-">Density-independent pixel</a> &#8211; tzv. pixel nezávislý na hustotě displeje. Setkáme se s ní na zařízeních s operačním systémem Android a využijí ji především vývojáři Android aplikaci. Používá se pro jednotné zobrazení elementů na obrázovkách s rozdílnou hustotou. Pokud však jako frontendista píšete čistě jen CSS, nemusíte si s <code>dp</code> vůbec lámat hlavu. Rovnout můžete místo jednotky <code>dp</code> uváděd <code>px</code>.</p>
<p>Na následujícím obrázku můžete vidět postupně avatar, ikonku a tlačítko. Dotykové oblasti jsou ve všech případech vysoké 48 dp. I v situaci, kdy je tlačítko nadesignované na výšku pouhých 36 dp, měla by být velikost dotykové oblasti podle doporučení Google vysoká alespoň těch zmíněných 48 dp.</p>
<p style="text-align: left;"><img class="alignnone  wp-image-2307" alt="touch-target" src="http://www.martinpesout.cz/wp-content/uploads/2016/01/touch-target.png" width="228" height="501" /></p>
<h2>Dotykové oblasti podle Apple</h2>
<p><a href="https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/MobileHIG/LayoutandAppearance.html">Apple doporučuje</a> volit minimální rozměr dotykových oblástí o velikostech <strong>44 × 44 bodů</strong>. Původně byl tento údaj uváděn v pixelech. Rozměr 44 × 44 pixelů je navržen tak, aby odpovídal ideální velikosti dotykové oblasti na starších iPhone s displejem 3.5&#8220; o rozlišení 320 × 480 px (164ppi). Jakmile však přišel Retina displej, který má dvojnásobnou hustotu (326ppi), upravil Apple zároveň své specifikace a uvádí všude body namísto pixelů. I zde však platí pravidlo, že pokud kódujete pouze CSS styly, můžete všude automaticky uvádět pixely.</p>
<h2>Dotykové oblasti podle Microsoftu</h2>
<p><a href="https://msdn.microsoft.com/en-us/library/windows/apps/hh465326.aspx">Specifikace Microsoftu</a> doporučuje volit minimální rozměr dotykových oblastí o velikostech 9 mm nebo větší. To odpovídá rozměru <strong>48 x 48 pixelů</strong> (na displeji s hustotou pixelů 133ppi). Vyloženě pak upozorňuje, ať se vyvarujete používání oblastí menších než 7 mm. Pokud máte více dotykových prvků vedle sebe, měl by být dodržen rozestup alespoň 2 mm.</p>
<h2>Má cenu řešit až takové detaily?</h2>
<p>Velikost dotykových oblastí se v dnešní době opravdu nevyplácí podceňovat. Malá tlačítka nejvíce překvapí uživatele přistupujícího z mobilního zařízení. Není nic otravnějšího než zkoušet třikrát kliknout na položku v menu a až na třetí pokus se dostat na požadovanou stránku. Jiný problém může nastat v případě, kdy se budete snažit vměstnat více dotykových oblastí vedle sebe. Trefit se pak do správného místa, nemusí být zrovna snadné.</p>
<p>Závěrem bych možná jen zmínil, že když jsem velikosti dotykových oblastí testoval na svých zařízeních, začínal jsem mít znatelné problémy až u rozměrů pod 40 pixelů. Proto bych nedoporučoval volit rozměry menší. Větší oblasti rozhodně přispějí jen k lepší použitelnosti a to ocení především budoucí návštěvníci webu.</p>
<h2>Zdroje</h2>
<ul>
<li><a href="https://www.google.com/design/spec/layout/metrics-keylines.html#metrics-keylines-touch-target-size">Google Design &#8211; Metrics &amp; keylines</a></li>
<li><a href="https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/MobileHIG/LayoutandAppearance.html">iOS Developer Library &#8211; Adaptivity and Layout</a></li>
<li><a href="https://msdn.microsoft.com/en-us/library/windows/apps/hh465326.aspx">Microsoft &#8211; Guidelines for targeting</a></li>
</ul>
<div class="w-actionbox color_alternate controls_aside"><div class="w-actionbox-h"><div class="w-actionbox-text"><h3>Novinky ze světa front-endu</h3><p>Pokud vás zajímají další novinky ze světa front-endu, můžete sledovat můj profil na Twitteru</p></div><div class="w-actionbox-controls at_right"><a class="w-actionbox-button g-btn type_default" href="https://twitter.com/martinpesout"><span>@martinpesout</span></a></div></div></div>
</div></div>]]></content:encoded>
			<wfw:commentRss>https://www.martinpesout.cz/velikosti-dotykovych-oblasti-pod-drobnohledem/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Přidávání a odebírání tříd z SVG elementů pomcí jQuery</title>
		<link>https://www.martinpesout.cz/pridavani-a-odebirani-trid-z-svg-elementu-pomci-jquery/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=rss</link>
		<comments>https://www.martinpesout.cz/pridavani-a-odebirani-trid-z-svg-elementu-pomci-jquery/#comments</comments>
		<pubDate>Thu, 18 Jun 2015 07:37:23 +0000</pubDate>
		<dc:creator>Martin Pešout</dc:creator>
				<category><![CDATA[Kódování]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[kódování]]></category>
		<category><![CDATA[SVG]]></category>

		<guid isPermaLink="false">http://www.martinpesout.cz/?p=2231</guid>
		<description><![CDATA[Nedávno jsem se začal více zaměřovat na práci s SVG souborama a také na tvorbu SVG animací. Specializuju se převážně na UI a nepoužívám žádné složité Javascript frameworky. Dá se říct, že ke spokojenému životu front-end vývojáře si vystačím pouze]]></description>
				<content:encoded><![CDATA[<div class="l-submain"><div class="l-submain-h g-html i-cf"><p>Nedávno jsem se začal více zaměřovat na práci s SVG souborama a také na tvorbu SVG animací. Specializuju se převážně na UI a nepoužívám žádné složité Javascript frameworky. Dá se říct, že ke spokojenému životu front-end vývojáře si vystačím pouze s běžnou knihovnou jQuery. Před nedávnem jsem narazil na zajímavý problém. Potřeboval jsem po kliknutí přidat třídu do SVG elementu na stránce, abych mohl nechat proběhnout CSS3 animaci. Všechny knihovny jsem měl načtené. Nicméně po zavolání <code>$('#js-svg-element').toggleClass('element--animated');</code> se nestalo vůbec nic.<span id="more-2231"></span></p>
<p>Přiznám se, že jsem nad tím strávil dost času, než mně došlo, že bude zakopaný pes někde jinde. Stále jsem si myslel, že chyba musí být ukrytá v mém kódu. Nakonec jsem však našel vysvětelní. Manipulace s třídami v jQuery nefunguje na SVG elementech, protože jQuery k tomuto účelu používá vlastnost <a href="https://developer.mozilla.org/en-US/docs/Web/API/Element/className">className</a>. O konkrétní volání v jQuery se stará tato část kódu <a href="https://github.com/jquery/jquery/blob/53aa87f3bf4284763405f3eb8affff296e55ba4f/src/attributes/classes.js#L29-L32">attributes/classes.js</a></p>
<pre class="brush: jscript; title: ; notranslate">
cur = elem.nodeType === 1 &amp;&amp; ( elem.className ?
    ( &quot; &quot; + elem.className + &quot; &quot; ).replace( rclass, &quot; &quot; ) :
    &quot; &quot;
);
</pre>
<p>Toto volání funguje na běžných HTML elementech. Avšak vlastnost <code>className</code> se na SVG elementu chová trochu jinak. Nevrací totiž běžný string, ale instanci <a href="https://developer.mozilla.org/en-US/docs/Web/API/SVGAnimatedString">SVGAnimatedString</a>.</p>
<p>Autoři jQuery o tomto problému ví, nicméně mají tento problém umístěný na <a href="https://contribute.jquery.org/wont-fix/">seznamu požadavků, které nechtějí řešit</a>. Naštěstí existuje jednoduchý trik, s kterým se dá tento problém obejít:</p>
<h2>jQuery .attr()</h2>
<p>Asi nejjednodušším řešením je použití jQuery metody <code>.attr()</code>:</p>
<pre class="brush: jscript; title: ; notranslate">
/**
 * Místo volání metody .addClass('element--animated')
 */
$('#js-svg-element').attr('class', 'element--animated');

/**
 * Místo volání metody .removeClass('element--animated')
 */
$('#js-svg-element').attr('class', '');
</pre>
<p>Volání metody <code>.attr()</code> nahradí celý atribut <code>class</code>, takže pokud již máte na vybraném elementu nějakou třídu a nechcete o ní přijít, budete muset zápis trochu rozšířit:</p>
<pre class="brush: jscript; title: ; notranslate">
/**
 * Místo volání metody .addClass('element--animated')
 */
var element = $('#js-svg-element');
var classes = element.attr('class');
element.attr('class', classes + ' element--animated');
</pre>
<h2>classList</h2>
<p>Druhým řešením, které jsem našel, je použít <a href="https://developer.mozilla.org/en-US/docs/Web/API/Element/classList">classList</a> dostupný ve <em>Web API Interface</em>. <code>classList</code> je považován jako alternativa k běžnému volání, které vrací string tříd oddělených mezerami. Pro manipulaci s třídami nabízí tři metody: <code>.add</code>, <code>.remove</code> a <code>.toggle</code>.</p>
<pre class="brush: jscript; title: ; notranslate">
// div je objekt, který ukazuje na element &lt;div class=&quot;foo bar&quot;&gt;&lt;/div&gt;
div.classList.remove(&quot;foo&quot;);
div.classList.add(&quot;anotherclass&quot;);

// Pokud je třída visible dostupná, tak ji odebere.
// V opačném případě ji přidá.
div.classList.toggle(&quot;visible&quot;);
</pre>
<p>Bohužel Microsoft tuto možnost <a href="http://caniuse.com/#search=classList">podporuje ve svých prohlížečích velice slabě</a>. Pokud budeme chtít toto volání podporovat pro Internet Explorer 9, je třeba své stránky rozšířit o <em>Javascrit Shim</em>, který nám zajístí potřebnou dostupnost pro IE9 a Opera Mini.</p>
<h2>Závěrem</h2>
<p>Na první pohled je druhé řešení mnohem elegantnější a dovolí nám mnohem kratší zápis. Ale řekněme si na rovinu, že v dnešní době je stále nutné zajišťovat podporu pro prohlížeče Internet Explorer 9. Osobně zastávám názor, že přidávání dalších knihoven (jako <em>Javascript Shim</em>) do projektu mně za tu snahu nestojí. Snažím se totiž držet počet pluginů a závislostí na možném minimu. První řešení pomocí jQuery <code>.attr()</code> je za mě jasným vítězem.</p>
<h2>Zdroje</h2>
<ul>
<li><a href="http://stackoverflow.com/a/29525743">http://stackoverflow.com/a/29525743</a></li>
<li><a href="https://contribute.jquery.org/wont-fix/">jQuery Won&#8217;t Fix</a></li>
<li><a href="http://martinwolf.org/2014/12/11/adding-and-removing-classes-from-svg-elements-with-jquery/">Článek na blogu Martin Wolf</a></li>
<li><a href="http://www.whoishostingthis.com/resources/jquery/">Learn and Master jQuery</a></li>
</ul>
<div class="w-actionbox color_alternate controls_aside"><div class="w-actionbox-h"><div class="w-actionbox-text"><h3>Novinky ze světa front-endu</h3><p>Pokud vás zajímají další novinky ze světa front-endu, můžete sledovat můj profil na Twitteru</p></div><div class="w-actionbox-controls at_right"><a class="w-actionbox-button g-btn type_default" href="https://twitter.com/martinpesout"><span>@martinpesout</span></a></div></div></div>
</div></div>]]></content:encoded>
			<wfw:commentRss>https://www.martinpesout.cz/pridavani-a-odebirani-trid-z-svg-elementu-pomci-jquery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Najděte správné řešení pro vaše selectboxy</title>
		<link>https://www.martinpesout.cz/najdete-spravne-reseni-pro-vase-selectboxy/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=rss</link>
		<comments>https://www.martinpesout.cz/najdete-spravne-reseni-pro-vase-selectboxy/#comments</comments>
		<pubDate>Wed, 05 Nov 2014 23:35:04 +0000</pubDate>
		<dc:creator>Martin Pešout</dc:creator>
				<category><![CDATA[Kódování]]></category>
		<category><![CDATA[knihovny]]></category>
		<category><![CDATA[kódování]]></category>
		<category><![CDATA[UX]]></category>

		<guid isPermaLink="false">http://www.martinpesout.cz/?p=2083</guid>
		<description><![CDATA[K napsání tohoto článku mě vedla dřívější diskuze, kterou jsem otevřel ve skupině Frontedisti.cz na Facebooku. Když jsem se tehdy o danou problematiku zajímal, tak jsem chtěl zjistit, jak přistupují jiní kolegové z oboru k designovnání klasických formulářových selectboxů. Pokud]]></description>
				<content:encoded><![CDATA[<div class="l-submain"><div class="l-submain-h g-html i-cf"><p>K napsání tohoto článku mě vedla dřívější diskuze, kterou jsem otevřel ve skupině <a href="https://www.facebook.com/groups/frontendisti/permalink/1491177374427115/">Frontedisti.cz na Facebooku</a>. Když jsem se tehdy o danou problematiku zajímal, tak jsem chtěl zjistit, jak přistupují jiní kolegové z oboru k designovnání klasických formulářových selectboxů. Pokud jste frontendista, tak se s tímto problémem dříve nebo později setkáte. A záhy zjistíte, že je k dispozici veliké množství různých knihoven, které tento problém řeší. Nicméně pokud chcete být opravdu precizní a postihnout různé případy používání, tak se váš výběr poměrně zužuje. Rád bych v následujícím textu zmínil několik bodů, na které je třeba podle mého názoru pamatovat.</p>
<h2>Začínáme</h2>
<p>Na začátku práce obrží frontendista grafický návrh. Když se zaměřím pouze na selecboxy, tak může být naším cílem vytvořit třeba něco takového:</p>
<p><img class="alignnone size-medium wp-image-2091" alt="Snímek obrazovky 2014-11-03 v 23.55.06" src="http://www.martinpesout.cz/wp-content/uploads/2014/11/Snímek-obrazovky-2014-11-03-v 23.55.06-300x37.png" width="300" height="37" /></p>
<p>Přičemž rozbalená nabídka by měla vypadat následujícím způsobem:</p>
<p><img class="alignnone size-medium wp-image-2107" alt="Snímek obrazovky 2014-11-04 v 1.04.28" src="http://www.martinpesout.cz/wp-content/uploads/2014/11/Snímek-obrazovky-2014-11-04-v 1.04.28-300x133.png" width="300" height="133" /></p>
<p>Cílem práce frontendisty bude, aby takovýto selectbox vypadal ve všech prohlížečích stejně. A to nehledě na to, jestli si budoucí web budeme prohlížet na stolním počítači a nebo na svém mobilu ve vlaku.</p>
<h2>Dnešní doba si (možná) žádá čisté CSS řešení</h2>
<p>Jedním z přístupů by mohlo být překreslení pouze za pomocí kaskádových stylů. U běžných HTML elementů by s tím nebyl problém. Bohužel selecbox se řadí do kategorie tzv. <em>systémových elementů</em> (podobně jako checkbox nebo radio list). Pro nás to znamená, že na takovéto elementy budeme těžko aplikovat vlastní design. Prohlížeč totiž tyto prvky vykresluje podle svých zvyklostí, které jsou dány operačním systémem, na kterém se nacházíte. Situace se sice poslední dobou začíná měnit k lepšímu a frontendistům se otvírá více možností jak stylovat jen za pomocí CSS. Nicméně stále žijeme v době, kdy je třeba pamatovat na starší prohlížeče jako jsou Internet Explorer 9 (případně i verze 8) a další. A každý z nich si tyto prvky vykresluje stále po svém. Firefox nám třeba neumožní překreslit šipku symbolizující možnost rozbalení nabídky a dostaneme následujcí rozbitý výsledek:</p>
<p><img class="alignnone size-medium wp-image-2095" alt="Snímek obrazovky 2014-11-04 v 0.12.28" src="http://www.martinpesout.cz/wp-content/uploads/2014/11/Snímek-obrazovky-2014-11-04-v 0.12.28-300x37.png" width="300" height="37" /></p>
<p>S čistým CSS řešením si tedy nevystačíme.</p>
<h2>Pomožme si Javascriptem</h2>
<p>Ať chcete nebo ne, pokud je třeba sladit selectboxy se zbytkem webu, musíte ještě v dnešní době sáhnout po Javascriptové knihovně. V praxi tyto knihovny fungují tak, že samotný selectbox skryjí a místo něho vytvoří vlastní část HTML kódu, kterou lze pak snadno ostylovat. Pokud si vyberete něco z rozbalovací nabídky nově vzniklého elementu, tak příslušný Javascript změní vybranou hodnotu i ve skrytém selectboxu. Samotný formulář nic nepozná. Při stisknutí potvrzovacího tlačítka se odešlou vždy správné hodnoty. Vše funguje správně jak na stolním počitači, tak na tabletu nebo mobilu.</p>
<h2>V čem je tedy zakopaný pes?</h2>
<p>Problém nastane až v situaci, kdy začneme více přemýšlet nad použitelností na dotykových zařízeních. V případě, že použijeme zmíněné &#8222;obyčejné&#8220; Javascriptové řešení, bude rozbalená nabídka selectboxu vypadat všude stejně. Jak na stolním počítačí, tak i na mobilu. V případě našeho ukázkového řešení dostaneme tedy následující výsledek:</p>
<p><img class="alignnone size-medium wp-image-2107" alt="Snímek obrazovky 2014-11-04 v 1.04.28" src="http://www.martinpesout.cz/wp-content/uploads/2014/11/Snímek-obrazovky-2014-11-04-v 1.04.28-300x133.png" width="300" height="133" /></p>
<p>Pokud na chvilku zapomeneme na náš grafický cíl, kterého chceme dosáhnout, tak <strong>základní neostylovaný selectbox</strong> reaguje i na mobilních zařízeních různým způsobem. Na iPhone telefonu bude výběr hodnoty zobrazen pomocí &#8222;rolovátka&#8220;:</p>
<p><img class="alignnone size-medium wp-image-2100" alt="ZSZh6" src="http://www.martinpesout.cz/wp-content/uploads/2014/11/ZSZh6-156x300.png" width="156" height="300" /></p>
<p>Když budeme chtít vybrat hodnotu na zařízeních s Androidem, uvidíme úplně jiný způsob výběru:</p>
<p><img class="alignnone size-medium wp-image-2101" alt="android-select-correct" src="http://www.martinpesout.cz/wp-content/uploads/2014/11/android-select-correct-186x300.png" width="186" height="300" /></p>
<p>Lze si všimnout, že každý operační systém i napříč mobilními zařízeními, zobrazuje nabídky selectboxů po svém. Výhodou ale je, že takovýto seznam je snadno čitelný a rychlé se ovládá. Vždy je optimálně přizpůsoben zvyklostem na daném zařízení.</p>
<p><strong>Uživatele je zbytečné &#8222;okrádat&#8220; o tento způsob výběru hodnot, na který je zvyklý na svém zařízení.</strong> Nejlepší řešením, které můžete na dotykovém zařízení zvolit, je ostylovat pouze tělo selectboxu, aby zapadalo do vašeho grafického návrhu a rozbalovací nabídku ponechat systémovou. Budeme-li se bavit o mobilu, tak si to můžeme dovolit. Vzhledem k trvanlivosti samotného telefonu má většina uživatelů chytrých telefonů už zařízení, které podporují moderní standardy. Troufnu si říct, že díky tomu na mobilním telefonu netrpíme obdobným problémem jako u klasických prohlížečů.</p>
<p>Ozkoušel jsem si, že není problém přestylovat selectbox pouze pomocí CSS. Pro ostylování naší ukázky postačí něco takového:</p>
<pre class="brush: css; title: ; notranslate">
select {
  box-sizing: border-box;
  display: block;
  padding:  0.375rem 0.4375rem;
  margin:  0 0 0.9375rem 0;
  height: 2.25rem;
  width: 100%;
  max-width: 355px;

  font-family: inherit;
  font-size: 1rem;
  line-height: 1.3125rem;

  appearance: none !important;
  background-color: #fff;
  background-repeat: no-repeat;
  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB8AAAAsCAYAAACdQGM6AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QjVBNTA4NjlEOUQ1MTFFMzhCQkQ4NTYxQjFCRjUyNkUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QjVBNTA4NkFEOUQ1MTFFMzhCQkQ4NTYxQjFCRjUyNkUiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpCNUE1MDg2N0Q5RDUxMUUzOEJCRDg1NjFCMUJGNTI2RSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpCNUE1MDg2OEQ5RDUxMUUzOEJCRDg1NjFCMUJGNTI2RSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PnaZgBgAAACiSURBVHja7NfLCcQgEAbgUQIePVqBBViBBQh24smCbMeDFQniZveUQxKISZCFf8CTI9/4BKmU0tegGY3TxAAOHDhw4MCBA/9ffLmSnHPuKaXTHOccee/Z4zM3xpDW+rBfKUXW2neWXQjBQgi7BXzhGCNJKdlre75XwAg8fOC2BYzCv7jzaWit9Vrr8Pjl1j3lnK0Njwxw4MCBAwcOfE58BBgAnE/QLQwhc+sAAAAASUVORK5CYII=);
  background-position: right center;
  color: #333;
  border: 1px solid #ccc;
  border-radius: 5px;
}
</pre>
<h2>Pojďme oba přistupy zkombinovat</h2>
<p>Co jsem zjistil, lze shrnout do dvou bodů:</p>
<ol>
<li>V běžném prohlížeči si s čistým CSS řešením zatím v dnešní době nevystačíme. Je třeba sáhnout po Javascriptové knihovně, která nám zajistí to, že přestyluju jak samotný selectbox, tak i jeho rozbalovací nabídku.</li>
<li>Na mobilním zařízení by byla škoda zobrazovat přestylovanou rozbalovací nabídku. Z hlediska použitelnosti plně postačí přestylovat pouze tělo selectboxu. A rozbalovací nabídku použít nativní. Na tu je uživatel na daném zařízení zvyklý.</li>
</ol>
<p><img class="alignnone size-medium wp-image-2195" alt="Snímek obrazovky 2014-11-04 v 0.29.12" src="http://www.martinpesout.cz/wp-content/uploads/2014/11/Snímek-obrazovky-2014-11-04-v 0.29.121-300x280.png" width="300" height="280" /></p>
<p>A jde to vůbec oba přísupy zkombinovat? Já tvrdím, že určitě ano. Možností je hned několik.</p>
<p>Pro ty z vás, kteří využívají Boostrap, můžete vyzkoušet třeba oblíbenou knihovnu <a href="https://fk.github.io/select2-bootstrap-css/">Select2</a>. Jediný rozdíl bude v tom, že ji nenačtete pokaždé, ale musíte prvně detekovat přístup z mobilního zařízení. A pokud se na takovém zařízení nacházíte, tak nenačtete Select2, ale ponecháte čístý CSS styl. Pro účely detekce postačí následující jednoduchá Javascriptová podmínka:</p>
<pre class="brush: jscript; title: ; notranslate">
if (window.navigator.appName === &quot;Microsoft Internet Explorer&quot;) {
  return document.documentMode &gt;= 8;
}
if (/iP(od|hone|ad)/i.test(window.navigator.userAgent)) {
  return false;
}
if (/Android/i.test(window.navigator.userAgent)) {
  if (/Mobile/i.test(window.navigator.userAgent)) {
    return false;
  }
}
return true;
</pre>
<p>Kdyby náhodou váše mobilní zařízení i tak podmínkou prošlo, tak nemusíte zoufat. Načte se vám přestylovaný selectbox pomocí Select2 a i nadále bude vše funkční.</p>
<p>Já jsem naštěstí objevil knihovnu, která moje požadavky splňuje na maximum. Jmenuje se <a href="http://harvesthq.github.io/chosen/">Chosen jQuery plugin</a>. A v podstatě je to knihovna, kterou bych považoval v současnosti za vítěze mého hledání. Výše zmíněnou detekci má již v sobě. Jediné co tedy stačí splnit, je několik <a href="http://harvesthq.github.io/chosen/">základních kroků</a> potřebných k instalaci. V balíčku, kteří autoři nabízí ke stažení, naleznete základní kaskádové styly v CSS a také verzi pro SASS. Pokud však používáte LESS či Stylus, tak přepsání kaskádových stylů nezabere mnoho času. Syntax není vůbec složitá.</p>
<h2>Pár slov závěřem</h2>
<p>Rád bych závěrem zmínil, že ve výsledku nezáleží ani tak na použité knihovně. Každému projektu totiž vyhovují jiné nástroje. Já jsem se v tomto článku pokusil vypíchnou několik základních bodů, na které se podle mého názoru v České republice zapomíná. Z mobilních zařízení prohlíží vaše weby stále větší množství lidí. Letos jsem se dokonce stetkal s prvním projektem, kde přístupy lidí z mobílních zařízení mírně přesahují 50% celkové návštěvnosti. A takových webů bude nadále přibývat. Proto prosím nepodceňujte použitelnost vašich selectboxů.</p>
</div></div>]]></content:encoded>
			<wfw:commentRss>https://www.martinpesout.cz/najdete-spravne-reseni-pro-vase-selectboxy/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Animované barevné přechody v CSS</title>
		<link>https://www.martinpesout.cz/animovane-barevne-prechody-v-css/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=rss</link>
		<comments>https://www.martinpesout.cz/animovane-barevne-prechody-v-css/#comments</comments>
		<pubDate>Sat, 04 Jan 2014 13:27:42 +0000</pubDate>
		<dc:creator>Martin Pešout</dc:creator>
				<category><![CDATA[Kódování]]></category>
		<category><![CDATA[animace]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[kódování]]></category>

		<guid isPermaLink="false">http://www.martinpesout.cz/?p=1958</guid>
		<description><![CDATA[Běžný front-end vývojář musí čas od času použít barevné přechody u různých prvků na webové stránce. Typickým příkladem může být třeba barevné talčítko. Jenže rozhodneme-li se přidat k takovému tlačítku animaci, např. při najetí myši ho budeme chtít plynule zesvětlit,]]></description>
				<content:encoded><![CDATA[<div class="l-submain"><div class="l-submain-h g-html i-cf"><p>Běžný front-end vývojář musí čas od času použít barevné přechody u různých prvků na webové stránce. Typickým příkladem může být třeba barevné talčítko. Jenže rozhodneme-li se přidat k takovému tlačítku animaci, např. při najetí myši ho budeme chtít plynule zesvětlit, tak narazíme na problém, protože prohlížeč naší animaci jednoduše ignoruje. V dnešním článku bych rád ukázal zajímavou techniku jen za použití CSS, která problém animovaných přechodů do určité míry řeší.</p>
<h2>Proč problém nastává?</h2>
<p>Aby bylo možné si udělat představu, jak funguje původní neopravené řešení, tak jsem připravil malou ukázku:</p>
<pre class="codepen"data-height="300"data-type="result"data-href="nxqby"data-user="martinpesout"data-safe="true"><code></code><a href="http://codepen.io/martinpesout/pen/nxqby">Check out this Pen!</a></pre><script async src="http://codepen.io/assets/embed/ei.js"></script>
<p>Důvod, proč nelze barevný přechod animovat, je jednoduchý. Podíváme-li se do <a href="http://www.w3.org/TR/css3-transitions/#animatable-properties">specifikace</a>, tak zde uvidíme celou řadu vlastností, na které lze animace použít. Barevné přechody musíme brát jako obrázky, které se renderují přímo v prohlížeči. A právě <code>background-image</code> není v seznamu podporovaných vlastností.</p>
<h2>Jednoduchý trik pro jednoduché animace</h2>
<p>Je sice pravda, že animaci nelze použít na vlastnost <code>background-image</code>, ale je zde stále řada jiných vlastností, které takové omezení nemají. Protože se jedná o jistý druh obrázku, tak máme k dispozici <code>background-size</code> a <code>background-position</code>. A právě <code>background-position</code> již animovat lze. Naleznete jí také v zmíněném <a href="http://www.w3.org/TR/css3-transitions/#animatable-properties">seznamu</a>.</p>
<p>Použijme tedy následující trik. Pozadí (barevný přechod) roztáhneme na výšku pomoci <code>background-size</code> na velikost rovnou dvojnásobku původní velikosti a po najetí myši posuneme celý obrázek o 100% nahoru (tzn. o celý původní rozměr). Zápis v CSS může vypadat následujícím způsobem:</p>
<pre class="brush: css; title: ; notranslate">
.btn {
  background: linear-gradient(#ffce25,#ff9201);
  background-size: auto 200%;
  background-position: 0 100%;
  background-repeat: repeat;
}
</pre>
<p>Nezapomeňte dodržet pořadí zápisu a definovat barevný přechod před změnou jeho velikosti na 200%. Pak už jen zbývá přidat zmíněnou animaci a efekt, který nastane při přejetí myší:</p>
<pre class="brush: css; title: ; notranslate">
.btn {
  transition-property: all;
  transition-duration: 0.25s;
  transition-timing-function: linear;
}

.btn:hover {
  background-position: 0 0;
}
</pre>
<p>Výsledek si můžete prohlédnout zde:</p>
<pre class="codepen"data-height="300"data-type="result"data-href="skAie"data-user="martinpesout"data-safe="true"><code></code><a href="http://codepen.io/martinpesout/pen/skAie">Check out this Pen!</a></pre><script async src="http://codepen.io/assets/embed/ei.js"></script>
<h2>Podpora běžných prohlížečů</h2>
<p>Toto řešení je podporováno u těch prohlížečů, kde je již implementována podpora CSS vlastnosti <code>linear-gradient</code>:</p>
<ul>
<li>Chrome 4+</li>
<li>Firefox 3.6+</li>
<li>Opera 11.1+</li>
<li>Safari 4+</li>
<li>Internet Explorer 10+</li>
</ul>
<p>Více informací naleznete zde <a href="http://caniuse.com/css-gradients">http://caniuse.com/css-gradients</a>.</p>
<p>I když v této ukázce nejsou podporovány starší verze prohlížečů Internet Explorer 8 a 9, tak nemusíme ještě házet flintu do žita. Toto řešení obsahuje jednoduchý fallback a při jejich použití se zobrazí se pouze čísté jednobarevné tlačítko s barvou definovanou u vlastnosti <code>background</code>. Přijdeme sice o animaci a barevný přechod, ale to je jediný rozdíl. Důležité je, že tlačítko neztratí rozměry a barevností zůstane také stejné.</p>
<h2>Závěrem</h2>
<p>Z ukázky lze vidět, že toto jednoduché řešení se hodí pouze na lineární tranformace. Nicméně tyto transformace bývají nejčastější a právě u prvků, jako jsou tlačítka, je využijeme nejvíce. Pokud však někdo z čtenářů objeví lepší a třeba i čistší řešení, budu velice rád, když se o něj podělí v komentářích.</p>
<div class="w-actionbox color_alternate controls_aside"><div class="w-actionbox-h"><div class="w-actionbox-text"><h3>Novinky ze světa front-endu</h3><p>Pokud vás zajímají další novinky ze světa front-endu, můžete sledovat můj profil na Twitteru</p></div><div class="w-actionbox-controls at_right"><a class="w-actionbox-button g-btn type_default" href="https://twitter.com/martinpesout"><span>@martinpesout</span></a></div></div></div>
</div></div>]]></content:encoded>
			<wfw:commentRss>https://www.martinpesout.cz/animovane-barevne-prechody-v-css/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flexbox &#8211; moderní způsob tvorby layoutů</title>
		<link>https://www.martinpesout.cz/flexbox-moderni-zpusob-tvorby-layoutu/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=rss</link>
		<comments>https://www.martinpesout.cz/flexbox-moderni-zpusob-tvorby-layoutu/#comments</comments>
		<pubDate>Sun, 08 Dec 2013 20:43:21 +0000</pubDate>
		<dc:creator>Martin Pešout</dc:creator>
				<category><![CDATA[Kódování]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[flexbox]]></category>
		<category><![CDATA[kódování]]></category>
		<category><![CDATA[layout]]></category>

		<guid isPermaLink="false">http://www.martinpesout.cz/?p=1903</guid>
		<description><![CDATA[Flexbox je nový a velmi mocný nástroj na tvorbu layoutů pomocí CSS. Navíc je zcela odlišný od způsobu, na který jsme tu zvyklý již řadu let. Většina online příruček se zaměřuje na detaily ze samotné specifikace, které bývají dlouhé, složité]]></description>
				<content:encoded><![CDATA[<div class="l-submain"><div class="l-submain-h g-html i-cf"><p><code>Flexbox</code> je nový a velmi mocný nástroj na tvorbu layoutů pomocí CSS. Navíc je zcela odlišný od způsobu, na který jsme tu zvyklý již řadu let. Většina online příruček se zaměřuje na detaily ze samotné specifikace, které bývají dlouhé, složité a těžko srozumitelné. Na druhou stranu je zde poměrně málo informací o tom, jak může být <code>flexbox</code> užitečný fron-end vývojářům při řešení každodenních problémů. Tento článek by měl být takovým úvodem a ukázat možnosti, které nám nabízí při tvorbě layoutu.</p>
<p><code>Flexbox</code> nabízí v základu 3 vlastnosti, které jsou pro design webu podstatné, ale které bylo těžké dlouhou dobu nadefinovat pomocí CSS: zarovnání, rozmístění a pořadí prvků.</p>
<p>Než přistoupím ke konkrétním ukázkám, tak bych rád zmínil několik věcí, které je dobré znát:</p>
<ul>
<li><code>Flexbox</code> prošel třemi vývojovými cykly, než byla stanovena současná definice, kterou nalezneme ve specifikaci. Každá z těchto iterací se vyznačovala odlišným názvem a také odlišným <a href="http://demosthenes.info/blog/217/CSS-Vendor-Prefixes-and-Flags">prefixem</a> pro různé webové prohlížeče. V současnosti se vše ustálilo a nejnovější prohlížeče podporují jeden konečný název bez nutnosti používat prefix. Nicméně podrporovat na novém webu <code>Flexbox</code> pro starší prohlížeče není vůbec snadná věc. Proto při psaní kódu <strong>doporučuji nejprve vše napsat a otestovat pro nejnovější verze prohlížečů</strong> a s použitím finální verze <code>Flexbox</code> a až potom vše ladit pro starší prohlížeče.</li>
<li>I když <code>Flexbox</code> dokáže spolupracovat s ostatními způsoby tvorby layoutů v CSS, tak je většinou vhodnější tyto <strong>původní a zaběhnuté postupy při tvorbě layoutů opustit</strong>. Jde totiž o to, že se nově jedná o odlišný způsob návrhu a práce.</li>
</ul>
<h2>Základní ukázky použití vlastnosti Flexbox</h2>
<p>Mějme 3 jednoduché <code>&lt;div&gt;</code> elementy, které umístíme dovnitř jednoho společného:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;div id=&quot;item-container&quot;&gt;
  &lt;div class=&quot;circle&quot;&gt;&lt;/div&gt;
  &lt;div class=&quot;square&quot;&gt;&lt;/div&gt;
  &lt;div class=&quot;circle&quot;&gt;&lt;/div&gt;
&lt;/div&gt;
</pre>
<p>V CSS nadefinujeme styl tak, aby každý z vnořených <code>&lt;div&gt;</code> elementů vypadal stejně jako název třídy, který nese. Vlastnost <code>display: flex</code> nastavíme na vnější společný <code>&lt;div&gt;</code>:</p>
<pre class="brush: css; title: ; notranslate">
#item-container {
display: flex;
background-color: hsl(34,88%,90%);
}

.square {
height: 200px;
width: 200px;
background-color: hsl(50,88%,50%);
}

.circle {
border-radius: 50%;
width: 150px;
height: 150px;
background-color: hsl(22,88%,50%);
}
</pre>
<p>Výsledek, který dostaneme, vypadá následujícím způsobem:</p>
<p><img class="alignnone size-full wp-image-1925" alt="Snímek obrazovky 2013-12-08 v 19.12.53" src="http://www.martinpesout.cz/wp-content/uploads/2013/12/Snímek-obrazovky-2013-12-08-v 19.12.53.png" width="723" height="194" /></p>
<p>Je potřeba zmínit hned několik důležitých věcí:</p>
<ul>
<li>Nejběžnější vlastnosti &#8222;flex&#8220; se používají na nadřazené elementy v HTML. Proto je také v naší ukázce použita definice u prvků s ID <code>#item-container</code>. Toto bývá často zdrojem nejasností, protože většina webových vývojářů je zvyklá pozicovat až konkrétní vnořené elementy.</li>
<li>&#8222;Block&#8220;, &#8222;inline&#8220;, &#8222;float&#8220; a &#8222;text-align&#8220; nemají žádný význam mluvíme-li o jednotlivých položkách, na které aplikujeme flexbox zarovnání.</li>
<li>Ve výchozím stavu jsou položky zarovnány k levému hornímu rohu nadřazeného elementu.</li>
</ul>
<h2>Další možnosti zarovnání prvků</h2>
<p>Na dalším příkladě si ukážeme, jak změnit horizontální zarovnání jednotlivých položek. Výchozí zarovnání doleva je známo jako <code>flex-start</code>. Zarovnat prvky k pravému okraji můžeme provést následujícím způsobem:</p>
<pre class="brush: css; title: ; notranslate">
#item-container { justify-content: flex-end; }
</pre>
<p><img class="alignnone size-full wp-image-1937" alt="Snímek obrazovky 2013-12-08 v 20.22.08" src="http://www.martinpesout.cz/wp-content/uploads/2013/12/Snímek-obrazovky-2013-12-08-v 20.22.08.png" width="722" height="193" /></p>
<p>Určitě si můžete říkat, že se stále nejedná o nic přelomového. Pojďme si tedy ukázat další možnosti:</p>
<pre class="brush: css; title: ; notranslate">
#item-container { justify-content: center; }
</pre>
<p><img class="alignnone size-full wp-image-1938" alt="Snímek obrazovky 2013-12-08 v 20.26.29" src="http://www.martinpesout.cz/wp-content/uploads/2013/12/Snímek-obrazovky-2013-12-08-v 20.26.29.png" width="722" height="192" /></p>
<p>Toto je už elegantní řešení. Docílit podobného zarovnání použitím tradičního CSS by obvykle vyžadovalo navíc jeden HTML element a další doplňující CSS definice. Nicméně ještě nejsme v ukázkách u konce.</p>
<pre class="brush: css; title: ; notranslate">
#item-container { justify-content: space-between; }
</pre>
<p><img class="alignnone size-full wp-image-1940" alt="Snímek obrazovky 2013-12-08 v 20.32.54" src="http://www.martinpesout.cz/wp-content/uploads/2013/12/Snímek-obrazovky-2013-12-08-v 20.32.54.png" width="723" height="192" /></p>
<p>Můžeme vidět, že prostor mezi prvky se rovnoměrně rozproštřel. Toto nastane pouze v situaci, kdy to aplikujeme na dva a více prvků.</p>
<p>Ještě jednu definici zbývá ukázat:</p>
<pre class="brush: css; title: ; notranslate">
#item-container { justify-content: space-around; }
</pre>
<p><img class="alignnone size-full wp-image-1942" alt="Snímek obrazovky 2013-12-08 v 20.40.35" src="http://www.martinpesout.cz/wp-content/uploads/2013/12/Snímek-obrazovky-2013-12-08-v 20.40.35.png" width="722" height="192" /></p>
<p>Výsledek si lze představit podobně, jako kdyby bylo “margin: 0 auto použito na vše”. Jednotlivé položky jsou opět rovnoměrně rozprostřeny, ale každá zvlášť je navíc vycentrovaná uvnitř přiděleného prostoru.</p>
<p>Tyto ukázky řeší zatím jen horizontální zarovnání. Jaké ale máme možnosti u vertikálního zarovnání?</p>
<pre class="brush: css; title: ; notranslate">
#item-container { justify-content: space-between; align-items: center; }
</pre>
<p><img class="alignnone size-full wp-image-1944" alt="Snímek obrazovky 2013-12-08 v 20.48.42" src="http://www.martinpesout.cz/wp-content/uploads/2013/12/Snímek-obrazovky-2013-12-08-v 20.48.42.png" width="722" height="192" /></p>
<p>Prostřední prvek nemá kolem sebe žádný prostor navíc, protože je ze všech prvků nejvyšší. Zbývající menší prvky jsou rovnoměrně umístěny na středu vzniklého prostoru.</p>
<p>Další možnosti vertikálního zarovnání jsou následující:</p>
<ul>
<li>flex-start &#8211; výchozí nastavení, zarovnání k hornímu okraji obklopujícího HTML elementu</li>
<li>flex-end &#8211; zarovnání k dolnímu okraji obklopujícího HTML elementu</li>
</ul>
<p><code>Flexbox</code> je navíc historicky prvním systémem na tvorbu layoutů, který umožňil definovat pořadí jednotlivých prvků. Pojďme si to ukázat na jednoduchém přikladě: umístíme čtverec před první kruh z naší ukázky:</p>
<pre class="brush: css; title: ; notranslate">
.square { order: -1; }
</pre>
<p><img class="alignnone size-full wp-image-1945" alt="Snímek obrazovky 2013-12-08 v 21.05.08" src="http://www.martinpesout.cz/wp-content/uploads/2013/12/Snímek-obrazovky-2013-12-08-v 21.05.08.png" width="722" height="192" /></p>
<p>Výsledek je úžasný. <code>Flexbox</code> ruší pevně definované pořadí jednotlivých prvků na našich stránkách. Obvykle by totiž pořadí jednotlivých prvků bylo určeno jejich umístěním ve zdrojovém HTML kódu. Dříve by této změny šlo dosáhnout pouze pomocí JavaScriptu. Je důležité si tedy uvědomit, že váš zdrojový HTML kód zůstává nezměněn. Snadno si to můžete ověřit pomocí volby <em>Zobrazit zdrojový kód</em> ve vašem internetovém prohlížeči.</p>
<p><code>Flexbox</code> nám nabízí mnohem víc možností při tvorbě designu webových stránek. V tomto článku jsem se snažil na několika jednoduchých ukázkách demonstrovat sílu tohoto nástroje při zarovnávání, které bylo ještě do nedávna nemožné čistě jen za použití CSS.</p>
<h2>Zdroje</h2>
<ul>
<li><a href="http://demosthenes.info/blog/780/A-Designers-Guide-To-Flexbox">A Designer&#8217;s Guide to Flexbox</a></li>
</ul>
</div></div>]]></content:encoded>
			<wfw:commentRss>https://www.martinpesout.cz/flexbox-moderni-zpusob-tvorby-layoutu/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Tajemství lepšího formátování do bloku</title>
		<link>https://www.martinpesout.cz/tajemstvi-lepsiho-formatovani-do-bloku/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=rss</link>
		<comments>https://www.martinpesout.cz/tajemstvi-lepsiho-formatovani-do-bloku/#comments</comments>
		<pubDate>Fri, 18 Oct 2013 23:33:53 +0000</pubDate>
		<dc:creator>Martin Pešout</dc:creator>
				<category><![CDATA[Kódování]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[kódování]]></category>

		<guid isPermaLink="false">http://beta.martinpesout.cz/?p=1816</guid>
		<description><![CDATA[V tomto příspěvku bych se rád rozepsal o metodice, která je v angličtině popisovaná jako block formatting context. Jednoduše řečeno, jedná se sérii CSS pravidel, které ovlivňují způsob obtékání kolem plovoucích prvků. Trocha specifikace na začátek Když jsem poprvé četl]]></description>
				<content:encoded><![CDATA[<div class="l-submain"><div class="l-submain-h g-html i-cf"><p>V tomto příspěvku bych se rád rozepsal o metodice, která je v angličtině popisovaná jako <strong>block formatting context</strong>. Jednoduše řečeno, jedná se sérii CSS pravidel, které ovlivňují způsob obtékání kolem plovoucích prvků.</p>
<p><span id="more-1816"></span></p>
<h2>Trocha specifikace na začátek</h2>
<p>Když jsem poprvé četl o této metodice, tak se ke mně nejprve dostala <a href="http://www.w3.org/TR/2011/REC-CSS2-20110607/visuren.html#block-formatting">oficiální definice</a>:</p>
<div class="w-testimonial">
						<div class="w-testimonial-h">
							<blockquote>
								<q class="w-testimonial-text"> Floats, absolutely positioned elements, block containers (such as inline-blocks, table-cells, and table-captions) that are not block boxes, and block boxes with &#8218;overflow&#8216; other than &#8218;visible&#8216; (except when that value has been propagated to the viewport) establish new block formatting contexts for their contents. </q>
								<div class="w-testimonial-person">
									<i class="icon-user"></i>
									<span class="w-testimonial-person-name">W3C</span>,
									<span class="w-testimonial-person-meta">CSS 2.1</span>
								</div>
							</blockquote>
						</div>
					</div>
<p>&nbsp;</p>
<p>Pro běžné čtenáře může být tento zápis poměrně nepřehledný a zmatený. Zvažoval jsem tedy, že zde uvedu český přepis, ale díky složitému zápisu by to do celé věci nevneslo moc pořádku. <em>Block formatting context</em> se týká způsobu vykreslování a obtékání prvků na stránce. Vyvoláno bývá jednou z následujících CSS vlastností:</p>
<ul>
<li><code>float: left/right</code></li>
<li><code>overflow: hidden/auto/scroll</code></li>
<li><code>display: table-cell/table-caption</code></li>
<li><code>display: inline-block</code></li>
<li><code><code>position: absolute/fixed</code></code></li>
<li><code>display: flex/inline-flex</code></li>
</ul>
<p>Zkusme si raději celou definici přepsat do lidštější podoby a ukázat na několika příkladech.</p>
<h2>Příklad 1: Jak zabránit zalamování textu?</h2>
<p>Pokud vytváříme webové stránky, tak se nám často stává, že nechceme zalamovat text kolem plovoucího prvku. Typickým příkladem může být vytváření kratičkých sloupců.</p>
<p>Ná následujícím obrázku můžete vidět jednoduché použití vlastnosti <code>float: left</code>. Lze vidět, že pokud je text delší, tak začně obtékat šedý boxík kolem dokola.</p>
<p><img class="alignnone size-full wp-image-1846" alt="ukazka" src="http://www.martinpesout.cz/wp-content/uploads/2013/10/ukazka.jpg" width="650" height="157" /></p>
<p>Co když ale nechceme, aby se text nám zalamoval pod šedým boxíkem? Řešení je velmi jednoduché. Zkusme naše CSS definice mírně upravit</p>
<p><img class="alignnone size-full wp-image-1851" alt="ukazka2" src="http://www.martinpesout.cz/wp-content/uploads/2013/10/ukazka2.jpg" width="650" height="158" /></p>
<p>Všimněte si, že stačilo přidat žulté oblasti vlastnost <code>display: table-cell</code>. V mém přehledu nahoře v textu jsem tuto definici uvedl jako vlastnost, která vyvolává <em>block formatting context</em>. Šírku celé oblasti (v tomto případě 10000px) nastavíme jako šířku celé modré oblasti na obrázku.</p>
<p>Živou ukázku tohoto příkladu si můžete <a href="http://jsbin.com/amarox/4/edit">prohlédnout zde</a>.</p>
<h2>Příklad 2: Vytváření šablony stránky</h2>
<p>Můžeme jít v našem uvažování o trochu dál a využít předchozího příkladu při vytváření celých stránek. Často se stává, že layout připravované stránky počítá s použitím levého či pravého sloupce.</p>
<p><img class="alignnone size-full wp-image-1855" alt="ukazka3" src="http://www.martinpesout.cz/wp-content/uploads/2013/10/ukazka3.jpg" width="650" height="265" /></p>
<p>Hlavní textová část má v CSS definovanou šířku, které odpovídá celé šířce stránky. Navíc přidáme vlastnost <code>display: table-cell</code>. Toto nám dovolí přidávat flexibilní sloupce podle vlastního uvážení. V naší ukázce je vidět sloupec o šířce 300px.  Technika <em>block formatting context</em> je natolik šikovná, že pokud se rozhodneme změnit šírku sloupce např. z 300px na 400px, tak se nemusíme obávat nutnosti přepočítávat ostatní rozměry. Jednoduše změníme šířku levého sloupce a hlavní oblast se nám automaticky přizpůsobí.</p>
<p>Není to jednoduché? Navíc vše funguje i v situacích, kdy se rozhodneme na stránce mít levý i pravý sloupec. Hlavní oblast se nám automaticky přizpůsobí. Ukázku použití tří sloupců si můžete <a href="http://jsbin.com/idohoz/4/edit">prohlédnout zde</a>.</p>
<h2>Zdroje</h2>
<ul>
<li><a href="http://www.youtube.com/watch?v=8YtQwv1cUVs">Fiona Chan &#8211; The secrets of block formatting context</a></li>
<li><a href="http://www.w3.org/TR/2011/REC-CSS2-20110607/visuren.html#block-formatting">W3C definice</a></li>
</ul>
</div></div>]]></content:encoded>
			<wfw:commentRss>https://www.martinpesout.cz/tajemstvi-lepsiho-formatovani-do-bloku/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
