📘 Premium Read: Access my best content on Medium member-only articles — deep dives into Java, Spring Boot, Microservices, backend architecture, interview preparation, career advice, and industry-standard best practices.
🎓 Top 15 Udemy Courses (80-90% Discount): My Udemy Courses - Ramesh Fadatare — All my Udemy courses are real-time and project oriented courses.
▶️ Subscribe to My YouTube Channel (176K+ subscribers): Java Guides on YouTube
▶️ For AI, ChatGPT, Web, Tech, and Generative AI, subscribe to another channel: Ramesh Fadatare on YouTube
This tutorial will guide you through creating a Movie App using JavaScript, HTML, and CSS, leveraging the powerful The Movie Database (TMDB) API. This app will feature a sleek interface for users to search for movies and view details like titles, posters, ratings, and overviews.
Feature Highlights
Dynamic Movie Display: Movies are displayed in a grid, with each card containing the movie's poster, title, rating, and brief overview.
Search Functionality: Users can search for movies using the search bar in the header. The app fetches and displays results based on the user's query.
Rating-based Color Coding: Movie ratings are highlighted in green, orange, or red, providing an intuitive visual cue about the movie's general reception.
Project Setup
- index.html: Contains the markup for the application.
- style.css: Styles the application.
- script.js: Contains the logic of the Movie application.
Development Steps
1. HTML Markup (index.html)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link rel="stylesheet" href="style.css" /> <title>Movie App</title> </head> <body> <header> <form id="form"> <input type="text" id="search" class="search" placeholder="Search"> </form> </header> <main id="main"></main> <script src="script.js"></script> </body> </html>
The HTML document sets up a simple yet functional structure for our movie app. It consists of a header with a form for the search functionality and a main section to display the movie information. 2. style.css - CSS Styling
@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@200;400&display=swap'); :root { --primary-color: #22254b; --secondary-color: #373b69; } * { box-sizing: border-box; } body { background-color: var(--primary-color); font-family: 'Poppins', sans-serif; margin: 0; } header { padding: 1rem; display: flex; justify-content: flex-end; background-color: var(--secondary-color); } .search { background-color: transparent; border: 2px solid var(--primary-color); border-radius: 50px; font-family: inherit; font-size: 1rem; padding: 0.5rem 1rem; color: #fff; } .search::placeholder { color: #7378c5; } .search:focus { outline: none; background-color: var(--primary-color); } main { display: flex; flex-wrap: wrap; justify-content: center; } .movie { width: 300px; margin: 1rem; background-color: var(--secondary-color); box-shadow: 0 4px 5px rgba(0, 0, 0, 0.2); position: relative; overflow: hidden; border-radius: 3px; } .movie img { width: 100%; } .movie-info { color: #eee; display: flex; align-items: center; justify-content: space-between; gap:0.2rem; padding: 0.5rem 1rem 1rem; letter-spacing: 0.5px; } .movie-info h3 { margin-top: 0; } .movie-info span { background-color: var(--primary-color); padding: 0.25rem 0.5rem; border-radius: 3px; font-weight: bold; } .movie-info span.green { color: lightgreen; } .movie-info span.orange { color: orange; } .movie-info span.red { color: red; } .overview { background-color: #fff; padding: 2rem; position: absolute; left: 0; bottom: 0; right: 0; max-height: 100%; transform: translateY(101%); overflow-y: auto; transition: transform 0.3s ease-in; } .movie:hover .overview { transform: translateY(0); }
These styles not only enhance the usability of the app but also provide a visually engaging experience for users. 3. script.js - JavaScript Functionality
const API_URL = 'https://api.themoviedb.org/3/discover/movie?sort_by=popularity.desc&api_key=3fd2be6f0c70a2a598f084ddfb75487c&page=1' const IMG_PATH = 'https://image.tmdb.org/t/p/w1280' const SEARCH_API = 'https://api.themoviedb.org/3/search/movie?api_key=3fd2be6f0c70a2a598f084ddfb75487c&query="' const main = document.getElementById('main') const form = document.getElementById('form') const search = document.getElementById('search') // Get initial movies getMovies(API_URL) async function getMovies(url) { const res = await fetch(url) const data = await res.json() showMovies(data.results) } function showMovies(movies) { main.innerHTML = '' movies.forEach((movie) => { const { title, poster_path, vote_average, overview } = movie const movieEl = document.createElement('div') movieEl.classList.add('movie') movieEl.innerHTML = ` <img src="${IMG_PATH + poster_path}" alt="${title}"> <div class="movie-info"> <h3>${title}</h3> <span class="${getClassByRate(vote_average)}">${vote_average}</span> </div> <div class="overview"> <h3>Overview</h3> ${overview} </div> ` main.appendChild(movieEl) }) } function getClassByRate(vote) { if(vote >= 8) { return 'green' } else if(vote >= 5) { return 'orange' } else { return 'red' } } form.addEventListener('submit', (e) => { e.preventDefault() const searchTerm = search.value if(searchTerm && searchTerm !== '') { getMovies(SEARCH_API + searchTerm) search.value = '' } else { window.location.reload() } })
The showMovies function iterates over the movie data, creating HTML elements for each movie and injecting them into the main section. It cleverly uses the getClassByRate function to assign color-coded classes based on the movie's rating, enhancing the user's ability to gauge a movie's reception at a glance.
Comments
Post a Comment
Leave Comment