Flexbox және Grid: 2017 жылда CSS-вёрсткамен танысу

Мақаладан нені үйренесіздер
- бұрындары CSS-разметкамен қалай жұмыс жасалды;
- ескірген әдістер мен заманауи стандарттар арасындағы айырмашылық;
- жаңа стандарттармен жұмысты қалай бастау керек (Flexbox және Grid);
- сізді бұл жаңа стандарттар неге қызықтыруы керек;
Кіріспе
2012 не 2013 жылдары веб-бағдарламалаумен таныстым. Ақырындап бұл бағытты өздігімше үйрене бастадым. Тез арада CSS көп нәрсеге мағына беретінін түсіндім, бірақ тек интелектуал макеттер жасауда емес. Оны жөндеуге арналған хактардың саны соншалық көп, олардың бәрін үйрену өте қиын.
Бұрындары CSS-разметкамен қалай жұмыс жасалды
1. Тапсырма
Өзімізге қарапайым стандарт тапсырма қояйық: жанама панель және негізгі контент аймағы болатын екі секциядан тұратын бетті қалай жасаймыз. Екі секцияның биіктіктері контенттен тәуелсіз бірдей болуы керек.Мынандай нәтиже алуға ұмтыламыз:


Алдымен бұл тапсырманы ескірген әдіспен қалай орындау керектігін көрсетемін.
2. Екі элементтен тұратын div құрамыз
Мысалы, <aside> және <main>:</p> <body> <aside> Lorem ipsum dolor sit amet. </aside> <main> Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. </main> </body> <p>
Main секциясында мәтін көбірек екені түсінікті.
Aside секциясын көру үшін түспен ерекшелейміз:
aside { color: #fff; background-color: #8cacea; }
3. Екі секцияны қатар қоямыз
Ол үшін мынандай стиль қолданамыз:aside { width: 25%; } main { width: 75%; } aside, main{ float: left; }
Бұл стиль бар кеңістікті пропорцияларға бөліп aside және main үшін float қояды.
Нәтиже:


Float-пен таныс еместер үшін: бұл элементтерді оңға немесе солға жылжытуға көмектесетін салыстырмалы түрде ескі әдіс.
Суретте көрініп тұрғандай, тапсырма әлі орындалмады — жанама панельдің биіктігі негізгі секцияның биіктігімен сәйкес емес.
4. display: table хакын пайдалану
Биіктіктері әр түрлі болып тұрған проблеманы шешу үшін display: table пайдаланамыз.Егер бұл әдіспен таныс болмасаңыз, былай жасау керек:
- Негізгі контейнерді (біздің жағдайымызда body) таблица етеміз:
body { display: table; }
- Float-ты алып тастап aside және main элементтерін таблица ұяшықтары ретінде көрсетеміз:
aside, main{ display: table-cell; }

Ескі әдістер мен жаңа стандарттар арасындағы айырмашылық
Енді сіздерде бұрындары проблема қалай шешілгені жайлы түсінік пайда болған соң, Flexbox және Grid не үшін қажет екендігін қарап көрейік.
Flexbox және Grid — бұл CSS-пішімдеу үшін идеал шешім және заманауи стандарттар. Егер сізге CSS-кодты жақсы деңгейде жазу қажет болса міндетті түрде осыларды үйреніңіз.
Тапсырманы Flexbox пайдалану арқылы шешу
Flexbox форматтау контексті flex-контейнер құру арқылы инициализацияланады.
Негізгі элемент body және ол өзінің ішінде жанама панельді және негізгі аймақты сақтайды. Контейнер құрамыз:
body { display: flex; }
Нәтиже:

Пропорциялар жайлы ұмытпаймыз:
aside { width: 25%; } main { width: 75%; }
Вуаля! Тапсырма шешілді деп есептеуге болады:


Flexbox арқылы әртүрлі нәрселер істеуге болады:
- Секциаларды вертикал ортаға қою:
html, body { height: 100%; } body { align-items: center; }

- Ішкі элементтердің бірінің орналасуын өзгерту:
aside { align-self: center; }

- HTML кодты өзгертпей-ақ элементтердің ретін өзгерту:
aside { order: 2 }

Және мен мұнда Flexbox туралы тек айсберктің ұшын ғана көрсеттім.
Тапсырманы Grid арқылы шешу
CSS Grid — бұл мықты шешім. Жоғарыдағы тапсырманы осы әдіс арқылы да шешіп көрейік.
Басында тура Flexbox жағдайындағыдай бастаймыз. Контейнер құрамыз:
body { display: grid; }
Барлық CSS:
body { display: grid; background-color: #eeeeee; } aside { color: #fff; background-color: #8cacea; }
Нәтижесі:


Grid әзірше барлық браузерде жоқ. Оны қолдану үшін Firefox 52 немесе Chrome 57 браузерлері қажет.
Соңғы суреттің жоғарыдағы суреттерден еш айырмашылығы жоқ. Сонда айырмашылық неде?
Егер жоғарыда жасағандай секцияларды пропорцияларға бөліп көрсек қалай болады екен:
aside { width: 25%; } main { width: 75%; }


Иә, енді нәтиженің айырмашылығы бар, бірақ біздің тапсырмамызға келмейді. Жанама панель әлі бет жанында орналасқан жоқ.
Осы жерде Grid-тің негізгі айырмашылығы көрінеді. Grid-контейнер құрған соң display: grid арқылы контейнер ішіндегі қатарлар мен бағандарды анықтап алу керек.
Былай:
body { grid-template-columns: 30% 70%; }
Бір қатарлық шешім — әдемі, иә? grid-template-columns кестедегі бағандар пропорцияларын анықтайды.

Бірақ Grid арқылы одан да көп нәрселер жасауға болады.
Алдымен өзгерістер айқын көрінуі үшін басты секцияға түс береміз:
main { background-color: rgba(39,174,96 ,1); color: #fff; }


Grid-тің қандай жақсы нәрселері бар екенін қарап көрейік:
- Бағандар арасында бос орын көрсетуге болады:
body { grid-column-gap: 15px; }
- Қанша баған қажет болса сонша баған құруға болады. Жоғарыдағы мысалдар aside және main секцияларынан тұратын екі ғана баған еді. Тағы екеуін қосамыз:
</p> <body> <aside> Lorem ipsum dolor sit amet. </aside> <main> Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. </main> <aside> Lorem ipsum dolor sit amet. </aside> <main> Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. </main> <aside> Lorem ipsum dolor sit amet. </aside> <main> Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. </main> </body> <p>

Қосылған екі баған да 30% / 70% пропорциясына сәйкес.
- Қатарлар арасында бос орын көрсете аламыз:
body { grid-row-gap: 15px; }


Қысқартып: grid-gap: 15 px деп жазуға болады, grid-row-gap және grid-column-gap деп отырудың орнына.
- Қатарлардың өлшемдерін көрсетуге болады:
body { grid-template-rows: 200px 300px 400px; }


Енді бірінші, екінші және үшінші қатардың биіктіктері 200, 300 және 400 пиксель.
Бастапқыда осы да жетіп артады — бірақ бұл бәрі емес.
Жаңа стандартпен жұмыс жасауды қалай бастауға болады?
Flexbox және Grid разметка үшін қолайлы екенін көрдіңіздер. Қалай бастау керек?
Алдымен осы мақаладағы мысалдармен біраз шынығып алуды ұсынамын. Содан кейін күрделірек заттарды үйрене аласыз. Және ұмытпаңыз әлі Grid барлық браузерлерде жоқ.
Сізді бұл жаңа стандарттар неге қызықтыруы керек?
Егер сіз әлі де Flexbox және Grid пайдаланған дұрыс екенін түсінбеген болсаңыз, онда ескі әдістерді пайдалану кезінде пайда болатын проблемаларды келтірейін:
- егер clearfix және float блоктарды пайдаланатын болсаңыз, оларда көптеген проблемалар болуы мүмкіндігін біліп жүріңіз;
- абсолют орналастыру кезінде элементтер бірінің үстіне бірі шығып кетуі мүмкін;
- display: table пайдаланған кезде көп қажет емес разметкалар пайдалануға тура келеді;
- inline-block пайдаланған кезде бос орындармен проблемалар болады.
«How To Approach CSS layouts in 2017 — and beyond» мақаласынан аударма.
-
+1