Horizontální a vertikální vyrovnání prvků. Zarovnání na střed: rozložení CSS
Existuje několik zásadně odlišných způsobů, jak svisle vycentrovat objekt pomocí CSS, ale vybrat ten správný může být složité. Na některé z nich se podíváme a na základě získaných znalostí také vytvoříme malý web.
Vertikální zarovnání na střed pomocí CSS není tak snadné dosáhnout. Existuje mnoho způsobů a ne všechny fungují ve všech prohlížečích. Pojďme se podívat na 5 různých metod a na výhody a nevýhody každé z nich. Příklad.
1. způsob
Tato metoda předpokládá, že nastavujeme nějaký prvek
způsob zobrazení jako tabulku, poté v ní můžeme použít vlastnost vertical-align (která na různých prvcích funguje odlišně).
Některé užitečné informace, které by měly být vycentrovány.
Obsah může dynamicky měnit výšku (výška není definována v CSS).
Obsah není zkrácen, pokud pro něj není dostatek místa.
Mínusy
Nefunguje v IE 7 a nižších
Spousta vnořených značek
2. způsob
Tato metoda využívá absolutní umístění prvku div , který má horní okraj nastaven na 50 % a horní okraj (margin-top) mínus polovinu výšky obsahu. To znamená, že objekt musí mít pevnou výšku, která je definována ve stylech CSS.
Jelikož je výška pevná, můžete nastavit overflow:auto; pro div obsahující obsah, takže pokud se obsah nevejde, zobrazí se posuvníky.
Obsah zde
#content ( pozice: absolutní; nahoře: 50 %; výška: 240 pixelů; margin-top: -120 pixelů; /* mínus polovina výšky */ )
klady
Funguje ve všech prohlížečích.
Žádné další investice.
Mínusy
Když není dostatek místa, obsah zmizí (např. div je uvnitř těla a uživatel zmenší okna, v takovém případě se posuvníky nezobrazí.
3. způsob
Při této metodě obalíme obsahový div jiným div. Nastavte jeho výšku na 50 % (výška: 50 %;) a spodní okraj na polovinu výšky (margin-bottom:-contenttheight;). Obsah se uvolní a bude vycentrován.
Při nedostatku místa (například při zmenšení okna) není obsah oříznut, objeví se posuvníky.
Mínusy
Myslím, že jediné: že je použit další prázdný prvek.
4. metoda.
Tato metoda používá vlastnost position:absolute; pro divy s pevnými rozměry (šířka a výška). Poté nastavíme jeho souřadnice top:0; dole:0; , ale protože má pevnou výšku, nemůže se natáhnout a je vycentrovaný. To je velmi podobné známé metodě horizontálního centrování prvku na úrovni bloku s pevnou šířkou (margin: 0 auto;).
Pokud v kontejneru není dostatek místa, obsah bude oříznut bez posuvníků.
5. metoda
Tuto metodu můžete použít k vystředění jednoho řádku textu. Stačí nastavit výšku textu (line-height) na výšku prvku (height). Poté se čára zobrazí uprostřed.
Nějaký řádek textu
#content( height: 100px; line-height: 100px; )
klady
Funguje ve všech prohlížečích.
Neořízne text, pokud se nevejde.
Mínusy
Funguje pouze s textem (nepracuje s prvky bloku).
Pokud je tam více než jeden řádek textu, vypadá to velmi špatně.
Tato metoda je velmi užitečná pro malé prvky, jako je centrování textu v tlačítku nebo textovém poli.
Nyní, když víte, jak dosáhnout vertikálního zarovnání na střed, pojďme vytvořit jednoduchý web, který bude nakonec vypadat takto:
Krok 1
Vždy je dobré začít sémantickým značením. Naše stránka bude strukturována takto:
#floater (pro vystředění obsahu)
#centred (středový prvek)
#boční
#logo
#nav (seznam
#obsah
#bottom (pro autorská práva a vše)
Napišme následující html označení:
Společnost zaměřená na střed
Společnost
Domov
produkty
Blog
Kontakt
O
Název stránky
Holisticky přepracujte outsourcing s přidanou hodnotou po spolupráci zaměřené na procesy a sdílení nápadů. Energeticky zjednodušte efektní mezery na trhu prostřednictvím povolených imperativů. Holisticky převládejte prémiové inovace po přesvědčivých scénářích. Bezproblémově rekapitulujte vysoké standardy lidského kapitálu pomocí špičkových vyráběných produktů. Výrazně syndikujte schémata vyhovující standardům před robustními vortály. Jedinečně rekapitulujte využitou připravenost webu vis-a-vis předem připraveným informacím.
Nadpis 2
Efektivně přijměte přizpůsobenou webovou připravenost spíše než procesy řízené zákazníky. Asertivně zvyšujte požadavky napříč platformami ve vztahu k proaktivním technologiím. Pohodlně posilujte multidisciplinární metaslužby bez celopodnikových rozhraní. Pohodlně zefektivněte konkurenční strategické tematické oblasti pomocí zaměřených elektronických trhů. Fosfluorescenčně syndikujte komunity světové třídy vis-a-vis s trhy s přidanou hodnotou. Vhodně znovu objevte holistické služby před robustními elektronickými službami.
Upozornění na autorská práva je zde
Krok 2
Nyní napíšeme nejjednodušší CSS pro umístění prvků na stránku. Tento kód byste měli uložit do souboru style.css. Právě na něm je odkaz zapsán v html souboru.
Než budeme moci obsah zarovnat na střed, musíme nastavit výšku těla a html na 100 %. Vzhledem k tomu, že výška je uvažována bez vnitřní a vnější výplně (výplň a okraj), nastavíme je (výplň) na 0, aby nebyly žádné posuvníky.
Spodní výplň pro prvek „floater“ je mínus polovina výšky obsahu (400px), konkrétně -200px ;
Vaše stránka by nyní měla vypadat nějak takto:
Šířka prvku #centered je 80 %. Díky tomu je náš web užší na malých obrazovkách a širší na větších. většina stránek vypadá na nových širokých monitorech v levém horním rohu ošklivě. Vlastnosti min-width a max-width také omezují naši stránku, aby nevypadala příliš široká nebo příliš úzká. Internet Explorer tyto vlastnosti nepodporuje. Musí být nastavena na pevnou šířku.
Protože prvek #centered je nastaven na position:relative , můžeme použít absolutní umístění prvků v něm. Poté nastavte overflow:auto; pro prvek #content, aby se zobrazily posuvníky, pokud se tam nevejde žádný obsah.
Krok 3
A poslední věc, kterou uděláme, je přidat nějaký styl, aby stránka vypadala trochu atraktivněji. Začněme jídelníčkem.
#nav ul ( styl seznamu: žádný; odsazení: 0; okraj: 20px 0 0 0; odsazení textu: 0; ) #nav li ( odsazení: 0; okraj: 3px; ) #nav li a ( zobrazení: blok; background-color: #e8e8e8; padding: 7px; margin: 0; text-decoration: none; color: #000; border-bottom: 1px solid #bbb; text-align: right; ) #nav li a::after ( obsah: """; barva: #aaa; váha písma: tučné; zobrazení: vložené; plovoucí: vpravo; okraj: 0 2px 0 5px; ) #nav li a:hover, #nav li a:focus ( pozadí: # f8f8f8; border-bottom-color: #777; ) #nav li a:hover::after ( margin: 0 0 0 7px; color: #f93; ) #nav li a:active ( padding: 8px 7px 6px 7px; )
První věc, kterou jsme udělali, aby menu vypadalo lépe, bylo odstranění odrážek nastavením atributu list-style:none a také nastavení paddingu a paddingu, protože výchozí hodnoty se mezi prohlížeči značně liší.
Všimněte si, že jsme pak určili, že odkazy by měly být vykresleny jako prvky na úrovni bloku. Nyní jsou při zobrazení roztaženy přes celou šířku prvku, ve kterém se nacházejí.
Další zajímavou věcí, kterou jsme použili pro menu, jsou pseudotřídy :before a :after. Umožňují vám přidat něco před a za prvek. Je to dobrý způsob, jak přidat ikony nebo symboly, jako je šipka na konec každého odkazu. Tento trik nefunguje v aplikaci Internet Explorer 7 a nižší.
Krok 4
A v neposlední řadě do našeho designu přidáme nějaké závoje pro ještě větší krásu.
V těchto stylech jsme prvku #centered nastavili zaoblené rohy. V CSS3 to bude řešit vlastnost border-radius. Toto ještě není implementováno některými prohlížeči, kromě použití předpon -moz a -webkit pro Mozilla Firefox a Safari/Webkit.
Kompatibilita
Jak jste možná uhodli, hlavním zdrojem problémů s kompatibilitou je Internet Explorer:
Prvek #floater musí být nastaven na šířku
Další vycpávky kolem nabídek v IE 6
235881 zobrazení
Obecně platí, že centrování prvků HTML na stránce není obtížný úkol. V některých případech... si weboví vývojáři musí dát hlavu do hlavy, aby našli to nejlepší řešení.
Centrovat prvky horizontálně není tak těžké, vertikálně už vyvolává otázky, ale jejich kombinování obecně může být matoucí. V éře responzivního designu málokdy známe přesné rozměry určitých prvků. Napočítal jsem 6 různých způsobů centrování prvků pomocí CSS. Začněme jednoduchými příklady a skončeme složitějšími. Bude fungovat se stejným HTML kódem:
Aby vše fungovalo správně, je třeba nastavit div na šířku: 100 %. Pro vertikální vystředění prvku použijeme standardní metody nastavením výšky. Funguje všude, včetně IE8+.
Absolutní centrování
Velmi zajímavé řešení. Spočívá v tom, že musíte nastavit výšku vnější nádoby:
Je to velmi jednoduché, můžeme si vypočítat rozměry, které potřebujeme v závislosti na celém rozložení stránky. Výpočty jsou velmi jednoduché, 50 % je středový bod kontejneru, ale naším úkolem je umístit levý horní roh obrázku na tyto souřadnice. Dále odečtěte polovinu výšky a šířky obrázku. Vzorec je:
Doufám, že tyto metody vám postačí k tomu, abyste pro sebe našli to nejlepší řešení.
css,
HTML
Myslím, že mnozí z vás, kteří se zabývali rozvržením, se setkali s potřebou zarovnat prvky svisle a ví, jaké potíže vznikají při zarovnání prvku na střed.
Ano, pro vertikální zarovnání v CSS existuje speciální vlastnost vertical-align s mnoha hodnotami. V praxi to však nefunguje podle očekávání. Zkusme na to přijít.
Porovnejme následující přístupy. Zarovnání s:
stoly,
odsazení,
výška čáry,
protahování,
záporná marže,
přeměnit ,
pseudo prvek
flexbox.
Jako ilustraci uvažujme následující příklad.
Existují dva prvky div, přičemž jeden je vnořen do druhého. Dejme jim příslušné třídy – vnější a vnitřní .
Cílem je zarovnat vnitřní prvek do středu vnějšího prvku.
Pro začátek zvažte případ, kdy jsou velikosti vnějšího a vnitřního bloku známý. Přidejme display: inline-block k vnitřnímu prvku a text-align: center a vertical-align: middle k vnějšímu prvku.
Pamatujte, že zarovnání se vztahuje pouze na prvky, které mají režim zobrazení inline nebo inline-block.
Nastavíme velikosti bloků a také barvy pozadí, abychom viděli jejich okraje.
Vnější ( šířka: 200px; výška: 200px; text-align: center; vertical-align: middle; background-color: #ffc; ) .inner ( display: inline-block; width: 100px; height: 100px; background-color : #fcc ;) Po použití stylů uvidíme, že vnitřní blok je zarovnán vodorovně, ale ne svisle: http://jsfiddle.net/c1bgfffq/
Proč se to stalo? Faktem je, že vlastnost vertical-align ovlivňuje zarovnání prvek samotný, nikoli jeho obsah(kromě případů, kdy je aplikován na buňky tabulky). Použití této vlastnosti na vnější prvek tedy neudělalo nic. Navíc aplikace této vlastnosti na vnitřní prvek také nic neudělá, protože vložené bloky jsou svisle zarovnány se sousedními bloky a v našem případě máme jeden vložený blok.
Existuje několik technik, jak tento problém vyřešit. Podívejme se níže na každý z nich blíže.
Zarovnání s tabulkou
První řešení, které mě napadá, je nahrazení vnějšího bloku tabulkou s jednou buňkou. V tomto případě bude zarovnání aplikováno na obsah buňky, tedy na vnitřní blok.
http://jsfiddle.net/c1bgfffq/1/
Zjevnou nevýhodou tohoto řešení je, že z hlediska sémantiky je chybné používat k zarovnání tabulky. Druhou nevýhodou je, že pro vytvoření tabulky je potřeba přidat kolem vnějšího bloku ještě jeden prvek.
První mínus lze částečně odstranit nahrazením tagů table a td div a nastavením režimu zobrazení tabulky v CSS.
.outer-wrapper ( display: table; ) .outer ( display: table-cell; ) Vnější blok však stále zůstane stolem se všemi z toho vyplývajícími důsledky.
Zarovnání s vycpávkou
Pokud jsou známy výšky vnitřního a vnějšího bloku, lze zarovnání nastavit pomocí svislého vyložení vnitřního bloku pomocí vzorce: (H vnější - H vnitřní) / 2.
Nevýhodou řešení je, že je použitelné pouze v omezeném počtu případů, kdy jsou známé výšky obou bloků.
Zarovnání s výškou čáry
Pokud víte, že vnitřní blok by neměl zabírat více než jeden řádek textu, můžete použít vlastnost line-height a nastavit ji na stejnou výšku vnějšího bloku. Vzhledem k tomu, že obsah vnitřního bloku by se neměl zalamovat do druhého řádku, je doporučeno přidat také pravidla white-space: nowrap a overflow: hidden.
Vnější ( výška: 200px; výška řádku: 200px; ) .vnitřní ( white-space: nowrap; overflow: hidden; ) http://jsfiddle.net/c1bgfffq/12/
Tuto techniku lze také použít k zarovnání víceřádkového textu, pokud přepíšete hodnotu výšky řádku pro vnitřní blok a přidáte zobrazení pravidel: inline-block a vertical-align: middle .
Podstatou této techniky je, že nastavení výšky pro roztažený a absolutně umístěný blok způsobí, že prohlížeč vypočítá vertikální výplň ve stejných poměrech, pokud je jejich hodnota nastavena na auto.
Zarovnání se záporným okrajem-vrchol
Tato metoda se stala široce známou a používá se velmi často. Stejně jako předchozí se použije, když výška vnějšího bloku není známa, ale výška vnitřního bloku je známá.
Musíte nastavit vnější blok na relativní umístění a vnitřní blok na absolutní umístění. Potom musíte posunout vnitřní krabici dolů o polovinu výšky horní části vnější krabice: 50 % a posunout ji nahoru o polovinu její vlastní výšky okraj-horní: -H vnitřní / 2.
Nevýhodou této metody je, že musí být známa výška vnitřní jednotky.
Zarovnání s transformací
Tato metoda je podobná předchozí, ale lze ji použít, když není známa výška vnitřního bloku. V tomto případě můžete místo nastavení záporné výplně v pixelech použít vlastnost transform a zvednout vnitřní rámeček pomocí funkce translateY a hodnoty -50 % .
Proč v předchozí metodě nebylo možné nastavit hodnotu v procentech? Protože procentuální hodnoty vlastnosti margin jsou relativní k rodičovskému prvku, hodnota 50 % by se rovnala polovině výšky vnějšího rámečku a vnitřní rámeček bychom museli zvednout o polovinu jeho vlastní výšky. Přesně k tomu slouží vlastnost transform.
Nevýhodou této metody je, že ji nelze použít, pokud má vnitřní blok absolutní polohování.
Zarovnání s Flexboxem
Nejmodernějším způsobem vertikálního zarovnání je použití flexibilního rozvržení boxu (populárně známého jako Flexbox). Tento modul umožňuje flexibilně ovládat umístění prvků na stránce a umístit je téměř kamkoli. Zarovnání na střed pro Flexbox je velmi jednoduchý úkol.
Vnější blok musí být nastaven na zobrazení: flex a vnitřní blok musí být nastaven na margin: auto. A to je všechno! Krásné, že?
Nevýhodou této metody je, že Flexbox podporují pouze moderní prohlížeče.
Jaký způsob zvolit?
Je třeba vycházet z popisu problému:
Pro vertikální zarovnání textu je lepší použít vertikální odsazení nebo vlastnost line-height.
Pro absolutně umístěné prvky se známou výškou (jako jsou ikony) je ideální přístup záporného okraje.
Pro složitější případy, kdy výška bloku není známa, by se měl použít pseudoelement nebo vlastnost transform.
No, pokud máte to štěstí, že nepotřebujete podporovat starší verze IE, pak je samozřejmě lepší Flexbox.
Velmi často je úkolem zarovnat blok na střed stránky/obrazovky, a to i tak, že bez java skriptu, bez nastavování tvrdých velikostí nebo záporných odsazení, aby posuvníky fungovaly na rodiči, pokud blok svou velikost přesáhne. Na netu je poměrně hodně monotónních příkladů, jak zarovnat blok na střed obrazovky. Většina z nich je zpravidla založena na stejných principech.
Níže jsou uvedeny hlavní způsoby řešení problému, jejich klady a zápory. Pro pochopení podstaty příkladů doporučuji zmenšit výšku / šířku okna Výsledek v příkladech na uvedených odkazech.
Možnost 1. Negativní výplň.
Polohování blok horní a levé atributy o 50 % a s vědomím výšky a šířky bloku předem nastavte záporný okraj, který se rovná polovině velikosti blok. Obrovskou nevýhodou této možnosti je, že musíte počítat záporné odrážky. Taky blok se v prostředí posuvníků chová ne zcela korektně – je jednoduše oříznut, protože má záporné odsazení.
Méně časté, ale podobné prvnímu. Pro blok nastavte šířku a výšku, umístěte horní pravý dolní levý atribut na 0 a nastavte automatický okraj. Výhodou této možnosti jsou funkční posuvníky rodič, pokud má 100% šířku a výšku. Nevýhodou této metody je rigidní dimenzování.
Ptáme se rodič styly tabulky, buň rodič Nastavte zarovnání textu na střed. A blok nastavit model inline bloku. Nevýhodou jsou nefunkční posuvníky a obecně ani estetika „emulace“ tabulky.
Chcete-li k tomuto příkladu přidat svitek, budete muset do struktury přidat ještě jeden prvek. Příklad: jsfiddle.net/serdidg/fk5nqh52/3 .
Možnost 4. Pseudoprvek.
Tato volba postrádá všechny problémy uvedené v předchozích metodách a také řeší původní úlohy. Jde o to mít rodič nastavit styly pseudo prvek dříve, konkrétně 100% výška, zarovnání na střed a inline box model. Stejné s blok vložte model inline bloku, zarovnání na střed. Na blok nespadl pod pseudo prvek když rozměry prvního jsou větší než rodič, upřesněte rodič white-space: nowrap a font-size: 0, po kterém y blok zrušte tyto styly následujícím způsobem - white-space: normal. V tomto příkladu je potřeba font-size: 0, aby se odstranil výsledný prostor mezi rodič A blok v souvislosti s formátováním kódu. Mezeru lze odstranit jinými způsoby, ale považuje se za nejlepší to prostě nedovolit.
Jedním z nejjednodušších a nejelegantnějších způsobů je použití flexboxu. Nevyžaduje zbytečné pohyby těla, zcela jasně popisuje podstatu toho, co se děje, a má vysokou flexibilitu. Jediné, na co je třeba při výběru této metody pamatovat, je podpora IE od verze 10 včetně. caniuse.com/#feat=flexbox
Vhodné v případě, že jsme omezeni strukturou a s rodičovským prvkem nelze nijak manipulovat, ale blok je potřeba nějak zarovnat. Na pomoc přijde funkce translate() css. Hodnota 50 % absolutní pozice umístí levý horní roh rámečku přesně do středu, poté záporná hodnota překladu posune rámeček vzhledem k jeho vlastním rozměrům. Upozorňujeme, že se mohou objevit negativní efekty v podobě rozmazaných okrajů nebo stylu písma. Podobná metoda může také vést k problémům s výpočtem polohy bloku pomocí java-scriptu "a. Někdy, aby se kompenzovala ztráta 50 % šířky v důsledku použití vlastnosti left css, pravidlo nastavené na blok může pomoci: margin-right: -50%; .
Uživatelská možnost kde blok zabalené do knoflíku. Tlačítko má schopnost vycentrovat vše, co je uvnitř, tedy prvky inline a block-line (inline-block) modelu. V praxi to nedoporučuji.
Pomocí myšlenky 4. možnosti můžete nastavit okraje pro blok, a ten se zároveň adekvátně zobrazí v prostředí posuvníků. Příklad: jsfiddle.net/serdidg/nfqg9rza/2 .
Můžete také zarovnat obrázek na střed a pokud je obrázek větší rodič, upravte jej na velikost rodič. Příklad: jsfiddle.net/serdidg/nfqg9rza/3 . Příklad velkého obrázku: