CSS Grid is a powerful tool for web developers, and one of its key features is the ability to use `fit-content` to automatically size elements. This can be especially useful for responsive design.
To use `fit-content` effectively, it's essential to understand how it interacts with the grid container's `grid-template-columns` property. As we saw in the examples, `fit-content` can be used to automatically size grid items based on their content.
In general, it's a good idea to use `fit-content` in conjunction with `grid-template-columns` to create a flexible and responsive grid layout. This allows you to take advantage of the full potential of CSS Grid.
By following these best practices, you can create more efficient and effective grid layouts that adapt to different screen sizes and devices.
Grid Sizing
Grid sizing is a crucial aspect of CSS Grid, and there are several ways to achieve the desired effect. You can use length units like px or rem, but also keywords like min-content, max-content, and auto.
The fit-content() function is a game-changer for grid sizing. It uses the space available, but never less than min-content and never more than max-content. This means that the track will become as wide as the content requires, but will not exceed a certain maximum size.
You can also use the minmax() function to set a minimum and maximum value for the length of a track. This is useful for preventing columns from shrinking too far. For example, you can use minmax(10em, 20em) to set a minimum width of 10em and a maximum width of 20em.
Here's a summary of the intrinsic sizing keywords:
- min-content: makes a track as small as possible without overflowing
- max-content: makes a track as wide as possible for the content
- fit-content(): makes a track as wide as possible, but never larger than a specified size
These keywords are useful for creating flexible and responsive grid layouts. By using them, you can create grid tracks that adapt to the content and the available space.
Auto-Fill
Auto-Fill is a game-changer for grid layouts. It allows you to display as many columns of a certain size as would fit into a row of a grid container, without specifying a fixed number of repetitions.
The two keywords, auto-fill and auto-fit, are pretty similar. Both try to automatically fit as many grid items as possible into a grid column before wrapping to a new line. However, auto-fill fills as many columns as it can and, when it runs out of items, it leaves whatever space is leftover empty.
Here are the key things to keep in mind when using auto-fill:
- It does not accept intrinsic or flexible length values (e.g. fr units) when using auto-fill or auto-fit.
- It is okay to use an intrinsic or flexible sizing as the function's second value as long as the first value is a positive number.
- It can only be used once in the grid-template-columns track list when using auto-fill or auto-fit.
One of the benefits of using auto-fill is that it creates a useful pattern with grid layout, allowing you to create as many column tracks as will fit in your container. However, the tracks are not flexible, and you will get a gap on the end until there is enough space for another track.
Automatically Sizing Columns
Automatically sizing columns can be a real game-changer for your web design. You can use the grid-template-columns property to automatically fit columns into a row, as shown in this snippet from Stephanie Eckles' Smol CSS website: grid-template-columns: repeat(auto-fill, minmax(15em, 1fr)).
This will create columns that are about one-third on larger screens, half on mid-sized screens, and single column on small ones. It's a great way to have the grid figure out the column sizes for you, without having to specify each one individually.
The repeat() function is a powerful tool in CSS Grid, allowing you to repeat a value a specified number of times. In this case, auto-fill is used to fit as many columns as possible into the row, and minmax(15em, 1fr) sets the minimum and maximum size of each column.
Here's a breakdown of the repeat() function:
- auto-fill: Fit as many columns as possible into the row, even if they are empty.
- auto-fit: Fit whatever columns there are into the space, expanding columns to fill space rather than leaving empty columns.
The difference between auto-fill and auto-fit is subtle, but important. Auto-fill will leave empty space in the row, while auto-fit will adjust the column sizes to fill the available space.
You can use the repeat() function with a fixed number of repetitions, or with the auto-fill and auto-fit keywords. Just remember that auto-fill and auto-fit can only be used once in the grid-template-columns track list, and they require an explicit track size to calculate the number of columns.
By using the grid-template-columns property and the repeat() function, you can create automatically sized columns that adapt to different screen sizes and devices. It's a great way to create responsive and flexible web designs that look great on any device.
Grid Layout
Grid layout is a powerful tool for creating flexible and responsive designs.
You can use CSS Grid to create a dynamic number of columns that fill the available space of a grid row, by combining repeat(), auto-fit, and minmax().
This allows you to pack in as many columns as possible before the grid wraps to a new line, making it perfect for layouts where you need to accommodate varying amounts of content.
With CSS Grid, you can also align form elements, such as input labels and text inputs, by using display: grid and setting the left column to display at max-content and the right column to take up the rest of the space.
This helps to create a neatly stacked form, even when the labels are uneven.
Rows and Columns
A grid layout is made up of rows and columns, and to create a basic grid, you can define a grid with three column tracks, two row tracks, and a 10 pixel gap between the tracks.
Each track uses a different length unit, and tracks are auto sized by default. A track using a length unit will be as big as the content. The grid can be thought of as a container with child items that lay out on it.
To create a 12 column track grid with equal columns, you can use the CSS code with the fr unit to size the grid's columns, and then supply a zero value in minmax() functions for each column.
The grid overlay in Chrome DevTools can help you understand the various parts of the grid, including the line numbers on your grid.
Aligning Forms Elements
Aligning forms elements can be a real challenge, especially when dealing with uneven labels and inputs. The classic case is a form with stacked text inputs where the input label is on the left and the input is on the right.
With CSS Grid, we can use the max-content property to tell the left column to display at its maximum content width. This ensures that the labels are evenly spaced.
Imagine a form with multiple labels and inputs - using max-content can save you a lot of time and frustration.
By setting the right column to take up the rest of the space, we can create a neatly stacked form that's easy on the eyes.
Grid Alignment
Grid alignment is crucial when working with CSS Grid, especially when your grid items are sized with non-flexible units like pixels. You can set the alignment of the grid within the grid container using the align-content property.
The align-content property aligns the grid along the block (column) axis, as opposed to justify-content which aligns the grid along the inline (row) axis. This is useful when the total size of your grid is less than the size of its grid container.
You can use the following values for align-content:
- start β aligns the grid to be flush with the start edge of the grid container
- end β aligns the grid to be flush with the end edge of the grid container
- center β aligns the grid in the center of the grid container
- stretch β resizes the grid items to allow the grid to fill the full height of the grid container
- space-around β places an even amount of space between each grid item, with half-sized spaces on the far ends
- space-between β places an even amount of space between each grid item, with no space at the far ends
- space-evenly β places an even amount of space between each grid item, including the far ends
Alternatively, you can use the align-items property to align grid items along the block (column) axis. This value applies to all grid items inside the container.
You can use the following values for align-items:
- stretch β fills the whole height of the cell (this is the default)
- start β aligns items to be flush with the start edge of their cell
- end β aligns items to be flush with the end edge of their cell
- center β aligns items in the center of their cell
- baseline β align items along text baseline. There are modifiers to baseline β first baseline and last baseline which will use the baseline from the first or last line in the case of multi-line text.
Note that you can also set the alignment of individual grid items using the align-self property.
Grid Structure
Grid Structure is a fundamental concept in CSS Grid, and it's essential to understand the basics before diving deeper. Grid comes with a bunch of new terminology as it's the first time CSS has had a real layout system.
Think of a grid as a container that's divided into rows and columns. This is the foundation of the grid structure.
The grid structure is made up of rows and columns, which are defined by the grid container. The grid container is the parent element that holds all the grid items.
Grid-Template-Rows
Grid-template-rows is used to define the rows of a grid, and it's defined with a space-separated list of values. The values represent the track size, and the space between them represents the grid line.
You can use a length, a percentage, or a fraction of the free space in the grid using the fr unit. For example, you can set a track size to one third the width of the grid container using the fr unit.
Grid lines are automatically assigned positive numbers, but you can choose to explicitly name the lines. Note the bracket syntax for the line names, which allows you to assign multiple names to a single line.
For instance, the second line can have two names: row1-end and row2-start. This is useful when you need to reference specific lines in your CSS code.
If your definition contains repeating parts, you can use the repeat() notation to streamline things. This can make your code more concise and easier to read.
Here's an example of how to use the repeat() notation:
```html
grid-template-columns: repeat(3, 1fr);
```
This is equivalent to:
```html
grid-template-columns: 1fr 1fr 1fr;
```
The fr unit allows you to set the size of a track as a fraction of the free space of the grid container. In this example, the total amount of free space available to the fr units doesn't include the 50px.
Filling Gaps
Filling gaps can be a challenge in grid layouts, especially when items span multiple tracks. The default behavior of grid layout is to always progress forward, placing items according to their order in the source or any modification made with the order property.
If there isn't enough space to fit an item, grid will leave a gap and move to the next track. This might not be the most efficient use of space.
Enabling dense packing mode by giving grid-auto-flow a value of dense can help fill gaps. This means grid will take items later in the layout and use them to fill gaps, potentially disconnecting the display from the logical order.
Grid Terminology
Grid terminology can be confusing, but don't worry, there aren't many terms to memorize.
The Grid specification defines the meanings of these terms, making it easier to understand them.
Grid comes with a bunch of new terminology, which is the first time CSS has had a real layout system.
Understanding these terms is crucial before diving into the concepts of Grid.
It's easy to confuse the terms involved in Grid if you don't first memorize their meanings defined by the Grid specification.
Grid Units and Functions
Grid units and functions are a crucial part of CSS Grid, allowing you to create flexible and responsive layouts.
The fr unit is a flexible length that describes a share of the available space in the grid container. It distributes space after the items have been laid out, making it perfect for creating equal-sized columns.
You can use the fr unit in combination with fixed size gaps or tracks, like in the example grid-template-columns: 200px 1fr, which creates a component with a fixed size element and the second track taking up whatever space is left.
The minmax() function is another useful function that sets a minimum and maximum size for a track. This can be quite useful when you want to force a track to take an equal share of the space in the grid container minus gaps.
Here's a quick summary of the sizing functions:
- fit-content(): uses the space available, but never less than min-content and never more than max-content.
- minmax(): sets a minimum and maximum value for what the length is able to be.
- auto-fill: fit as many possible columns as possible on a row, even if they are empty.
- auto-fit: fit whatever columns there are into the space, preferring expanding columns to fill space rather than empty columns.
Fr Units
Fr units are a type of fractional unit in CSS Grid that represent a share of the remaining space.
You'll likely end up using a lot of fr units in your CSS Grid layouts, and they're much more friendly in combination with other units than percentage values.
A declaration like grid-template-columns: 25% 75% means 25% 75%, but with fr units, you can achieve a similar effect with a declaration like grid-template-columns: 1fr 3fr.
The fr unit works in a similar way to using flex: auto in flexbox, distributing space after the items have been laid out.
To have three columns that all get the same share of available space, you can use grid-template-columns: 1fr 1fr 1fr.
You can combine the fr unit with a fixed size gap or fixed size tracks, like in the example grid-template-columns: 200px 1fr.
Using different values for the fr unit will share the space in proportion, with larger values getting more of the spare space.
Here are some examples of how to use the fr unit with different values:
The fr unit can be combined with other units, like in the example grid-template-columns: 200px 1fr.
You can use the minmax() function to set a minimum and a maximum size for a track, which can be useful for forcing a track to take an equal share of the space in the grid container.
To force a track to take an equal share of the space in the grid container minus gaps, use minmax(0, 1fr) as a track size.
Sizing Functions
Sizing Functions are a crucial part of CSS Grid, and there are several functions that can help you achieve the perfect layout for your content.
The fit-content() function uses the space available, but never less than min-content and never more than max-content.
You can use the minmax() function to set a minimum and maximum value for what the length is able to be, which is useful for in combination with relative units.
For example, you can use minmax(auto, 1fr) to set a minimum size of 0 and a maximum size of 1fr, which will distribute the remaining space evenly among the tracks.
Grid will take all of the available size in the container, deduct the size needed for any gaps, and share the rest out according to your fr units.
The minmax() function is particularly useful when you want to force a track to take an equal share of the space in the grid container minus gaps.
Here are some examples of how you can use the minmax() function:
By using these sizing functions, you can create a flexible and responsive layout that adapts to different screen sizes and devices.
Grid Properties
Grid Properties are a crucial part of CSS Grid, and one of the most important ones is intrinsic sizing keywords. These keywords are defined in the Box Sizing specification and add additional methods of sizing boxes in CSS.
The min-content keyword will make a track as small as it can be without the track content overflowing, while the max-content keyword has the opposite effect, making a track as wide as it needs to be for all the content to display in one long unbroken string.
Here are the intrinsic sizing keywords in a nutshell: min-contentmax-contentfit-content()
Fit-Content
The fit-content() function is a game-changer for grid layouts. It uses the space available and accepts a percentage or length value as the maximum size allowed for a grid track while ensuring the track never goes beyond the max-content and never shrinks beyond a minimum.
This function is particularly useful when you want to set a maximum size for a track, but still allow it to grow to fit its content. For example, if you set a track to fit-content(700px), it will only stretch out to fit its content, but will never exceed a width of 700px.
The fit-content() function is often used in combination with other grid properties, such as minmax() and auto-fill/fit. It's a powerful tool for creating flexible and responsive grid layouts.
Here's a quick rundown of the key benefits of using fit-content():
- Ensures the track never goes beyond the max-content
- Ensures the track never shrinks beyond a minimum
- Accepts a percentage or length value as the maximum size allowed
By using the fit-content() function, you can create grid layouts that are both flexible and responsive, while also ensuring that your content is displayed in a way that's easy to read and understand.
Repeat( , Track-List)
The repeat() function is an efficient way to define the number of grid-template-columns that are the same. This function takes the number of columns, followed by the column size.
You can specify the number of columns as a positive integer, which means you can use a number like 3 or 5. The function will then repeat the column size for the specified number of columns.
The repeat() function can also use the auto-fill or auto-fit keywords. Auto-fill will fill the remaining space with the specified column size, while auto-fit will shrink the specified column size to fit the remaining space.
The repeat() function is useful when you want to create a grid with multiple columns that are the same size. It's a great time-saver and makes your code more efficient.
Grid-Template-Columns
Grid-template-columns is a powerful property that allows you to define the number of columns in a grid container. It's an efficient way to define the number of grid-template-columns when the columns are the same.
You can use the repeat() function to streamline your definitions, which is equivalent to writing out each column individually. For example, repeat(3, 1fr) is the same as 1fr 1fr 1fr.
Grid lines are automatically assigned positive numbers, but you can choose to explicitly name the lines using the bracket syntax. This allows you to reference lines by their name and count.
The fr unit is a fraction of the free space in the grid container, and it's a great way to set the size of a track as a portion of the remaining space. For example, 1fr 2fr 1fr will set each item to one third, two thirds, and one third of the grid container's width, respectively.
You can also use the repeat() notation to define repeating parts of your grid. This can be especially helpful when you have multiple lines with the same name.
Shorthand Properties
Shorthand properties can look a little confusing until you break down exactly how they go together.
There are two shorthand properties that allow you to set many of the grid properties in one go.
Whether you want to use them or prefer to use longhands is up to you.
Grid Container and Rows
Grid Container is a crucial concept to understand when working with CSS Grid. It's the HTML element that has display: grid applied, creating a new grid formatting context for its direct children.
Think of it as the foundation of your grid layout. The Grid Container is what sets the stage for your grid system.
To define a Grid Container, you simply add the display: grid property to an HTML element. This element will then become the container for your grid layout.
The Grid Container is where the magic happens, and it's essential to choose the right element to contain your grid.
Intrinsic Sizing Keywords
Intrinsic sizing keywords are a powerful tool in CSS Grid, allowing you to size grid tracks based on the content they contain.
The min-content keyword makes a track as small as it can be without the track content overflowing. For example, if you have a grid layout with three column tracks all at min-content size, they will become as narrow as the longest word in the track.
The max-content keyword has the opposite effect, making the track as wide as it needs to be to fit all the content in one long unbroken string. This can sometimes cause overflows if the content is too long.
The fit-content() function is like max-content at first, but once the track reaches the size you pass into the function, the content starts to wrap. For instance, fit-content(10em) will create a track that is less than 10em if the max-content size is less than 10em, but never larger than 10em.
Here's a summary of the intrinsic sizing keywords:
These intrinsic sizing keywords are defined in the Box Sizing specification and add additional methods of sizing boxes in CSS, not just grid tracks.
Grid Snippets
Grid Snippets are a great way to add some flexibility to your layouts. Fluid columns can break into more or less columns as space is available, with no media queries!
You can achieve this with the "Fluid columns snippet" that allows for a dynamic number of columns based on the available space.
Sources
- CSS Grid Layout specification (w3.org)
- from the specification (w3.org)
- CSS Grid Layout Module Level 2 (csswg.org)
- this trick from Stephanie Eckles wonderful Smol CSS website (smolcss.dev)
- more on this unit (digitalocean.com)
- needs (meyerweb.com)
- Caniuse (caniuse.com)
- CSS Grid Layout: Introduction (digitalocean.com)
- Learning CSS Grid Layout (rachelandrew.co.uk)
- Grid by Example (gridbyexample.com)
- CSS Grid Layout Module Level 1 (w3.org)
- min-content (mozilla.org)
- max-content (mozilla.org)
- fit-content() (mozilla.org)
- grid-row-end (mozilla.org)
- grid-row-start (mozilla.org)
- grid-column-end (mozilla.org)
- grid-column-start (mozilla.org)
- grid-row (mozilla.org)
- grid-column (mozilla.org)
- grid-auto-columns (mozilla.org)
- grid-auto-rows (mozilla.org)
- grid-area (mozilla.org)
- grid-template (mozilla.org)
- grid (mozilla.org)
- align-items (mozilla.org)
- justify-items (mozilla.org)
- align-self (mozilla.org)
- justify-self (mozilla.org)
- align-content (mozilla.org)
- justify-content (mozilla.org)
- A comprehensive collection of grid learning material (gridbyexample.com)
- Creating a Grid Container (smashingmagazine.com)
- MDN CSS Grid Layout (mozilla.org)
- CSS Grid (mozilla.org)
- Every Layout (every-layout.dev)
- CSS Values and Units Module Level 4 (csswg.org)
Featured Images: pexels.com