<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Notflix by Andrew Tran</title>
<link rel="stylesheet" href="style.css">
<link rel="stylesheet" href="base.css">
<script src="https://kit.fontawesome.com/a0043d9bc2.js" crossorigin="anonymous"></script>
</head>
<body>
<h1 class="logo">Notflix</h1>
<div class="container">
<button type="button" id="moveLeft" class="btn-nav">
ᐊ
</button>
<div class="container-indicators">
<div class="indicator active" data-index=0></div>
<div class="indicator" data-index=1></div>
<div class="indicator" data-index=2></div>
</div>
<div class="slider" id="mySlider">
<div class="movie" id="movie0">
<img
src="https://images.unsplash.com/photo-1585951237318-9ea5e175b891?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=1350&q=80"
alt="" srcset="">
<div class="description">
<div class="description__buttons-container">
<div class="description__button"><i class="fas fa-play"></i></div>
<div class="description__button"><i class="fas fa-plus"></i></div>
<div class="description__button"><i class="fas fa-thumbs-up"></i></div>
<div class="description__button"><i class="fas fa-thumbs-down"></i></div>
<div class="description__button"><i class="fas fa-chevron-down"></i></div>
</div>
<div class="description__text-container">
<span class="description__match">97% Match</span>
<span class="description__rating">TV-14</span>
<span class="description__length">2h 11m</span>
<br><br>
<span>Explosive</span>
<span>·</span>
<span>Exciting</span>
<span>·</span>
<span>Family</span>
</div>
</div>
</div>
</div>
<button type="button" id="moveRight" class="btn-nav">
ᐅ
</button>
</div>
<script src="script.js"></script>
</body>
</html>
/*
*
* Boiler Plate stuff
*
*********************************/
:root {
--movie-width: 15.5vw;
--movie-height: 200px;
--arrow-width: 50px;
--slider-py: 200px;
}
@media only screen and (max-width: 1000px) {
:root {
--movie-width: 25vw;
}
}
body {
background-color: #141414;
font-family: "Heebo", sans-serif;
}
.container {
position: relative;
}
.logo {
color: red;
font-size: 4rem;
text-align: center;
}
/*
*
* THE SLIDER CONTAINER
*
*********************************/
.slider {
width: 100%;
overflow-x: scroll;
overflow-y: visible;
white-space: nowrap;
position: relative;
padding-top: var(--slider-py);
padding-bottom: var(--slider-py);
}
/*
*
* SLIDER INDICATORS
*
*********************************/
.container-indicators {
width: 100px;
position: absolute;
right: 0;
top: calc(var(--slider-py) - 60px);
visibility: hidden;
}
.indicator {
width: 15px;
height: 2px;
background-color: grey;
display: inline-block;
}
.indicator.active {
background-color: white;
}
/*
*
* MOVIE ELEMENTS!
*
*********************************/
.movie {
width: var(--movie-width);
height: var(--movie-height);
display: inline-block;
position: relative;
color: white;
padding: 0 2px;
font-size: 0.8rem;
transition: all 0.8s ease-in-out;
}
.movie:nth-of-type(1) {
margin-left: var(--arrow-width);
}
.movie img {
object-fit: cover;
height: 100%;
width: 100%;
border-radius: 10px;
}
.description {
position: absolute;
display: none;
z-index: 9999;
background-color: #272727;
width: var(--movie-width);
margin-top: -10px;
padding: 10px 0;
border-bottom-left-radius: 10px;
border-bottom-right-radius: 10px;
}
@media only screen and (min-width: 900px) {
.movie:hover {
transform: scale(1.3);
z-index: 2;
}
/* Make description visible when movie is hovered */
.movie:hover > .description {
display: block;
}
.movie:hover > img {
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
}
}
.description__buttons-container {
display: flex;
flex-direction: row;
padding: 10px;
}
.description__text-container {
padding: 10px;
}
.description__match {
color: green;
}
.description__rating {
outline: 1px solid white;
padding: 0 3px;
margin: 0 5px;
}
.description__button {
display: flex;
align-items: center;
justify-content: center;
width: 20px;
height: 20px;
border: 2px solid white;
text-align: center;
font-size: 8px;
margin-right: 5px;
border-radius: 100%;
}
.description__button:hover {
border-color: grey;
color: grey;
cursor: pointer;
}
.description__button:nth-of-type(5) {
margin-left: auto;
margin-right: 0;
}
/*
*
* BUTTONS
*
*********************************/
.btn-nav {
width: var(--arrow-width);
height: var(--movie-height);
border-radius: 5px;
position: absolute;
bottom: 0;
background-color: rgba(0, 0, 0, 0.3);
outline: none;
border: none;
color: white;
top: var(--slider-py);
z-index: 5;
visibility: hidden;
}
#moveLeft {
left: 0;
}
#moveRight {
right: 0;
}
@media only screen and (max-width: 900px) {
.btn-nav {
display: none;
}
}
@media only screen and (min-width: 901px) {
.container:hover .btn-nav,
.container:hover .container-indicators {
visibility: visible;
}
}
const slider = document.querySelector(".slider");
const btnLeft = document.getElementById("moveLeft");
const btnRight = document.getElementById("moveRight");
const indicators = document.querySelectorAll(".indicator");
let baseSliderWidth = slider.offsetWidth;
let activeIndex = 0; // the current page on the slider
let movies = [
{
src:
"https://images.unsplash.com/photo-1585951237318-9ea5e175b891?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=1350&q=80",
},
{
src:
"https://images.unsplash.com/photo-1579566346927-c68383817a25?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=1350&q=80",
},
{
src:
"https://images.unsplash.com/photo-1594736797933-d0501ba2fe65?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=674&q=80",
},
{
src:
"https://images.unsplash.com/photo-1617182635496-c5c474367085?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=634&q=80",
},
{
src:
"https://images.unsplash.com/photo-1611419010196-a360856fc42f?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=700&q=80",
},
{
src:
"https://images.unsplash.com/photo-1528495612343-9ca9f4a4de28?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=1267&q=80",
},
{
src:
"https://images.unsplash.com/photo-1518715303843-586e350765b2?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=1350&q=80",
},
{
src:
"https://images.unsplash.com/photo-1617258683488-df59909f25f0?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=644&q=80",
},
{
src:
"https://images.unsplash.com/photo-1543862809-2c9e0bcdc075?ixlib=rb-1.2.1&ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&auto=format&fit=crop&w=564&q=80",
},
{
src:
"https://images.unsplash.com/photo-1579156412503-f22426cc6386?ixlib=rb-1.2.1&ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&auto=format&fit=crop&w=1352&q=80",
},
{
src:
"https://images.unsplash.com/photo-1514068574489-503a8eb91592?ixlib=rb-1.2.1&ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&auto=format&fit=crop&w=1390&q=80",
},
{
src:
"https://images.unsplash.com/photo-1521714161819-15534968fc5f?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=1350&q=80",
},
{
src:
"https://images.unsplash.com/photo-1572188863110-46d457c9234d?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=1350&q=80",
},
{
src:
"https://images.unsplash.com/photo-1579702455224-c0dd4ac78234?ixlib=rb-1.2.1&ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&auto=format&fit=crop&w=1369&q=80",
},
{
src:
"https://images.unsplash.com/photo-1575470180257-7183ddca844f?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=701&q=80",
},
{
src:
"https://images.unsplash.com/photo-1584253660192-de72b033c220?ixlib=rb-1.2.1&ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&auto=format&fit=crop&w=1350&q=80",
},
{
src:
"https://images.unsplash.com/photo-1611523792722-16952e48cffa?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=700&q=80",
},
{
src:
"https://images.unsplash.com/photo-1536300007881-7e482242baa5?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=1350&q=80",
},
];
// Fill the slider with all the movies in the "movies" array
function populateSlider() {
movies.forEach((image) => {
// Clone the initial movie thats included in the html, then replace the image with a different one
const newMovie = document.getElementById("movie0");
let clone = newMovie.cloneNode(true);
let img = clone.querySelector("img");
img.src = image.src;
slider.insertBefore(clone, slider.childNodes[slider.childNodes.length - 1]);
});
}
populateSlider();
populateSlider();
// delete the initial movie in the html
const initialMovie = document.getElementById("movie0");
initialMovie.remove();
// Update the indicators that show which page we're currently on
function updateIndicators(index) {
indicators.forEach((indicator) => {
indicator.classList.remove("active");
});
let newActiveIndicator = indicators[index];
newActiveIndicator.classList.add("active");
}
// Scroll Left button
btnLeft.addEventListener("click", (e) => {
let movieWidth = document.querySelector(".movie").getBoundingClientRect()
.width;
let scrollDistance = movieWidth * 6; // Scroll the length of 6 movies. TODO: make work for mobile because (4 movies/page instead of 6)
slider.scrollBy({
top: 0,
left: -scrollDistance,
behavior: "smooth",
});
activeIndex = (activeIndex - 1) % 3;
console.log(activeIndex);
updateIndicators(activeIndex);
});
// Scroll Right button
btnRight.addEventListener("click", (e) => {
let movieWidth = document.querySelector(".movie").getBoundingClientRect()
.width;
let scrollDistance = movieWidth * 6; // Scroll the length of 6 movies. TODO: make work for mobile because (4 movies/page instead of 6)
console.log(`movieWidth = ${movieWidth}`);
console.log(`scrolling right ${scrollDistance}`);
// if we're on the last page
if (activeIndex == 2) {
// duplicate all the items in the slider (this is how we make 'looping' slider)
populateSlider();
slider.scrollBy({
top: 0,
left: +scrollDistance,
behavior: "smooth",
});
activeIndex = 0;
updateIndicators(activeIndex);
} else {
slider.scrollBy({
top: 0,
left: +scrollDistance,
behavior: "smooth",
});
activeIndex = (activeIndex + 1) % 3;
console.log(activeIndex);
updateIndicators(activeIndex);
}
});
// slider.addEventListener("scroll", (e) => {
// console.log(slider.scrollLeft);
// console.log(slider.offsetWidth);
// });
This Pen doesn't use any external CSS resources.
This Pen doesn't use any external JavaScript resources.