What is difference between justify-self, justify-items and justify-content in CSS grid?
Asked Answered
A

5

122

I'm really confused. When looking for online resources and documentation, most of the documentation of these properties seem to reference Flex-box, not grid. And I don't know how applicable the documentation for the equivalent properties in Flex-box is to grid.

So, I've tried referencing https://css-tricks.com/snippets/css/complete-guide-grid/, which defines them as follows:

justify-items - Aligns the content inside a grid item along the row axis

justify-content - This property aligns the grid along the row axis

justify-self - Aligns the content inside a grid item along the row axis

But I still don't understand what the difference between them is. So, I have 3 questions I want to clarify.

  1. Is the justify-items property in Flex-box the same as the justify-items property in Grid? or are they different somehow? (In other words, can I reuse Flex-box documentation for Grid)
  2. What do (justify-)content, self and items do?
  3. How are (justify-)content, self and items different?

Any clarification would be greatly appreciated.

Edit: Since everyone keeps giving me Flex-box resources, I am asking about css-grid, NOT flex-box.

Arredondo answered 31/1, 2018 at 6:11 Comment(5)
Flexbox has no justify-items attribute. Since justify-items for grid is for the main axis, maybe you're talking about justify-content?Unmoving
Possible duplicate of In CSS Flexbox, why are there no "justify-items" and "justify-self" properties?Vitreous
@Unmoving If you read the title in the question, I'm asking about CSS grid.Arredondo
if you read YOUR question #1, you are asking "Is the justify-items property in Flex-box..."Unmoving
@Unmoving You need to read the entire sentence to understand what the sentence is saying. Even then you might need to read surrounding sentences to gain a full understanding of the context.Provenance
M
137

To answer your questions:

1

As reiallenramos mentioned, "The justify-self and justify-items properties are not implemented in flexbox. This is due to the one-dimensional nature of flexbox, and that there may be multiple items along the axis, making it impossible to justify a single item. To align items along the main, inline axis in flexbox you use the justify-content property." - MDN

2-3

This screen shot from W3 does an excellent job of showing what they do and the differences between them. enter image description here

Good To Knows:

For more information and example, I would suggest you check out:

And for some inspiration:

Minter answered 31/1, 2018 at 23:28 Comment(3)
You've provided a quote about flexbox. The question is asking about grid. The quote may also apply to grid, but you haven't stated that.Lachman
The image from W3 is not clear.Failure
FYI when I answered this question it was not specifically asking about CSS grid. Just to be clear this does also apply to CSS grid.Minter
E
111

Key differences between justify-content, justify-items and justify-self in CSS Grid:

  • The justify-content property controls the alignment of grid columns. It is set on the grid container. It does not apply to or control the alignment of grid items.
  • The justify-items property controls the alignment of grid items. It is set on the grid container.
  • The justify-self property overrides justify-items on individual items. It is set on grid items and inherits the value of justify-items, by default.

Example

Here's a 2x3 grid.

  • 2 columns, each 100px wide
  • 3 rows, each 50px tall

The container is:

  • 500px wide
  • 250px tall

enter image description here

.container {
    display: grid;
    grid-template-columns: 100px 100px;
    grid-template-rows: 50px 50px 50px;
    width: 500px;
    height: 250px;
    grid-template-areas: " one two"
                         " three four"
                         " five six ";
}

.box:nth-child(1) {  grid-area: one;   }
.box:nth-child(2) {  grid-area: two;   }
.box:nth-child(3) {  grid-area: three; }
.box:nth-child(4) {  grid-area: four;  }
.box:nth-child(5) {  grid-area: five;  }
.box:nth-child(6) {  grid-area: six;   }

/* non-essential decorative styles */
body {
    display: flex;
    justify-content: center;
}
.container {
    background-color: #ddd;
    border: 1px solid #aaa;
}
.box {
    background-color: lightgreen;
    border: 1px solid gray;
    display: flex;
    justify-content: center;
    align-items: center;
    font-size: 1.2em;
}
<div class="container">
    <div class="box"><span>1</span></div>
    <div class="box"><span>2</span></div>
    <div class="box"><span>3</span></div>
    <div class="box"><span>4</span></div>
    <div class="box"><span>5</span></div>
    <div class="box"><span>6</span></div>    
</div>

justify-content

The justify-content property aligns columns within the container.

enter image description here

.container {
  justify-content: space-between;
}

.container {
    display: grid;
    grid-template-columns: 100px 100px;
    grid-template-rows: 50px 50px 50px;
    width: 500px;
    height: 250px;
    grid-template-areas: " one two"
                         " three four"
                         " five six ";
}

.box:nth-child(1) {  grid-area: one;   }
.box:nth-child(2) {  grid-area: two;   }
.box:nth-child(3) {  grid-area: three; }
.box:nth-child(4) {  grid-area: four;  }
.box:nth-child(5) {  grid-area: five;  }
.box:nth-child(6) {  grid-area: six;   }

/* non-essential decorative styles */
body {
    display: flex;
    justify-content: center;
}
.container {
    background-color: #ddd;
    border: 1px solid #aaa;
}
.box {
    background-color: lightgreen;
    border: 1px solid gray;
    display: flex;
    justify-content: center;
    align-items: center;
    font-size: 1.2em;
}
<div class="container">
    <div class="box"><span>1</span></div>
    <div class="box"><span>2</span></div>
    <div class="box"><span>3</span></div>
    <div class="box"><span>4</span></div>
    <div class="box"><span>5</span></div>
    <div class="box"><span>6</span></div>    
</div>

With justify-content: space-between both columns are pinned to the edges. The grid items shift only because they exist inside those columns. They are otherwise unaffected.

Note that this property works only when there is free space in the container. If any of the columns were sized with fr, then all free space would be consumed, and justify-content would have no effect.


justify-items

The justify-items property aligns grid items within their tracks (not the entire container)

enter image description here

.container {
  justify-items: center;
}

.container {
    display: grid;
    grid-template-columns: 100px 100px;
    grid-template-rows: 50px 50px 50px;
    width: 500px;
    height: 250px;
    grid-template-areas: " one two"
                         " three four"
                         " five six ";
}

.box:nth-child(1) {  grid-area: one;   }
.box:nth-child(2) {  grid-area: two;   }
.box:nth-child(3) {  grid-area: three; }
.box:nth-child(4) {  grid-area: four;  }
.box:nth-child(5) {  grid-area: five;  }
.box:nth-child(6) {  grid-area: six;   }

/* non-essential decorative styles */
body {
    display: flex;
    justify-content: center;
}
.container {
    background-color: #ddd;
    border: 1px solid #aaa;
}
.box {
    background-color: lightgreen;
    border: 1px solid gray;
    display: flex;
    justify-content: center;
    align-items: center;
    font-size: 1.2em;
}
<div class="container">
    <div class="box"><span>1</span></div>
    <div class="box"><span>2</span></div>
    <div class="box"><span>3</span></div>
    <div class="box"><span>4</span></div>
    <div class="box"><span>5</span></div>
    <div class="box"><span>6</span></div>    
</div>

With justify-items: center the grid items are centered within their columns.


justify-self

The justify-self property overrides justify-items on individual items.

enter image description here

.container        { justify-items: center;}
.box:nth-child(2) { justify-self: start; }
.box:nth-child(3) { justify-self: end; }
.box:nth-child(6) { justify-self: stretch; }


.container {
    display: grid;
    grid-template-columns: 100px 100px;
    grid-template-rows: 50px 50px 50px;
    width: 500px;
    height: 250px;
    grid-template-areas: " one two"
                         " three four"
                         " five six ";
}

.box:nth-child(1) {  grid-area: one;   }
.box:nth-child(2) {  grid-area: two;   }
.box:nth-child(3) {  grid-area: three; }
.box:nth-child(4) {  grid-area: four;  }
.box:nth-child(5) {  grid-area: five;  }
.box:nth-child(6) {  grid-area: six;   }

/* non-essential decorative styles */
body {
    display: flex;
    justify-content: center;
}
.container {
    background-color: #ddd;
    border: 1px solid #aaa;
}
.box {
    background-color: lightgreen;
    border: 1px solid gray;
    display: flex;
    justify-content: center;
    align-items: center;
    font-size: 1.2em;
}
<div class="container">
    <div class="box"><span>1</span></div>
    <div class="box"><span>2</span></div>
    <div class="box"><span>3</span></div>
    <div class="box"><span>4</span></div>
    <div class="box"><span>5</span></div>
    <div class="box"><span>6</span></div>    
</div>

align-content, align-items and align-self

These properties do the same as their justify-* counterparts, but in the perpendicular direction.

More here: What is the difference between align-items vs. align-content in Grid Layout?


Spec Reference

10.3. Row-axis Alignment: the justify-self and justify-items properties

Grid items can be aligned in the inline dimension by using the justify-self property on the grid item or justify-items property on the grid container.

10.4. Column-axis Alignment: the align-self and align-items properties

Grid items can also be aligned in the block dimension (perpendicular to the inline dimension) by using the align-self property on the grid item or align-items property on the grid container.

10.5. Aligning the Grid: the justify-content and align-content properties

If the grid’s outer edges do not correspond to the grid container’s content edges (for example, if no columns are flex-sized), the grid tracks are aligned within the content box according to the justify-content and align-content properties on the grid container.

(emphasis added)


CSS Box Alignment Module

You wrote:

Is the justify-items property in Flex-box the same as the justify-items property in Grid?

Although the Flex and Grid specs provide their own definitions for keyword alignment properties, such as justify-items and align-content, the W3C is in the process of phasing out alignment properties for individual box models and implementing their new Box Alignment Module, which seeks to define a set of alignment properties for use across all box models.

From the flexbox spec:

1.2. Module interactions

The CSS Box Alignment Module extends and supercedes the definitions of the alignment properties (justify-content, align-items, align-self, align-content) introduced here.

There are similar references in the Grid spec.

Emelia answered 1/2, 2018 at 21:19 Comment(2)
This should be accepted answer. It will be better if you doing center for all examples, not 1 center, 1 leftFailure
First time I've actually seen this concept explained well. Thanx a lot for a beatiful explanation!Cousingerman
A
4

OK, I think I figured it out thanks to Michael_B. My confusion came from the fact that sometimes different properties would randomly not change anything about the layout of the grid.

justify-content allows you to position the grid within it's grid container. This is why the justify-content property will have no effect if the grid-container is the same size as the grid. (Which is always the case if you use fr units). This is also why it can have the values: space-around, space-between and space-evenly (In addition to start, end, centre and stretch), which will break up the grid and place the grid items within the grid container. This is a property of the grid container.

justify-items allows you to set a default position for content placed in the grid's grid items (A grid item being a box in the grid, as defined in Michael_B's post). This is a property of the grid container.

justify-self allows you to override the default position of content in an individual cell. This will override the position set by justify-items. Hence, if you use justify-self on all children of the container, setting justify-items on the grid container will have no effect. This is a property of the content inside a grid item.

Note: If you make a grid-item a grid itself, (In other words, the content inside a grid item is a grid) then you can position it within the outer grid item using either the justify-self property or the justify-content property on the inner grid's grid container, since the inner-grid's grid container is one of the outer grid's grid items's content.

As you might expect, all of this also applies to the align-* properties.

Please correct me if I got anything wrong

Arredondo answered 31/1, 2018 at 23:44 Comment(0)
E
1

justify-content is used to position the entire grid along the row/inline axis of the grid container when the total size of the grid items is less than the grid container.

justify-items is used on a grid container and is used to determine how grid items are spread out along a row by setting the default justify-self property for all child boxes.

justify-self is used to set how an individual grid item positions itself along the row/inline axis. Grid items inherit the value of the justify-items property on the container by default, so if the justify-self value is set, it would override the inherited justify-items value.

Source: Codecademy CSS Grid cheatsheet

Experience answered 15/2, 2021 at 2:31 Comment(0)
C
-1

Justify changes left to right (row placement), align changes up and down (column placement), items changes all pieces inside a div, content changes the div as a whole, self changes one specific piece.

Centering answered 5/6, 2023 at 10:1 Comment(1)
Your answer could be improved with additional supporting information. Please edit to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers in the help center.Charlenecharleroi

© 2022 - 2024 — McMap. All rights reserved.