CSS Grid is a game-changer for web developers, allowing for the creation of complex layouts with ease.
It's a two-dimensional system, enabling you to position elements both horizontally and vertically within a grid container.
CSS Grid is not a replacement for other layout methods like Flexbox, but rather a complement to them, offering a more powerful and flexible way to design layouts.
With CSS Grid, you can create layouts that are both responsive and adaptable to different screen sizes and devices.
Grid Layout
Grid Layout is a powerful tool in CSS that allows you to create complex and flexible layouts with ease. To create a grid layout, you can turn any layout element (such as a section, container, block, or div) into a CSS grid layout by setting the Display value to grid.
Grid items are arranged vertically into columns and horizontally into rows, and the space between a row and a column is called a gap. You can adjust the gap using properties like grid-column-gap, grid-row-gap, or grid-gap.
A grid overlay becomes visible when editing a grid container in the builder, indicating the grid cells. Grid items are laid out in rows by default, covering the full width of the grid container. To unlock the true power of CSS grid, you need to start defining the grid layout explicitly.
Here are some common ways to define grid tracks:
Note that the fractional unit (fr) is used to allocate remaining space to grid tracks. For example, if you define grid-template-columns as 200px 1fr 2fr, the remaining available space will be allocated to the fractional units, making column 2 300px wide and column 3 600px wide.
Grid Layout
Grid layout is a powerful tool for creating complex and responsive designs. You can turn any layout element into a CSS grid layout by setting the Display value to grid.
The grid container is the parent element that contains the grid items, and it's where you set the grid properties. Grid items are the direct children of the grid container, and they're arranged vertically into columns and horizontally into rows.
To create a grid layout, you need to create a parent div element (the grid container) and one or more child div elements (the grid items). The space between rows and columns is called a gap, and you can adjust it using the grid-column-gap, grid-row-gap, and grid-gap properties.
The grid-gap property is a shorthand property that sets both the grid-column-gap and grid-row-gap properties at once. You can also use the grid-column-start, grid-column-end, grid-row-start, and grid-row-end properties to place grid items at specific line numbers.
Here are the grid-related properties you can use to place items by line number:
- grid-column-start
- grid-column-end
- grid-row-start
- grid-row-end
The grid-column and grid-row properties have shorthands that allow you to set both start and end lines at once. The line numbering follows the writing mode and direction of the component.
You can use the repeat() function with the auto-fill or auto-fit keywords to create a grid layout with a dynamic number of tracks. The auto-fill keyword creates empty tracks, while the auto-fit keyword collapses the tracks to 0 size.
Grid Layout
Grid layout is a powerful tool for creating responsive and flexible web layouts. To build a responsive grid, you'll want to start by setting the box-sizing property of all HTML elements to border-box, which includes the padding and border in the width and height of the elements.
This will make it easier to create a grid that adapts to different screen sizes. You can also use a front-end development framework like Bootstrap CSS to create a grid system, which can save you time and effort.
To set up a grid layout, you'll need to create a parent div element (the grid container) and one or more child div elements (the grid items). The display property of the grid container should be set to grid, which will turn it into a grid container.
Grid items are arranged vertically into columns and horizontally into rows, and you can adjust the space between rows and columns using properties like grid-column-gap and grid-row-gap. These properties can be set using the grid-gap shorthand property.
You can also use the fr unit to define the track size of the grid container, which will make the grid tracks grow and shrink according to the available space.
Here are some common grid layouts you can use:
- Single column layout: Use one column to create a simple and clean design.
- Two column layout: Use two columns to create a layout with a main content area and a sidebar.
- Holy Grail layout: Use a three-column layout with a header, footer, and main content area.
To create a Holy Grail layout, you can use the following HTML structure:
- Header
- Navigation sidebar
- Main content (article element)
- Right sidebar (aside element)
- Footer
You can use the following CSS to define the grid and grid items:
- grid-template-columns: 1fr 3fr 1fr;
- grid-template-rows: auto 1fr auto;
- grid-column-start: 1;
- grid-column-end: 4;
- grid-row-start: 1;
- grid-row-end: 3;
This will create a layout with a header, footer, and main content area, and a navigation sidebar and right sidebar.
Line-Based Placement Layout
Line-Based Placement Layout is a fundamental concept in CSS Grid Layout. You can position items on the grid based on column and row lines, which are numbered.
To create a line-based placement layout, you need to define the grid with the grid-template-columns and grid-template-rows properties. Each column and row will have a line number assigned to it. For example, in Example 2, the grid has three columns and two rows, with six items placed on the grid based on column and row lines.
The grid-column-start, grid-column-end, grid-row-start, and grid-row-end properties are used to define the placement of each grid item. These properties take line numbers as values, which specify the start and end lines of the grid area where the item should be placed. For instance, in Example 2, the CSS defines the placement of the six grid items with line numbers for each grid item.
Grid items can span multiple grid tracks by using the grid-column and grid-row properties. These properties take two values: the start line number and the end line number. For example, in Example 3, the CSS defines the placement of the four grid items, with one item spanning two columns and another item spanning two rows.
Here's a summary of the properties used for line-based placement layout:
- grid-column-start and grid-column-end for column placement
- grid-row-start and grid-row-end for row placement
- grid-column and grid-row for shorthand placement
- grid-column-gap and grid-row-gap for gap adjustment
By using these properties, you can create complex layouts with multiple grid items spanning multiple tracks. The key is to understand how the line numbers work and how to use them to position your grid items.
Auto-Fill and Auto-Fit Keywords
Auto-Fill and Auto-Fit Keywords are powerful tools in Grid Layout that allow you to create responsive grid layouts without media queries.
You can use the auto-fill or auto-fit keywords to create as many tracks as will fit in your container. For example, you can use grid-template-columns: repeat(auto-fill, 200px) to create as many 200 pixel tracks as will fit in the container.
The auto-fill keyword will create empty tracks if there isn't enough space for another 200 pixel track. This means that the flexible tracks will not grow to consume the space.
The auto-fit keyword, on the other hand, will make the tracks collapse down to 0 size if there isn't enough space for another 200 pixel track. This means that the flexible tracks will grow to consume the space.
Here's a summary of the key differences between auto-fill and auto-fit keywords:
In practice, the auto-fit keyword is useful when you want to create a grid layout that will adapt to different screen sizes, but you don't want to leave empty tracks.
Grid Properties
Grid Properties can be a bit overwhelming at first, but don't worry, I've got you covered. You can create a grid layout using the shorthand grid-area property, which requires less code but can be a bit tricky to remember.
The order of the property values for grid-area is: row line where grid item starts / column line where grid item starts / row line where grid item ends / column line where grid item ends.
The grid property can be used to reset other grid properties to their initial values, including grid-template-rows, grid-template-columns, grid-template-areas, grid-auto-rows, grid-auto-columns, and grid-auto-flow.
Here's a quick rundown of the grid properties that can be reset by the grid property:
- grid-template-rows
- grid-template-columns
- grid-template-areas
- grid-auto-rows
- grid-auto-columns
- grid-auto-flow
Properties
Grid properties are a crucial part of CSS Grid, and understanding them can save you a lot of time and code clutter.
You can create the same grid layout using shorthand grid-column and grid-row properties, which can save you time and make your code look cleaner. To define these shorthand properties, make the first number the column line where the grid item starts and the second number represents the column line where the grid item ends, separating the values with a slash.
There are several properties for the children (grid items), including grid-column-start, grid-column-end, grid-row-start, grid-row-end, grid-column, grid-row, grid-area, justify-self, align-self, and place-self. Float, display: inline-block, display: table-cell, vertical-align, and column-* properties have no effect on a grid item.
You can use the shorthand grid-area property to define the grid area for an item, which requires less code than using the individual properties. To use this property, define four values: the row line where the grid item starts, the column line where the grid item starts, the row line where the grid item ends, and the column line where the grid item ends.
The shorthand grid property can be used to reset other grid properties to their initial values, including grid-template-rows, grid-template-columns, grid-template-areas, grid-auto-rows, grid-auto-columns, and grid-auto-flow. This can be useful when you want to simplify your code and avoid setting unnecessary properties.
Grid items can span more than one track by using the span keyword, which is a shorthand way of specifying the end value for the grid-column and grid-row shorthand properties. For example, to cause an item to span two columns and two rows, you would write "span 2".
Template-Columns
Grid-template-columns is a powerful property that allows you to define the columns of your 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 a length, a percentage, or a fraction of the free space in the grid using the fr unit.
A track-size can be a length, a percentage, or a fraction of the free space. For example, you can set a track-size to 50px or 20%.
You can also 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.
Note that the fr unit allows you to set the size of a track as a fraction of the free space of the grid container. The free space is calculated after any non-flexible items.
Grid lines are automatically assigned positive numbers from these assignments. But you can choose to explicitly name the lines using the bracket syntax.
Here's an example of how to use the repeat() notation to streamline your grid-template-columns definition:
This is equivalent to:
If multiple lines share the same name, they can be referenced by their line name and count.
Column-Gap
Column-Gap is a property that allows you to set the width of the gutters between columns. This property is used to create a clean and organized grid layout.
You can think of it like setting the width of the gutters between the columns, and it's specified using a length value, such as a number or a unit like pixels.
The gutters are only created between the columns, not on the outer edges. This means that the gap will be visible between each column, but not around the entire grid.
This property is also known as grid-column-gap, and it's already supported in some modern browsers like Chrome 68+, Safari 11.2 Release 50+, and Opera 54+.
Here are the properties you can use to specify the size of the grid lines:
- column-gap
- row-gap
- grid-column-gap (deprecated)
- grid-row-gap (deprecated)
Note that grid-column-gap and grid-row-gap will be removed and renamed to column-gap and row-gap in the future.
Auto-Columns
Grid-auto-columns and grid-auto-rows are used to specify the size of auto-generated grid tracks, also known as implicit grid tracks. These tracks are created when there are more grid items than cells in the grid or when a grid item is placed outside of the explicit grid.
Implicit tracks get created when you reference lines that don't exist, and they have a width of 0 by default. You can use grid-auto-columns and grid-auto-rows to specify the widths of these implicit tracks.
Grid-auto-columns can be a length, a percentage, or a fraction of the free space in the grid using the fr unit. This means you can get creative with the sizes of your implicit tracks.
Here are some examples of how you can use grid-auto-columns and grid-auto-rows:
- grid-auto-columns: 1fr 2fr;
- grid-auto-rows: 200px 50%;
Remember, the repeat() function can also save you some typing when defining the sizes of your implicit tracks.
Terminology
Grid terminology is actually pretty straightforward once you understand the basics. The Grid specification defines a few key terms that might be easy to confuse with one another.
There aren't many Grid terms to memorize, fortunately. You can breathe a sigh of relief knowing you won't have to learn a huge list of complicated vocabulary.
Grid comes with a bunch of new terminology as it's the first time CSS has had a real layout system. This new terminology is worth understanding to get the most out of Grid.
Don't worry if you're not familiar with Grid terminology yet - it's easy to learn and understand once you start working with it.
The Fr Unit
The fr unit is a flexible length that describes a share of the available space in the grid container. It works similarly to using flex: auto in flexbox, distributing space after the items have been laid out.
To use the fr unit, you can combine it with a fixed size gap or fixed size tracks. For example, a tracklisting of grid-template-columns: 200px 1fr will give a component with a fixed size element and the second track taking up whatever space is left.
The fr unit can be combined with different values to share the space in proportion. Larger values get more of the spare space. For example, changing the value of the third track in a demo will show how the fr unit shares out the available space.
Here's a quick rundown of how the fr unit works:
This means that the fr unit is a powerful tool for creating responsive and flexible layouts with CSS Grid.
The Minmax() Function
The minmax() function is a powerful tool in CSS Grid that allows you to set both a minimum and a maximum size for a track. This can be especially useful when you want to ensure that a track takes a certain amount of space, but also allows it to expand if needed.
Grid looks at the intrinsic size of the content when using minmax(), then distributes available space after giving the content enough room. However, this can sometimes result in tracks that don't have an equal share of space. To force a track to take an equal share of the space in the grid container minus gaps, you can use minmax() by setting the minimum size to 0 and the maximum size to a fraction of the available space.
For example, replacing 1fr as a track size with minmax(0, 1fr) will give the track a minimum size of 0 and force it to take an equal share of the space in the container, minus gaps.
Here's a summary of how minmax() works:
- Minimum size: 0
- Maximum size: 1fr (or any other fraction of the available space)
By using minmax(), you can create more flexible and responsive grid layouts that adapt to different screen sizes and content.
Idents
Idents are a powerful tool in CSS Grid Layout, allowing you to reference named lines in your grid. This can be especially useful when working with grid-template-areas.
If you miss off the last value in the grid-area property, it will use a copy of the first value for grid-column-end and grid-row-end. This means they'll become identical and essentially set to auto.
Grid-template-areas create named areas that can be referenced by their line names, which are the same as the area name used. For example, if you have an area named "one", you can use "one" as a line name.
Named lines can be used in the grid-area property to place an item, and they resolve to the start or end of a column or row depending on whether they're a -start or -end line.
Grid Items
Grid items are the direct children of the grid container, which means they're the immediate elements inside the grid.
A grid item can be any HTML element that's a direct child of the grid container, such as a div or a paragraph.
The grid container can have multiple grid items, and each item can have its own unique styles and properties.
To define a grid item, you can use the repeat() function, which allows you to create a grid with a specified number of columns or rows.
Grid items can be thought of as the individual building blocks of the grid, and understanding how they work is key to creating a well-designed layout.
Grid Containers
A grid container is the element on which display: grid is applied. It's the direct parent of all the grid items.
Grid containers create a new grid formatting context for their direct children. This is achieved by applying display: grid to an HTML element.
The grid container is the direct parent of all the grid items, making it the foundation of the grid layout.
Grid Display
Grid display is a crucial aspect of CSS grid. It defines the element as a grid container and establishes a new grid formatting context for its contents.
The display property has two values that generate different types of grids: grid and inline-grid.
Grid generates a block-level grid, which means it takes up the full width of its parent element and can contain other block-level elements.
Inline-grid generates an inline-level grid, which means it only takes up the space it needs and can contain other inline-level elements.
You can choose between these two values depending on the layout you want to achieve. For example, if you want to create a grid that spans the full width of the page, you might use grid.
Grid Gaps and Tracks
Grid gaps and tracks are crucial components of the CSS Grid layout system. A gap is essentially a gutter or alley between tracks, and for sizing purposes, it acts like a regular track.
You can't place content into a gap, but you can span grid items across it. Browser support for gap is already available in Chrome 68+, Safari 11.2 Release 50+, and Opera 54+.
A track is the space between two grid lines, and when we create our grid, we create these tracks by assigning a size to them. This can be done explicitly via the Grid template columns and Grid template rows settings of our grid container.
Here's a breakdown of how to set up column and row tracks explicitly:
For example, `grid-template-columns: 200px 1fr 2fr` creates a three-column grid layout with a fixed width of 200px for the first column, and 1fr and 2fr for the remaining two columns.
Gaps
Gaps are a crucial aspect of grid layout, and understanding how they work can help you create more effective and visually appealing designs.
A gap is essentially a gutter or alley between tracks, and it acts like a regular track for sizing purposes. You can't place content directly into a gap, but you can span grid items across it.
Grid gaps can be specified using the gap property, which is a shorthand for row-gap and column-gap. If no row-gap is specified, it's set to the same value as column-gap.
Here are the properties used to specify the size of grid lines:
- column-gap
- row-gap
- grid-column-gap
- grid-row-gap
These properties take a length value, which determines the width of the gutters between columns or rows. Note that the gutters are only created between the columns or rows, not on the outer edges.
The default behavior of grid layout with a fully auto-placed layout is to always progress forward, placing items in the order they appear in the source or according to any modifications made with the order property. If there's not enough space to fit an item, grid will leave a gap and move to the next track.
Tracks
Tracks are the spaces between grid lines, and they can be either row tracks or column tracks. A row track is the space between two row lines, while a column track is the space between two column lines.
You can create tracks by assigning a size to them when creating your grid. The size of a track can be fixed, flexible, or a combination of both. For example, the grid-template-columns property can create a column track with a fixed width of 200px, followed by a flexible column that takes up 1 part of the available space.
Implicit tracks are created in the implicit grid and are auto-sized by default. However, you can control the sizing of implicit tracks using the grid-auto-rows property for rows and the grid-auto-columns property for columns. For instance, you can create implicit rows with a minimum size of 10em and a maximum size of auto.
The minmax CSS function lets you set a minimum and maximum track size. It accepts two arguments: the minimum value and the maximum value of your grid track. This can be useful for creating responsive grids that adapt to different viewport sizes.
You can also use the fractional unit (fr) to create flexible tracks. The value of fr is calculated by subtracting all non-fr values and gaps from the available space, and then allocating the remaining space to the fractional units. For example, in a grid with three fractional units, 1fr would equal 300px, and 2fr would equal 600px.
Grid Alignment and Justification
Grid alignment and justification are crucial aspects of CSS Grid. You can align grid items along the inline (row) axis using the justify-items property, which applies to all grid items inside the container.
The justify-items property has four values: start, end, center, and stretch. 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, and stretch fills the whole width of the cell.
You can also set alignment for individual grid items using the justify-self property. This property aligns a grid item inside a cell along the inline (row) axis.
Here are the values for justify-self: start, end, center, and stretch. Start aligns the grid item to be flush with the start edge of the cell, end aligns the grid item to be flush with the end edge of the cell, center aligns the grid item in the center of the cell, and stretch fills the whole width of the cell.
Grid alignment can also be set on the grid container using the justify-items property. This sets the alignment for all the items in the grid.
To align grid items along the block (column) axis, you can use the align-items property. This property aligns grid items along the block (column) axis, as opposed to justify-items which aligns along the inline (row) axis.
The align-items property has several values, including stretch, start, end, center, and baseline. Stretch fills the whole height of the cell, 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, and baseline aligns items along text baseline.
You can also use the align-self property to align a grid item inside a cell along the block (column) axis. This property has the same values as align-items: stretch, start, end, center, and baseline.
If the total size of your grid is less than the size of its grid container, you can use the justify-content property to align the grid within the grid container. This property aligns the grid along the inline (row) axis.
The justify-content property has several values, including start, end, center, stretch, space-around, space-between, and space-evenly. 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 width of the grid container, space-around places an even amount of space between each grid item, space-between places an even amount of space between each grid item, and space-evenly places an even amount of space between each grid item.
You can also use the align-content property to align the grid along the block (column) axis. This property has the same values as justify-content: start, end, center, stretch, space-around, space-between, and space-evenly.
Note that the place-content property sets both the align-content and justify-content properties in a single declaration. This property is supported by all major browsers except Edge.
Frequently Asked Questions
What do you use CSS Grid for?
You use CSS Grid to divide a page into major regions and align elements into columns and rows, creating a flexible and organized layout. It's perfect for building complex web pages with ease.
What is CSS Grid and flexbox?
CSS Grid and flexbox are two layout systems in CSS, with Grid designed for two-dimensional layouts and flexbox for one-dimensional layouts in rows or columns. Understanding the difference between these two systems is key to creating responsive and efficient web designs.
Sources
- Grid Layout Working Draft (w3.org)
- Image Source (joomlashack.com)
- web designer Rachel Andrew (gridbyexample.com)
- level 2 of the CSS Grid specification. (w3.org)
- repeat() notation (digitalocean.com)
- this article by DigitalOcean (digitalocean.com)
- The spec has an official way (csswg.org)
- needs (meyerweb.com)
- Caniuse (caniuse.com)
- CSS Grid: Holy Grail Layout (digitalocean.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)
- grid overlay in Chrome DevTools (chrome.com)
- demo (codepen.io)
- Source (mozilla.org)
- minmax() (mozilla.org)
- repeat() (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-areas (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)
- MDN CSS Grid Layout (mozilla.org)
- grid cells (mozilla.org)
- tracks (mozilla.org)
- grid-template-rows (mozilla.org)
- grid-template-columns (mozilla.org)
- minmax (mozilla.org)
- repeat (mozilla.org)
- Grid lines (mozilla.org)
- grid-row (mozilla.org)
- grid-column (mozilla.org)
- grid-template-areas (mozilla.org)
- cssgrid.io (cssgrid.io)
- learncssgrid.com (learncssgrid.com)
- The New CSS Layout (abookapart.com)
- @rachelandrew (codepen.io)
- Simple grid-template-areas example (codepen.io)
- Grid Line placement (codepen.io)
- Missing idents in grid-area (codepen.io)
- Placing an item with implicit line names (codepen.io)
- disconnecting the visual display from the underlying source order (rachelandrew.co.uk)
Featured Images: pexels.com