Learn how to create a portfolio gallery with filtering” with HTML, CSS, and JavaScript
HTML Code (index.html):
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="description" content="Learn how to create an interactive portfolio gallery with filtering options using HTML, CSS, and JavaScript. Display and categorize your images for a more organized user experience."> <meta name="keywords" content="portfolio gallery, image filtering, interactive web design, HTML CSS JavaScript, portfolio tutorial, web development, responsive gallery, image filter, portfolio website, web design techniques"> <meta name="author" content="Your Name"> <meta property="og:title" content="Create a Portfolio Gallery with Filtering in HTML & CSS"> <meta property="og:description" content="Create an interactive portfolio gallery with filtering options using HTML, CSS, and JavaScript. Learn how to categorize images and enhance the user experience on your portfolio website."> <meta property="og:image" content="image.jpg"> <meta property="og:url" content="yourwebsite.com"> <meta name="twitter:title" content="Create a Portfolio Gallery with Filtering in HTML & CSS"> <meta name="twitter:description" content="Build a professional portfolio gallery with filtering options using HTML, CSS, and JavaScript. Organize and showcase your work effectively."> <meta name="twitter:image" content="image.jpg"> <meta name="twitter:card" content="summary_large_image"> <title>Create a Portfolio Gallery with Filtering in HTML & CSS</title> <link rel="stylesheet" href="style.css"> </head> <body> <!-- MAIN (Center website) --> <div class="main"> <h1>MYLOGO.COM</h1> <hr> <h2>PORTFOLIO</h2> <div id="myBtnContainer"> <button class="btn active" onclick="filterSelection('all')"> Show all</button> <button class="btn" onclick="filterSelection('nature')"> Nature</button> <button class="btn" onclick="filterSelection('cars')"> Cars</button> <button class="btn" onclick="filterSelection('people')"> People</button> </div> <!-- Portfolio Gallery Grid --> <div class="row"> <div class="column nature"> <div class="content"> <img src="/w3images/mountains.jpg" alt="Mountains" style="width:100%"> <h4>Mountains</h4> <p>Lorem ipsum dolor..</p> </div> </div> <div class="column nature"> <div class="content"> <img src="/w3images/lights.jpg" alt="Lights" style="width:100%"> <h4>Lights</h4> <p>Lorem ipsum dolor..</p> </div> </div> <div class="column nature"> <div class="content"> <img src="/w3images/nature.jpg" alt="Nature" style="width:100%"> <h4>Forest</h4> <p>Lorem ipsum dolor..</p> </div> </div> <div class="column cars"> <div class="content"> <img src="/w3images/cars1.jpg" alt="Car" style="width:100%"> <h4>Retro</h4> <p>Lorem ipsum dolor..</p> </div> </div> <div class="column cars"> <div class="content"> <img src="/w3images/cars2.jpg" alt="Car" style="width:100%"> <h4>Fast</h4> <p>Lorem ipsum dolor..</p> </div> </div> <div class="column cars"> <div class="content"> <img src="/w3images/cars3.jpg" alt="Car" style="width:100%"> <h4>Classic</h4> <p>Lorem ipsum dolor..</p> </div> </div> <div class="column people"> <div class="content"> <img src="/w3images/people1.jpg" alt="Car" style="width:100%"> <h4>Girl</h4> <p>Lorem ipsum dolor..</p> </div> </div> <div class="column people"> <div class="content"> <img src="/w3images/people2.jpg" alt="Car" style="width:100%"> <h4>Man</h4> <p>Lorem ipsum dolor..</p> </div> </div> <div class="column people"> <div class="content"> <img src="/w3images/people3.jpg" alt="Car" style="width:100%"> <h4>Woman</h4> <p>Lorem ipsum dolor..</p> </div> </div> </div> </div> <script> filterSelection("all") function filterSelection(c) { var x, i; x = document.getElementsByClassName("column"); if (c == "all") c = ""; for (i = 0; i < x.length; i++) { w3RemoveClass(x[i], "show"); if (x[i].className.indexOf(c) > -1) w3AddClass(x[i], "show"); } } function w3AddClass(element, name) { var i, arr1, arr2; arr1 = element.className.split(" "); arr2 = name.split(" "); for (i = 0; i < arr2.length; i++) { if (arr1.indexOf(arr2[i]) == -1) {element.className += " " + arr2[i];} } } function w3RemoveClass(element, name) { var i, arr1, arr2; arr1 = element.className.split(" "); arr2 = name.split(" "); for (i = 0; i < arr2.length; i++) { while (arr1.indexOf(arr2[i]) > -1) { arr1.splice(arr1.indexOf(arr2[i]), 1); } } element.className = arr1.join(" "); } var btnContainer = document.getElementById("myBtnContainer"); var btns = btnContainer.getElementsByClassName("btn"); for (var i = 0; i < btns.length; i++) { btns[i].addEventListener("click", function(){ var current = document.getElementsByClassName("active"); current[0].className = current[0].className.replace(" active", ""); this.className += " active"; }); } </script> </body> </html>
CSS Code (style.css):
* { box-sizing: border-box; } body { background-color: #f1f1f1; padding: 20px; font-family: Arial; } /* Center website */ .main { max-width: 1000px; margin: auto; } h1 { font-size: 50px; word-break: break-all; } .row { margin: 10px -16px; } /* Add padding BETWEEN each column */ .row, .row > .column { padding: 8px; } /* Create three equal columns that floats next to each other */ .column { float: left; width: 33.33%; display: none; /* Hide all elements by default */ } /* Clear floats after rows */ .row:after { content: ""; display: table; clear: both; } /* Content */ .content { background-color: white; padding: 10px; } /* The "show" class is added to the filtered elements */ .show { display: block; } /* Style the buttons */ .btn { border: none; outline: none; padding: 12px 16px; background-color: white; cursor: pointer; } .btn:hover { background-color: #ddd; } .btn.active { background-color: #666; color: white; }
Explanation:
-
HTML Structure:
- The HTML structure includes a header (
h1
) and buttons to filter images by category (nature, cars, people, all). - The images are organized in a grid with each image belonging to a category (such as
nature
,cars
,people
).
- The HTML structure includes a header (
-
CSS Styling:
- The CSS styles define the layout and make the gallery responsive. It uses grid-like columns (
.column
) to display images and apply filtering through JavaScript.
- The CSS styles define the layout and make the gallery responsive. It uses grid-like columns (
-
JavaScript Filtering:
- The JavaScript provides the filtering functionality. It uses the
filterSelection
function to display images by their category when the corresponding button is clicked. - The
show
class is added to the elements that match the selected filter, making them visible.
- The JavaScript provides the filtering functionality. It uses the
-
SEO Optimization:
- The meta title and description provide clear and concise information about the page’s content.
- Keywords like “portfolio gallery,” “image filtering,” and “interactive web design” are included to help search engines index the page effectively.