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 aDOCTYPEdeclaration, anhtmlelement, aheadelement, and abodyelement.
Add thelangattribute to the opening<html>tag withenset as the value.
#index.html
<!DOCTYPE html>
<html lang="en">
<head></head>
<body></body>
</html>Step 2
Within yourheadelement, add ametatag with thenameset toviewportand thecontentset towidth=device-width, initial-scale=1.
Also add ametatag with thecharsetset 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 yourheadelement, add atitleelement with the text set toPhoto Gallery, and alinkelement to add yourstyles.cssfile 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 aheaderelement within thebodyelement and assign a class ofheaderto it.
Inside theheader, create anh1withcss flexbox photo galleryas 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.headerelement, create a newdivelement and assign it aclassof"gallery". Thisdivwill act as a container for the gallery images.
Inside that.galleryelement, create nineimgelements.
#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 eachimgasrcattribute according to its order in the document. The firstimgshould have asrcofhttps://cdn.freecodecamp.org/curriculum/css-photo-gallery/1.jpg. The rest should be the same, except replace the1with the number theimgis 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-sizingproperty toborder-boxas the value.
#styles.css
* {
box-sizing: border-box;
}Step 8
Your images are too big. Create a.gallery imgselector to target them. Give them all awidthof100%and amax-widthof350pxso they shrink as needed but don't get too big.
Also set theheightproperty to300pxto keep your images a uniform size.
#styles.css
.gallery img {
width: 100%;
max-width: 350px;
height: 300px;
}Step 9
Remove the margin from yourbodyelement, set thefont-familytosans-serif, and give it abackground-colorof#f5f6f7as the value.
#styles.css
body {
margin: 0;
font-family: sans-serif;
background-color: #f5f6f7;
}Step 10
Align your.headertext in the center. Make the text uppercase using thetext-transformproperty withuppercaseas the value.
Give it a padding of32pxon all sides. Set the background to#0a0a23and the text to#fffas the color values.
Add aborder-bottomwith4px solid #fdb347as 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 adisplayproperty offlex. This will make the element a flex container. Any direct children of a flex container are called flex items.
Create a.galleryselector 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-directionproperty, 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-directionofrowon the.galleryelement.
#styles.css
.gallery {
display: flex;
flex-direction: row;
}Step 13
Theflex-wrapproperty determines how your flex items behave when the flex container is too small. Setting it towrapwill 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-contentproperty determines how the items inside a flex container are positioned along the main axis, affecting their position and the space around them.
Give your.galleryselector ajustify-contentproperty withcenteras the value.
#styles.css
.gallery {
display: flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: center;
}Step 15
Thealign-itemsproperty positions the flex content along the cross axis. In this case, with yourflex-directionset torow, your cross axis would be vertical.
To vertically center your images, give your.galleryselector analign-itemsproperty withcenteras the value.
#styles.css
.gallery {
display: flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: center;
align-items: center;
}Step 16
Give your.galleryselector apaddingproperty set to20px 10pxto create some space around the container.
Then, give it amax-widthof1400pxand add amarginof0 autoto 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-fitproperty to determine how images should behave.
Give your.gallery imgselector theobject-fitproperty and set it tocover. This will tell the image to fill theimgcontainer 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.
ThegapCSS shorthand property sets the gaps, also knowns as gutters, between rows and columns. The gap property and itsrow-gapandcolumn-gapsub-properties provide this functionality for flex, grid, and multi-column layout. You apply the property to the container element.
Give your.galleryflex container agapproperty with16pxas 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 imgselector aborder-radiusproperty with10pxset as the value.
#styles.css
.gallery img {
width: 100%;
max-width: 350px;
height: 300px;
object-fit: cover;
border-radius: 10px;
}Step 20
The::afterpseudo-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 samewidthas 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: centeron the flex container.
Example:#styles.css .container::after { content: ""; width: 860px; }Create a new selector using an
::afterpseudo-element on the.galleryelement. Add acontentproperty set to an empty string""and350pxset for thewidthproperty.
#styles.css
.gallery::after {
content: "";
width: 350px;
}Step 21
Thealtimage 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 analtattribute 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">