CSS Grid Wrap is a powerful tool for creating complex layouts, and understanding how to use it effectively is crucial for any web developer.
The grid container's `grid-template-columns` property determines the number of columns and their widths, which in turn affects how the grid items wrap.
To prevent wrapping, set the `grid-template-columns` property to a value that exceeds the container's width, such as `grid-template-columns: 1fr 2fr`.
Wrapping can be achieved by setting the `grid-template-columns` property to a value that is less than or equal to the container's width, such as `grid-template-columns: 2fr 2fr`.
Grid Basics
Grid is a two-dimensional layout system that allows you to arrange items in a grid container.
Grid containers can have rows and columns, and each item in the grid is called a grid cell.
Grid cells can be sized to fit their content, or you can specify a fixed size for each cell.
Grid items can also be placed anywhere within the grid, not just in a specific row or column.
Terminology
Grid has a bunch of new terminology, which can be confusing at first.
The Grid specification defines these terms to help you understand the concepts.
Don't worry, there aren't many of them to memorize.
Grid terminology can be overwhelming, but it's worth taking the time to learn the meanings of each term.
Template-Columns
Grid-template-columns is a crucial part of defining the layout of your grid. It's a space-separated list of values that represent the track size, and the space between them represents the grid line.
You can use a length, percentage, or the fr unit to define the track size. The fr unit allows you to set the size of a track as a fraction of the free space of the grid container. For example, this will set each item to one third the width of the grid container.
Grid lines are automatically assigned positive numbers, but you can choose to explicitly name the lines using the bracket syntax. This can be useful for referencing specific lines in your grid.
Here are some key things to know about grid-template-columns:
- track-size: can be a length, a percentage, or a fraction of the free space in the grid using the fr unit
- line-name: an arbitrary name of your choosing
If your definition contains repeating parts, you can use the repeat() notation to streamline things. For example, this will set the first three columns to 1fr and the remaining columns to 2fr.
Note that if multiple lines share the same name, they can be referenced by their line name and count.
Grid Layout
To define a grid container, you'll need to set the display property to grid. This is essential for using CSS Grid Layout.
The CSS Grid Layout is a two-dimensional grid-based layout system with rows and columns. It's useful for creating more complex and organized layouts.
Grid-template-columns are declared in the grid container to give the overall structure of the page. You can use fractional units like 1fr and 3fr to establish sizing, as seen in the example where the column set to 3fr is three times wider than the other.
Fractional units can also be used to create multiple columns with different widths, such as 0.4fr, 0.3fr, and 0.3fr. This is useful for layouts that need things to line up and behave consistently in both directions.
Container
The container is the foundation of a CSS Grid Layout. It's the element that has the display: grid property applied to it.
To define a grid container, you'll have to pass a display: grid property to your element. This is a crucial step in creating a grid layout.
The grid container is the direct parent of all the grid items. It's the element that contains all the other elements that will be arranged in the grid.
In the example, the container is the grid container. This is where the grid-template-columns are declared to give the overall structure of the page.
A grid container is created when you apply display: grid to an HTML element. This element then becomes the grid container and creates a new grid formatting context for its direct children.
Template
Grid layout templates are a powerful way to create complex layouts with ease.
You can define the structure of your grid using the grid-template-columns and grid-template-rows properties. For example, you can set grid-template-columns to 1fr and 3fr to create two columns where the first column is one-third the width of the second column.
To simplify the process, you can use the grid-template shorthand property, which sets grid-template-columns, grid-template-rows, and grid-template-areas in a single declaration. The none value resets all three properties to their initial values.
Here are some examples of using grid-template:
You can also name areas of the grid and place items onto those named areas using the grid-area property and grid-template-areas property. This allows you to see what your component looks like right there in the CSS.
Grid Tracks
Grid tracks are the building blocks of a CSS grid layout, and understanding how to size and structure them is crucial for creating effective grid systems. You can create implicit tracks, which are automatically sized by default, or use properties like grid-auto-rows and grid-auto-columns to control their sizing.
To create all implicit rows at a minimum size of 10em and a maximum size of auto, you can use the grid-auto-rows property. This is particularly useful when you want to ensure that rows have a minimum size, but still allow them to expand to fit their content.
Implicit columns can be created with a pattern of 100px and 200px wide tracks, where the first implicit column is 100px, the second is 200px, and the third is 100px, and so on. This is achieved by using the grid-auto-columns property.
You can also define the columns and rows of a grid using the grid-template-columns and grid-template-rows properties, which take a space-separated list of values representing the track size and grid line. This allows you to explicitly name the lines, which can be useful for referencing them in your CSS.
Here's a summary of the different types of track sizing:
- grid-auto-rows: auto-sizes rows to fit their content
- grid-auto-columns: auto-sizes columns to fit their content
- grid-template-columns and grid-template-rows: define the columns and rows of a grid using a space-separated list of values
Template-Rows
Grid-template-rows defines the rows of the grid 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 the fr unit to set the size of a track as a fraction of the free space of the grid container. For example, this will set each item to one third the width of the grid container: 1fr 1fr 1fr.
Grid lines are automatically assigned positive numbers, but you can choose to explicitly name the lines. Note the bracket syntax for the line names: [line-name]. A line can have more than one name.
If your definition contains repeating parts, you can use the repeat() notation to streamline things. For example, this is equivalent to: 1fr 1fr 1fr. Multiple lines sharing the same name can be referenced by their line name and count.
Column-Gap
Column-gap is the space between grid tracks. It's a crucial aspect of grid layouts, allowing you to control the visual flow of your content.
The default column-gap is 1fr, which means it takes up the remaining space. This can be a good starting point, but you may want to adjust it to suit your design.
A column-gap of 0fr can be useful for creating a seamless, continuous layout. This is often used in designs where the content flows smoothly from one column to the next.
In some cases, you may want to use a fixed column-gap, such as 1em or 20px. This can be helpful when you need to create a consistent spacing between columns.
By controlling the column-gap, you can create a more visually appealing and user-friendly grid layout.
Row-Gap
Row-gap is the space between grid tracks, and it's a crucial aspect of grid design.
The row-gap can be set using the grid-row-gap property, which is a shorthand for setting the gap between grid rows.
Setting a row-gap of 10px can help create a clean and organized layout.
In the example of a grid with three rows and two columns, setting a row-gap of 10px adds a 10px space between each row.
A row-gap of 0px can be used to create a seamless grid layout.
The row-gap property can be used in conjunction with the grid-row-gap property to create a consistent layout.
Grid rows with a gap of 10px can be used to separate content and create a clear visual hierarchy.
Column Organization
You can automatically size columns with the grid-auto-columns property, which tells the grid to fit columns into the row. This sets restrictions on the minimum and maximum size, preventing columns from being less than 15em.
To place items in columns, use the grid-auto-flow property with the value column. This causes items to place into columns instead of rows.
Grid-template-columns and grid-template-rows define the columns and rows of the grid with a space-separated list of values. Each value represents the track size, and the space between them represents the grid line.
You can name grid lines using the bracket syntax, and multiple lines can share the same name. For example:
grid-template-columns: [row1-start] 1fr [row1-end] 1fr [row2-start] 1fr [row2-end];
This grid demonstrates many of the things described in the terminology section. It has three column tracks, each using a different length unit, and two row tracks.
Grid Items
Grid items are the direct descendants of the grid container. They are the elements that are placed inside the grid.
The grid item is defined by its position on the grid, which is determined by the grid lines. These lines are numbered and follow the writing mode and direction of the component.
You can place items on the grid by setting the start and end lines of the grid area. This is done using properties like grid-column-start, grid-column-end, grid-row-start, and grid-row-end.
The shorthand properties grid-column and grid-row allow you to set both start and end lines at once. This makes it easier to place items on the grid.
Here are the properties you can use to place items by line number:
- grid-column-start
- grid-column-end
- grid-row-start
- grid-row-end
These properties have corresponding shorthand properties: grid-column and grid-row.
The line numbering is consistent with the writing mode and direction of the component. This means that the placement of items stays consistent even if you change the writing mode or direction.
The explicit grid is created when you define grid-template-rows and grid-template-columns. This grid has explicitly defined tracks. However, there may be cases where items display outside this explicit grid. In such cases, the implicit grid is created to make the layout work.
Grid Sizing
Grid sizing is a powerful feature in CSS Grid that allows you to control the size of your grid tracks. You can use the `grid-template-columns` property to specify the size of each track.
To automatically size columns, you can use the `grid-template-columns: repeat(auto-fill, minmax(15em, 1fr))` trick, which sets a minimum and maximum size for each track, preventing them from becoming too small or too large.
Intrinsic sizing keywords like `min-content`, `max-content`, and `fit-content()` can also be used to size grid tracks. For example, `grid-template-columns: min-content` will make each track as small as possible without overflowing, while `grid-template-columns: max-content` will make each track as wide as the longest content string.
Here are some examples of how to use these intrinsic sizing keywords:
Fr Units
Fr units are a powerful tool in CSS Grid, allowing you to distribute space between tracks in a flexible way. They essentially mean "portion of the remaining space".
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 which all get the same share of available space, you can use grid-template-columns: 1fr 1fr 1fr.
You can combine the fr unit with fixed size gaps or fixed size tracks, such as 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's a breakdown of how to use the fr unit:
This means you can have a component with a fixed size element and the second track taking up whatever space is left, or have three columns which all get the same share of available space. The possibilities are endless!
Auto-Fill and Auto-Fit
The repeat() function can get extra fancy when combined with keywords, making it a powerful tool for grid layout. You can use it to create as many tracks as will fit in your container.
The auto-fill and auto-fit keywords are two such keywords that you can use with repeat(). They allow you to create a grid layout where the number of tracks is determined by the available space.
The difference between auto-fill and auto-fit is subtle, but important. Auto-fill creates as many tracks as possible, even if they are empty, while auto-fit fits the available space with the tracks you have.
Here's a summary of the two keywords:
- 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. Prefer expanding columns to fill space rather than empty columns.
In practice, this means that auto-fill will create empty tracks if there's not enough space for a full track, while auto-fit will collapse empty tracks to 0 size and make the flexible tracks grow to consume the space.
Frequently Asked Questions
What is the difference between flex-wrap and grid wrap?
Flexbox's "flex-wrap" and CSS Grid's "grid wrap" both enable wrapping content, but CSS Grid provides more flexible 2D layout options. To create multi-line layouts with Flexbox, you need to apply "flex-wrap: wrap", whereas CSS Grid layouts can be defined directly.
How do you make columns even in CSS Grid?
To make columns even in CSS Grid, use `grid-template-columns: repeat(3, minmax(0, 1fr))` to create equal-width columns that adapt to content. This flexible approach ensures consistent spacing and a responsive layout.
Sources
- https://wpengine.com/resources/combine-flexbox-and-css-grids-for-layouts-how-to/
- https://gomakethings.com/how-to-create-a-responsive-grid-system-with-css-grid/
- https://www.simplilearn.com/tutorials/css-tutorial/css-grid-vs-flexbox
- https://css-tricks.com/snippets/css/complete-guide-grid/
- https://web.dev/learn/css/grid
Featured Images: pexels.com