Skip to main content

Flex Items

In CSS Flexbox, flex items are the children of a flex container. These items have specific properties that allow you to control their behavior within the container.

Here are the main properties that can be applied to flex items:

flex-grow

The flex-grow property in CSS Flexbox is a powerful tool for controlling how flex items grow along the main axis when there is extra space available in the flex container.

flex-grow Syntax

The flex-grow property takes a non-negative number as its value, which serves as a "flex grow factor." The default value is 0.

/* Syntax */
flex-grow: <number>; /* default is 0 */

How It Works

The flex-grow property works by distributing extra space along the main axis to flex items based on their flex-grow values. Here's how:

  1. Calculate Extra Space: The flex container first calculates the extra space available along the main axis after placing all flex items with their initial sizes (flex-basis or content size).

  2. Distribute Extra Space: The extra space is then distributed among the flex items in proportion to their flex-grow values.

  3. Grow Items: Each flex item grows by an amount proportional to its flex-grow value, consuming the extra space.

flex-grow Examples

Equal Growth

If all flex items have the same flex-grow value, they will grow equally to fill the extra space.

.flex-item {
flex-grow: 1; /* All items will grow equally */
}

Proportional Growth

If flex items have different flex-grow values, they will grow in proportion to those values.

.flex-item1 {
flex-grow: 1; /* Grows 1 part */
}

.flex-item2 {
flex-grow: 2; /* Grows 2 parts */
}

In this example, flex-item2 will grow twice as much as flex-item1.

flex-grow Best Practices

  1. Avoid Large Values: Using very large flex-grow values can make it difficult to predict how items will grow. Stick to smaller, more manageable numbers.

  2. Responsive Design: Use flex-grow in conjunction with media queries to adapt layouts to different screen sizes.

  3. Readability: When using flex-grow, it's helpful to comment or document why a particular setting is chosen, especially if it deviates from the default 0.

  4. Browser Compatibility: The flex-grow property is well-supported in modern browsers, but always check compatibility if you need to support older versions.

flex-shrink

The flex-shrink property in CSS Flexbox is instrumental for controlling how flex items shrink when the flex container doesn't have enough space to accommodate all items at their initial or base size.

flex-shrink Syntax

The flex-shrink property accepts a non-negative number, which serves as a "flex shrink factor." The default value is 1.

/* Syntax */
flex-shrink: <number>; /* default is 1 */

How It Works

The flex-shrink property operates by distributing the "overflow" or "deficit" space along the main axis among flex items based on their flex-shrink values. Here's the general mechanism:

  1. Calculate Deficit Space: The flex container first calculates the deficit space along the main axis after placing all flex items with their initial sizes (flex-basis or content size).

  2. Distribute Deficit Space: The deficit space is then distributed among the flex items in proportion to their flex-shrink values.

  3. Shrink Items: Each flex item shrinks by an amount proportional to its flex-shrink value, reducing the overflow.

flex-shrink Examples

Equal Shrinkage

If all flex items have the same flex-shrink value, they will shrink equally to fit into the container.

.flex-item {
flex-shrink: 1; /* All items will shrink equally */
}

Proportional Shrinkage

If flex items have different flex-shrink values, they will shrink in proportion to those values.

.flex-item1 {
flex-shrink: 1; /* Shrinks 1 part */
}

.flex-item2 {
flex-shrink: 2; /* Shrinks 2 parts */
}

In this example, flex-item2 will shrink twice as much as flex-item1.

flex-shrink Best Practices

  1. Avoid Zero: Setting flex-shrink to 0 can make an item inflexible in terms of shrinking, which might break layouts on smaller screens.

  2. Responsive Design: Use flex-shrink in combination with media queries to create layouts that adapt to different screen sizes.

  3. Readability: When using flex-shrink, it's advisable to comment or document why a particular setting is chosen, especially if it deviates from the default 1.

  4. Browser Compatibility: The flex-shrink property is well-supported in modern browsers, but always check compatibility if you need to support older versions.

Understanding the flex-shrink property allows you to manage how flex items adapt to space constraints in a flex container, providing a high degree of control for complex layouts.

flex-basis

The flex-basis property in CSS Flexbox sets the initial main size of a flex item before any available space is distributed according to the flex-grow and flex-shrink properties.

flex-basis Syntax

The flex-basis property accepts a length value, a percentage, or the keyword auto. The default value is auto.

/* Syntax */
flex-basis: <length> | <percentage> | auto; /* default is auto */

How It Works

  1. Initial Size: flex-basis sets the initial size of a flex item along the main axis before any space distribution takes place.

  2. Space Distribution: After setting the initial sizes based on flex-basis, the flex container then distributes any remaining or deficit space among the flex items according to their flex-grow and flex-shrink values.

  3. Overrides Width/Height: If flex-basis is set, it will override the width (in a row layout) or height (in a column layout) property of the flex item.

flex-basis Examples

Fixed Basis

Setting a fixed flex-basis value will give the flex item a starting size that won't change unless explicitly allowed to grow or shrink.

.flex-item {
flex-basis: 200px; /* Fixed initial size */
}

Percentage Basis

You can also set flex-basis as a percentage of the flex container's size.

.flex-item {
flex-basis: 50%; /* Takes up half of the container's main axis */
}

Auto Basis

When set to auto, the browser looks at the item's width or height property to determine its base size.

.flex-item {
flex-basis: auto; /* Uses width or height as the initial size */
}

flex-basis Best Practices

  1. Explicit Sizing: Use flex-basis to explicitly set the initial size of flex items, making the layout more predictable.

  2. Responsive Design: Use flex-basis in conjunction with media queries to adapt layouts to different screen sizes.

  3. Readability: Comment or document the rationale behind a particular flex-basis setting, especially if it deviates from the default auto.

  4. Browser Compatibility: The flex-basis property is well-supported in modern browsers, but always check compatibility if you need to support older versions.

flex

The flex property in CSS Flexbox is a shorthand for setting the flex-grow, flex-shrink, and flex-basis properties all at once.

flex Syntax

The flex property can accept up to three values:

/* Syntax */
flex: <flex-grow> <flex-shrink> <flex-basis>;
  • flex-grow: A number that defines how much a flex item will grow relative to other flex items in the container.
  • flex-shrink: A number that defines how much a flex item will shrink relative to other flex items in the container.
  • flex-basis: The initial main size of the flex item before free space is distributed.

flex Default Values

The default value of the flex property is 0 1 auto, which means:

  • flex-grow: 0 (won't grow to fill available space)
  • flex-shrink: 1 (will shrink if needed)
  • flex-basis: auto (will look at width or height properties)

flex Common Usage

1. Equal Distribution

.flex-item {
flex: 1; /* shorthand for flex: 1 1 0% */
}

Here, each flex item will grow and shrink equally to fill the container.

2. Fixed Basis with Growth

.flex-item {
flex: 1 1 200px;
}

Each flex item starts at 200px but will grow to fill any extra space.

3. No Shrink

.flex-item {
flex: 1 0 auto;
}

Flex items will grow to fill the space but won't shrink below their content size.

flex Best Practices

  1. Use Shorthand: Whenever possible, use the flex shorthand to set flex-grow, flex-shrink, and flex-basis together. It makes the code cleaner and easier to understand.

  2. Be Explicit: While it's tempting to use shorthand all the time, there are cases where you might want to be explicit about certain properties for readability and maintainability.

  3. Responsive Design: Use flex in combination with media queries to create layouts that adapt to different screen sizes.

  4. Browser Compatibility: The flex property is well-supported in modern browsers, but always check compatibility if you need to support older versions.

align-self

The align-self property in CSS Flexbox allows you to adjust the alignment of an individual flex item along the cross-axis, overriding the align-items property set on the flex container.

align-self Syntax

The align-self property accepts the following values:

/* Syntax */
align-self: auto | flex-start | flex-end | center | baseline | stretch;
  • auto: Inherits the align-items value from the flex container.
  • flex-start: Aligns the item at the start of the cross-axis.
  • flex-end: Aligns the item at the end of the cross-axis.
  • center: Centers the item along the cross-axis.
  • baseline: Aligns the item based on its baseline.
  • stretch: Stretches the item to fill the cross-axis (default).

How It Works

The align-self property allows you to individually control how a single flex item is aligned along the cross-axis, irrespective of other items in the flex container. This is particularly useful when you want one item to behave differently from its siblings.

align-self Examples

Align to Start

.flex-item {
align-self: flex-start;
}

This will align the flex item at the start of the cross-axis, regardless of the align-items setting on the flex container.

Align to End

.flex-item {
align-self: flex-end;
}

This will align the flex item at the end of the cross-axis.

Center Alignment

.flex-item {
align-self: center;
}

This will center the flex item along the cross-axis.

align-self Best Practices

  1. Selective Use: Use align-self sparingly and only when necessary, as it can make the layout harder to understand if overused.

  2. Fallbacks: Always test the layout in multiple browsers to ensure compatibility, as older browsers may not fully support Flexbox features.

  3. Documentation: If you're using align-self to override the container's align-items, it's a good practice to comment why this is necessary, for better maintainability.

  4. Responsive Design: Consider how align-self will interact with your responsive design, especially if you're using media queries to adjust the layout for different screen sizes.

order

The order property in CSS Flexbox allows you to control the order in which flex items appear within a flex container, overriding their natural order in the HTML markup.

order Syntax

The order property accepts an integer value, positive or negative:

/* Syntax */
order: <integer>; /* default is 0 */

How It Works

  1. Default Order: By default, all flex items have an order value of 0, which means they appear in the order they are placed in the HTML markup.

  2. Reordering: Setting the order property to a different integer value will rearrange the items within the flex container based on ascending numerical value.

  3. Same Order Value: If multiple items have the same order value, they will appear in their original order relative to each other.

order Examples

Basic Reordering

/* HTML */
<div class="flex-container">
<div class="flex-item item1">1</div>
<div class="flex-item item2">2</div>
<div class="flex-item item3">3</div>
</div>

/* CSS */
.item1 { order: 2; }
.item2 { order: 3; }
.item3 { order: 1; }

In this example, the items will appear in the order 3, 1, 2, based on their order values.

Negative Order

.item1 { order: -1; }

Setting a negative order value will move the item towards the beginning of the flex container.

order Best Practices

  1. Semantic HTML: Use order judiciously to maintain the semantic integrity of your HTML. Changing the visual order should not confuse the user or affect accessibility.

  2. Readability: If you're using order to significantly change the layout, add comments to explain why this is necessary for better code maintainability.

  3. Responsive Design: The order property can be particularly useful in responsive designs where you may want to rearrange items for different screen sizes using media queries.

  4. Browser Compatibility: The order property is well-supported in modern browsers, but always check compatibility if you need to support older versions.