Introduction
During styling, we face a lot of problems daily like how to put your element in the right bottom corner and a perfect center, or how to make sure that all your columns have the same height, or when we make a list view in mobile from zig-zag content, etc. So all the problems can be solved in an easy and smart way by FLEXBOX.
A FLEXBOX is a smart way to align elements in a flex parent container in such a way that their position is automatically adjusted as we want and predict. It was introduced in css3 and is a pretty powerful tool for making complex UI in a small amount of CSS style code. So the question is how to use it. Here are some examples, and in the end you'll find some HTML-CSS code for making responsive masonry and product views for your website.
Start by making a class flex-container in style.css and use it anywhere. After applying flex all elements are adjusted in a row.
- .flex-container{
- display: flex;
- }
Now you can use it as any parent element for any particular child element.
- <div class="flex-container">
- //CHILD COMPONENTS OR ELEMENTS
- </div>
FLEX PARENT ELEMENT PROPERTIES
- FLEX-DIRECTION - defines in which direction flex wants to stack the flex items
- FLEX-WRAP - defines whether flex items should be wrapped in the parent element or not
- FLEX-FLOW - a combination of flex-direction and flex-wrap properties
- JUSTIFY-CONTENT - to align your flex items horizontally
- ALIGN-ITEMS - to align your flex items group vertically
- ALIGN-CONTENT - used to align the flex lines; i.e., what are the positions of all the items vertically
FLEX-DIRECTION
This property helps us know in which direction the children elements are stacked. So, take an example of the map that has four directions North, East, West, and South. So, in that case, we have four directions too i.e.:
- Top->Bottom ( COLUMN )
- Bottom->Top ( COLUMN-REVERSE )
- Left->Right ( ROW ) and this is the default value
- Right->Left. ( ROW-REVERSE )
Note
If we use COLUMN or COLUMN-REVERSE in FLEX-DIRECTION property JUSTIFY-CONTENT and ALIGN-ITEMS & ALIGN-CONTENT properties will be swapped.
FLEX-WRAP
This property defines if we want to wrap the content in the parent section; i.e., flex-container or not, or in reverse format. It has only three values.
- WRAP -> all elements are wrapped inside the container so that when the sum of width and margin of all child elements is greater than the width of parent container then the next element is placed automatically in the next row.
- NOWRAP -> It's the default value, in which elements will be placed one after another in a single row or column
- WRAP-REVERSE -> It is the same as WRAP value but the only difference is that its direction is reverse i.e. 1-2-3-4 to 4-3-2-1.
FLEX-FLOW
This property will save us from writing two properties; i.e. saving line of codes. It helps us to write to properties at the same time.
FLEX-FLOW = FLEX-DIRECTION + FLEX-WRAP
eg. FLEX-FLOW: COLUMN WRAP-REVERSE;
JUSTIFY-CONTENT
This is a useful property if you want to place child elements in a symmetrical way in a horizontal direction; i.e., left to right or right to left but if the value of FLEX-DIRECTION is COLUMN or COLUMN-REVERSE then its direction will be top-bottom or bottom-top.
Its values are,
- FLEX-START: arrange all elements to the starting position in flex line horizontally
- FLEX-END: arrange all elements to the ending position in flex line horizontally
- CENTER: arrange all elements to the center position in flex line horizontally
- SPACE-AROUND: arrange all elements in such a way that all elements will cover all the container lines, but there is a space between them, starting and ending point calculated by flex
- SPACE-BETWEEN: same as SPACE-AROUND but with no space between them.
ALIGN-ITEMS
If another row of elements is added then the flex container is divided into the half container from top to bottom.
- FLEX-START: arrange the element line for starting position in flex line vertically i.e in a row
- FLEX-END: arrange the element line for ending position in flex line vertically i.e in a row
- CENTER: arrange the element line for the center position in flex line vertically i.e in a row
- STRETCH: arrange the element line for starting position in the flex line and stretch them at the bottom of the container vertically.
- BASELINE: arrange the element line in such a way that they are adjusted in their baseline no matter how small or large that element is.
ALIGN-CONTENT
That CSS3 property is applied to the element group for their position in the container vertically.
- FLEX-START: arrange the element group to the starting position in flex line vertically; i.e in a row
- FLEX-END: arrange the element group to the ending position in flex line vertically; i.e in a row
- CENTER: arrange the element group to the center position in flex line vertically; i.e in a row
- STRETCH: arrange the element group for starting position in the flex line and stretch them at the bottom of the container vertically.
- SPACE-BETWEEN: arrange the element group in such a way that they take place at starting position and center position (if two rows of elements ) and then their position is adjusted equally at both starting and ending points.
- SPACE-AROUND: same as above but there is space added at the start and end of the child element.
FLEX CHILD ELEMENT PROPERTIES
- ORDER - specify the order of the items in the form of natural numbers
- FLEX-GROW - specify how much flex item will grow as compared to other items. The default value of flex-grow is 0.
- FLEX-SHRINK - specify how much flex item will shrink as compared to other items. The default value of flex-shrink is 0 too.
- FLEX-BASIS - specify the length of a flex item
- FLEX - a combination of FLEX-GROW, FLEX-SHRINK, FLEX-BASIS
- ALIGN-SELF: It aligns a particular item inside a flex-container
SOME AWESOME EXAMPLES OF FLEX
Perfect Center
It's a div block that will stay at the center of the parent element.
How to get a perfect center?
So without using the flex way:
- parent{
- position: relative;
- width: 100%;
- height: 500px;
- }
-
- child{
- background-color: #666;
- position: absolute;
- width: 40px;
- height: 40px;
- left: 50%;
- top: 50%;
- transform: translate(-50%, -50%);
- }
Pretty big, right?
Let's do it in the flex way:
- parent{
- display: flex; // 1
- justify-content: center; // 2
- align-items: center; // 3
- width: 100%;
- height: 500px;
- }
-
- child{
- width: 40px;
- height: 40px;
- background-color: #666;
- }
AND DONE...
Result
Another concept of flexbox is to convert the zig-zag content of desktop to top-down content of the mobile view. So for this concept without flexbox, we have to write a lot of CSS and even js too. But with flexbox, everything is solved in some lines,
In this article, we studied "Flexbox" CSS.