Gallery of photos. Working on width and height. Want vertical photos, not horizontal. Problem is, most have only horizontal photos. Not cool. Who holds their phone sideways to take a picture?
- Flexbox helps you design your webpage so that it looks good on any screen size.
- In this course, you'll use Flexbox to build a responsive photo gallery webpage.
Step 1
Begin with your standard HTML boilerplate. Add aDOCTYPE
declaration, anhtml
element, ahead
element, and abody
element.
Add thelang
attribute to the opening<html>
tag withen
set as the value.
#index.html
<!DOCTYPE html>
<html lang="en">
<head></head>
<body></body>
</html>
Step 2
Within yourhead
element, add ameta
tag with thename
set toviewport
and thecontent
set towidth=device-width, initial-scale=1
.
Also add ameta
tag with thecharset
set toUTF-8
.
#index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
</body>
</html>
Step 3
Within yourhead
element, add atitle
element with the text set toPhoto Gallery
, and alink
element to add yourstyles.css
file to the page.
#index.html
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Photo Gallery</title>
<link rel="stylesheet" href="./styles.css">
</head>
<body>
</body>
</html>
Step 4
Add aheader
element within thebody
element and assign a class ofheader
to it.
Inside theheader
, create anh1
withcss flexbox photo gallery
as the text.
#index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Photo Gallery</title>
<link rel="stylesheet" href="./styles.css">
</head>
<body>
<header class="header">
<h1>css flexbox photo gallery</h1>
</header>
</body>
</html>
Step 5
Below your.header
element, create a newdiv
element and assign it aclass
of"gallery"
. Thisdiv
will act as a container for the gallery images.
Inside that.gallery
element, create nineimg
elements.
#index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Photo Gallery</title>
<link rel="stylesheet" href="./styles.css">
</head>
<body>
<header class="header">
<h1>css flexbox photo gallery</h1>
</header>
<div class="gallery">
<img>
<img>
<img>
<img>
<img>
<img>
<img>
<img>
<img>
</div>
</body>
</html>
Step 6
Next, give eachimg
asrc
attribute according to its order in the document. The firstimg
should have asrc
ofhttps://cdn.freecodecamp.org/curriculum/css-photo-gallery/1.jpg
. The rest should be the same, except replace the1
with the number theimg
is in the document.
#index.html
<div class="gallery">
<img src="https://cdn.freecodecamp.org/curriculum/css-photo-gallery/1.jpg">
<img src="https://cdn.freecodecamp.org/curriculum/css-photo-gallery/2.jpg">
<img src="https://cdn.freecodecamp.org/curriculum/css-photo-gallery/3.jpg">
<img src="https://cdn.freecodecamp.org/curriculum/css-photo-gallery/4.jpg">
<img src="https://cdn.freecodecamp.org/curriculum/css-photo-gallery/5.jpg">
<img src="https://cdn.freecodecamp.org/curriculum/css-photo-gallery/6.jpg">
<img src="https://cdn.freecodecamp.org/curriculum/css-photo-gallery/7.jpg">
<img src="https://cdn.freecodecamp.org/curriculum/css-photo-gallery/8.jpg">
<img src="https://cdn.freecodecamp.org/curriculum/css-photo-gallery/9.jpg">
</div>
Step 7
Normalize your box model by creating a*
selector and setting thebox-sizing
property toborder-box
as the value.
#styles.css
* {
box-sizing: border-box;
}
Step 8
Your images are too big. Create a.gallery img
selector to target them. Give them all awidth
of100%
and amax-width
of350px
so they shrink as needed but don't get too big.
Also set theheight
property to300px
to keep your images a uniform size.
#styles.css
.gallery img {
width: 100%;
max-width: 350px;
height: 300px;
}
Step 9
Remove the margin from yourbody
element, set thefont-family
tosans-serif
, and give it abackground-color
of#f5f6f7
as the value.
#styles.css
body {
margin: 0;
font-family: sans-serif;
background-color: #f5f6f7;
}
Step 10
Align your.header
text in the center. Make the text uppercase using thetext-transform
property withuppercase
as the value.
Give it a padding of32px
on all sides. Set the background to#0a0a23
and the text to#fff
as the color values.
Add aborder-bottom
with4px solid #fdb347
as the value.
#styles.css
.header {
text-align: center;
text-transform: uppercase;
padding: 32px;
background-color: #0a0a23;
color: #fff;
border-bottom: 4px solid #fdb347;
}
Step 11
Flexbox is a one-dimensional CSS layout that can control the way items are spaced out and aligned within a container.
To use it, give an element adisplay
property offlex
. This will make the element a flex container. Any direct children of a flex container are called flex items.
Create a.gallery
selector and make it a flex container.
#styles.css
.gallery {
display: flex;
}
Step 12
Flexbox has a main and cross axis. The main axis is defined by theflex-direction
property, which has four possible values:
row
(default): horizontal axis with flex items from left to rightrow-reverse
: horizontal axis with flex items from right to leftcolumn
: vertical axis with flex items from top to bottomcolumn-reverse
: vertical axis with flex items from bottom to top
Note: The axes and directions will be different depending on the text direction. The values shown are for a left-to-right text direction.
Try the different values to see how they affect the layout.
When you are done, set an explicitflex-direction
ofrow
on the.gallery
element.
#styles.css
.gallery {
display: flex;
flex-direction: row;
}
Step 13
Theflex-wrap
property determines how your flex items behave when the flex container is too small. Setting it towrap
will allow the items to wrap to the next row or column.nowrap
(default) will prevent your items from wrapping and shrink them if needed.
Make it so your flex items wrap to the next row when they run out of space.
#styles.css
.gallery {
display: flex;
flex-direction: row;
flex-wrap: wrap;
}
Step 14
Thejustify-content
property determines how the items inside a flex container are positioned along the main axis, affecting their position and the space around them.
Give your.gallery
selector ajustify-content
property withcenter
as the value.
#styles.css
.gallery {
display: flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: center;
}
Step 15
Thealign-items
property positions the flex content along the cross axis. In this case, with yourflex-direction
set torow
, your cross axis would be vertical.
To vertically center your images, give your.gallery
selector analign-items
property withcenter
as the value.
#styles.css
.gallery {
display: flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: center;
align-items: center;
}
Step 16
Give your.gallery
selector apadding
property set to20px 10px
to create some space around the container.
Then, give it amax-width
of1400px
and add amargin
of0 auto
to center it.
#styles.css
.gallery {
display: flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: center;
align-items: center;
padding: 20px 10px;
max-width: 1400px;
margin: 0 auto;
}
Step 17
Notice how some of your images have become distorted. This is because the images have different aspect ratios. Rather than setting each aspect ratio individually, you can use theobject-fit
property to determine how images should behave.
Give your.gallery img
selector theobject-fit
property and set it tocover
. This will tell the image to fill theimg
container while maintaining aspect ratio, resulting in cropping to fit.
#styles.css
.gallery img {
width: 100%;
max-width: 350px;
height: 300px;
object-fit: cover;
}
Step 18
Your images need some space between them.
Thegap
CSS shorthand property sets the gaps, also knowns as gutters, between rows and columns. The gap property and itsrow-gap
andcolumn-gap
sub-properties provide this functionality for flex, grid, and multi-column layout. You apply the property to the container element.
Give your.gallery
flex container agap
property with16px
as the value.
#styles.css
.gallery {
display: flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: center;
align-items: center;
max-width: 1400px;
margin: 0 auto;
padding: 20px 10px;
gap: 16px;
}
Step 19
Smooth out your images a bit by giving the.gallery img
selector aborder-radius
property with10px
set as the value.
#styles.css
.gallery img {
width: 100%;
max-width: 350px;
height: 300px;
object-fit: cover;
border-radius: 10px;
}
Step 20
The::after
pseudo-element creates an element that is the last child of the selected element. We can use it to add an empty element after the last image. If we give it the samewidth
as the images it will push the last image to the left when the gallery is in a two-column layout. Right now, it is in the center because we setjustify-content: center
on the flex container.
Example:#styles.css .container::after { content: ""; width: 860px; }Create a new selector using an
::after
pseudo-element on the.gallery
element. Add acontent
property set to an empty string""
and350px
set for thewidth
property.
#styles.css
.gallery::after {
content: "";
width: 350px;
}
Step 21
Thealt
image attribute should describe the image content. Screen readers announce the alternative text in place of images. If the image can't be loaded, this text is presented in place of the image.
To complete the project, add analt
attribute to all nine of your cat images to describe them. Use a value at least five characters long for each.
#index.html
<img src="https://cdn.freecodecamp.org/curriculum/css-photo-gallery/1.jpg" alt="image-1">
<img src="https://cdn.freecodecamp.org/curriculum/css-photo-gallery/2.jpg" alt="image-2">
<img src="https://cdn.freecodecamp.org/curriculum/css-photo-gallery/3.jpg" alt="image-3">
<img src="https://cdn.freecodecamp.org/curriculum/css-photo-gallery/4.jpg" alt="image-4">
<img src="https://cdn.freecodecamp.org/curriculum/css-photo-gallery/5.jpg" alt="image-5">
<img src="https://cdn.freecodecamp.org/curriculum/css-photo-gallery/6.jpg" alt="image-6">
<img src="https://cdn.freecodecamp.org/curriculum/css-photo-gallery/7.jpg" alt="image-7">
<img src="https://cdn.freecodecamp.org/curriculum/css-photo-gallery/8.jpg" alt="image-8">
<img src="https://cdn.freecodecamp.org/curriculum/css-photo-gallery/9.jpg" alt="image-9">