Гъвкава кутия или накратко Flexbox е набор от свойства в CSS, въведени през 2009 г., за да осигурят нова, изключителна система за оформление. Модулът Flexbox е идентифициран като част от третата версия на CSS (CSS3).
Вероятно вече използвате много от новите свойства в CSS3, като box-shadow
, border-radius
, фонови градиенти , и така нататък. Flexbox обаче все още не е видял широкото приемане, което заслужава. Това може да се дължи на всички разрушителни промени, които е претърпял през годините, или защото се поддържа само частично в Internet Explorer 10 или просто защото Flexbox е цяла екосистема, докато предишните парадигми са били предимно базирани на единични, готови за go свойства.
node js рамка за пълен стек
Той е супер мощен и предлага широка гама от възможности за постигане на оформления, за които преди това можеше само да се мечтае.
Тази статия ще ви преведе през основите на Flexbox и как можете да го използвате, за да постигнете някои наистина страхотни оформления, които иначе биха изисквали сложни CSS хакове или дори JavaScript.
По подразбиране елементите на ниво блок на HTML се стекат, така че ако искате да ги подравните в ред, трябва да разчитате на CSS свойства като float
или да манипулирате display
свойство с настройки за таблица или вграден блок.
Ако решите да използвате float
(отляво или отдясно), трябва изчистете обвивката в даден момент да го натиснете до последния плаващ елемент, в противен случай те ще преливат над всичко, което идва след това. С float обаче сте ограничени до хоризонтално организиране на елементи.
Като алтернатива или в допълнение можете да манипулирате display
имот, за да се опитате да постигнете оформлението, което желаете! Но това в най-добрия случай често се чувства шумно, да не говорим за досадно и често води до доста крехко оформление, което не е задължително да се показва последователно в браузърите. Този подход е особено неефективен, ако насочвате към множество устройства с различни размери - което почти винаги е така в днешно време.
Въведете Flexbox!
С просто правило, приложено към родителски елемент, можете лесно да контролирате поведението на оформлението на всички негови деца.
С Flexbox можете:
Разбирам, че Flexbox може да е труден в началото. Мисля, че е по-лесно да се научат десет несвързани CSS свойства, отколкото пет с някаква взаимозависимост. Въпреки това, с вашите текущи CSS умения и може би малко помощ от тази статия, вие ще стартирате в нова CSS вселена.
display
е едно от най-основните свойства в CSS и е доста важно в контекста на Flexbox, тъй като се използва за дефиниране на гъвкава обвивка.
Има две възможни стойности на гъвкава обвивка: flex
и inline-flex
.
Разликата между двете е, че a display: flex
обвивката действа като блоков елемент, докато display: inline-flex
обвивката действа като вграден блок. Също така, inline-flex
елементите растат, ако няма достатъчно място за задържане на децата. Но освен тези различия, поведението на двамата би било същото.
Опитайте примерния код по-долу, намалете ширината на прозореца, когато е активен inline-flex и ... превъртете.
Вижте писалката Flexbox @ApeeScape - родител - свойство `display` от DD ( @Diegue ) На CodePen .
.wrapper inline-flex;
След като видяхте първата проба, можете да заключите, че поведението по подразбиране е просто да направите ред от елементите. Но има и още:
Съвет:
column
иcolumn-reverse
стойности могат да се използват за смяна на осите, така че свойствата, които биха повлияли на хоризонталната ос, биха повлияли на вертикалната ос.
Вижте писалката Flexbox @ApeeScape - родител - свойство `flex-direction` от DD ( @Diegue ) На CodePen .
.wrapper row-reverse
Ако проверите първата извадка на код, ще разберете, че дъщерните елементи не се натрупват по подразбиране в гъвкава обвивка. Тук е flex-wrap
влиза в игра:
flex-direction
)wrap
, но броят на редовете (или колоните) нараства в обратна посока, когато елементите се увиватВижте писалката Flexbox @ApeeScape - Родител - свойство `flex-wrap` от DD ( @Diegue ) На CodePen .
.wrapper wrap-reverse;
Можете да комбинирате flex-direction
и flex-wrap
свойства в едно свойство: flex-flow
.
.wrapper { flex-flow: {flex-direction} {flex-wrap}; }
Това свойство се използва за управление на хоризонталното подравняване на дъщерните елементи:
text-align: left
)text-align: right
)text-align: center
)space-around
, с изключение на това, че елементите ще бъдат разделени на същото разстояние и ще има не пространство близо до двата края на обвивката.Забележка: Запомнете
flex-direction
, когато е зададено наcolumn
илиcolumn-reverse
, размества оста. Ако е зададено едно от тях,justify-content
ще повлияе на вертикалното подравняване, а не на хоризонталното.
Вижте писалката Flexbox @ApeeScape - родител - свойство `justify-content` от DD ( @Diegue ) На CodePen .
Това свойство е подобно на justify-content
но контекстът на неговите ефекти са редовете вместо самата обвивка:
Вижте писалката Flexbox @ApeeScape - Родител - свойство `align-items` от DD ( @Diegue ) На CodePen .
Това свойство е подобно на justify-content
и align-items
но работи във вертикалната ос и контекстът е цялата обвивка (не редът като предишния пример). За да видите ефектите му, ще ви трябват повече от един ред:
space-around
, с изключение на това, че елементите ще бъдат разделени на еднакво разстояние и няма да има място в горния и долния ръб на обвивката.Вижте писалката Flexbox @ApeeScape - Родител - свойство `align-content` от DD ( @Diegue ) На CodePen .
Това свойство задава относителния дял от наличното пространство, което елементът трябва да използва. Стойността трябва да е цяло число, където 0 е по подразбиране.
Да предположим, че имате два различни елемента в една и съща гъвкава обвивка. Ако и двете имат flex-grow
на стойност 1, те ще растат еднакво, за да споделят наличното пространство. Но ако някой a flex-grow
стойност 1, а другата a flex-grow
стойност 2, както е показано в примера по-долу, този с flex-grow
стойност 2 ще нарасне, за да заеме два пъти повече място от първата.
как да проектирам shopify уебсайт
.wrapper .elements { flex-grow: 1; /* Default 0 */ } .wrapper .elements:first-child { flex-grow: 2; }
Вижте писалката Flexbox @ApeeScape - Деца - свойство `flex-grow` от DD ( @Diegue ) На CodePen .
Подобно на flex-grow
, това свойство задава дали елементът е „свиваем“ или не с целочислена стойност. Подобно на flex-grow
, flex-shrink
указва коефициента на свиване на гъвкавия елемент.
Вижте писалката Flexbox @ApeeScape - Деца - свойство `flex-shrink` от DD ( @Diegue ) На CodePen .
.wrapper .element { flex-shrink: 1; /* Default 0 */ }
Това свойство се използва за определяне на първоначалния размер на елемент преди разпределянето на наличното пространство и съответните елементи се коригират.
Подсказка:
flex-basis
не поддържаcalc()
иbox-sizing: border-box
във всеки браузър, затова препоръчвам да използватеwidth
ако трябва да използвате един от тях (имайте предвид, че ще трябва да зададете иflex-basis: auto;
).
Вижте писалката Flexbox @ApeeScape - Деца - свойство `flex-basis` от DD ( @Diegue ) На CodePen .
.wrapper .element
Можете да комбинирате flex-grow
, flex-shrink
и flex-basis
свойства в едно свойство: flex
както следва:
.wrapper { flex: {flex-grow} {flex-shrink} {flex-basis}; }
Съвет: Ако планирате да използвате
flex
, не забравяйте да дефинирате всяка отделна стойност (дори ако искате да използвате стойности по подразбиране), защото някои браузъри може да не ги разпознаят (често срещана грешка е свързана с това, че не сте дефиниралиflex-grow
стойност).
Това свойство е подобно на align-items
но ефектът се прилага индивидуално за всеки елемент. Възможните стойности са:
Вижте писалката Flexbox @ApeeScape - Деца - свойство `align-self` от DD ( @Diegue ) На CodePen .
Едно от най-добрите неща, включени във Flexbox, е възможността да пренареждате елементи (използвайки свойството order
), без да е необходимо да модифицирате DOM или да използвате JavaScript. Начинът, по който order
свойството работи е супер просто. По същия начин, по който z-index
контролира реда, в който се показват елементите, order
контролира реда, в който елементите са разположени в обвивката; тоест елементи с по-нисък order
стойност (която между другото може да бъде и отрицателна) се позиционират преди тези с по-висока order
стойност.
Вижте писалката Flexbox @ApeeScape - Деца - свойство `поръчка` от DD ( @Diegue ) На CodePen .
.wrapper .elements { order: 1; /* this one will be positioned second */ } .wrapper .elements:last-child { order: -1; /* this one will be positioned first */ }
Що се отнася до проектирането на оформления, Flexbox разкрива свят от възможности. По-долу можете да намерите някои примерни приложения на свойствата на Flexbox.
С Flexbox можете да подравнявате всичко вертикално, включително няколко елемента наведнъж. Без Flexbox трябваше да използвате техники за позициониране или таблица, които изискват да създадем едно дете, което да съдържа множество елементи. Но с Flexbox можете да оставите тези досадни и крехки техники и просто да дефинирате няколко свойства в обвивката и това е всичко, независимо колко пъти се променя съдържанието в контейнера или вида на промяната!
.wrapper { display: flex; /* always present for Flexbox practices */ flex-direction: column; /* elements stack */ justify-content: center; /* now that flex-direction is a column, the axis are swapped so this centers the content vertically */ min-height: 100vh /* make sure wrapper is taller enough */ }
Вижте писалката Flexbox @ApeeScape - Реални приложения, които можем да дадем - Вертикално подравняване от DD ( @Diegue ) На CodePen .
Оформление „половина / половина“ е оформление с пълна височина с две колони, всяка със съдържание, центрирано вертикално. Обикновено се прилага „над страницата“ (т.е. преди потребителите да превъртят надолу след зареждане на страницата).
Използвайки по-традиционни техники, можете да създадете това оформление с плаващи елементи (с ширина 50% всеки), като изчистите плувките в обвивката („clearfix“ :before
и :after
, overflow: hidden
или whackywith clear: both;
в края). И все пак това е много работа и резултатът не е толкова стабилен, колкото предоставя Flexbox.
В следващия кодов фрагмент ще видите колко лесно е да зададете оформлението, а също и как децата стават също обвивки на Flexbox, тъй като всичко е вертикално подравнено.
Външна обвивка:
.wrapper { display: flex; flex-direction: column; /* only for mobile */ }
Вътрешни обвивки:
.inner-wrapper { flex-grow: 1; /* Allow the element to grow if there is available space */ flex-shrink: 1; /* Elements shrink at the same rate */ flex-basis: 100%; /* Elements will cover the same amount, if is possible the 100% of the width */ }
Вижте писалката Flexbox @ApeeScape - Реални приложения, които можем да дадем - Раздел с полукръвни от DD ( @Diegue ) На CodePen .
Навигационната лента с пълна ширина разпределя пространството еднакво в един и същи ред от навигационните елементи, независимо от броя на елементите.
В примерната по-долу има и някои емблематични бутони без това поведение, демонстриращо, че можете да комбинирате двете по какъвто начин искате. Без Flexbox постигането на този вид оформления щеше да изисква JavaScript код, за да изчисли наличното пространство и след това да го разпредели програмно в зависимост от това кои бутони обхващат и кои не.
къде да науча C програмиране
Flexbox прави това много по-просто.
Свойства на обвивката:
.navbar { display: flex; }
Обхващащи детски свойства:
.navbar-item { flex-grow: 1; /* They will grow */ }
Необхватни дъщерни свойства:
.navbar-other { flex-grow: 0; // They won’t grow }
Вижте писалката Flexbox @ApeeScape - Реални приложения, които можем да дадем - Навигационна лента с пълни кръвопролитни бутони от DD ( @Diegue ) На CodePen .
Колко пъти трябваше да внедрите набор от информационни полета с икони и текст в различни проекти?
Това разпределение на елементите е полезно най-вече при дигиталния маркетинг, но може да има и други приложения при разработването на софтуер. Със силата на Flexbox можете да зададете вид мрежа и също така да подравнявате елементи, независимо колко са.
Свойства на обвивката:
.wrapper { display: flex; flex-wrap: wrap; }
Детски свойства:
.blurb { flex-grow: 0; /* elements don’t grow */ flex-shrink: 0; /* elements don’t shrink in a flexible way */ flex-basis: auto; /* the width of the elements will be set by proportions in `width` due to flex-basis not support workaround */ width: calc(33.33% - 60px); /* calculate proportional width without space taken by padding (workaround for IE 11) */ }
За екрани за преглед на таблети и мобилни устройства ширината варира между 50% и 100%.
Вижте писалката Flexbox @ApeeScape - Реални приложения, които можем да дадем - Blurbs от DD ( @Diegue ) На CodePen .
Синтаксисът за Flexbox се е променял многократно в различните версии на браузъра. Това може да е проблем, когато внедрявате оформление с Flexbox и се опитвате да поддържате по-стари уеб браузъри, особено по-стари версии на Internet Explorer.
За щастие са изброени много техники и заобикалящи решения, за да накарате кода си да работи в най-широкия диапазон от уеб браузъри Flexbugs , което е чудесен ресурс. Ако следвате информацията на този сайт, ще имате по-добри, последователни резултати в различни уеб браузъри.
Префиксните задачи са особено полезни в това отношение. За да автоматизирате префикса на правилата на CSS, можете да изберете един от следните инструменти:
Руби:
Node.js:
Flexbox е чудесен инструмент за ускоряване, полиране и мащабиране на нашата работа. Ограничението е само във въображението на разработчика.
Ако имате нужда от визуална помощ, за да планирате следващото си оформление, можете да изпробвате тази кокетна площадка:
Вижте писалката Flexbox @ApeeScape - детска площадка на Flexbox от DD ( @Diegue ) На CodePen .
Отворете го в a нов прозорец .
С нарастващото приемане на модерни уеб браузъри от повечето потребители, използването на Flexbox ще ви позволи лесно да създавате невероятни оформления, без да е необходимо да се задълбочавате в разхвърлян JavaScript код или да създавате клубен CSS.