Recreate: Spotify (part 4) - Home page
tsanak
Posted on March 15, 2020
Intro
Welcome back to the Recreate Spotify Series! In this part I will recreate the main section of the homepage.
If you have any recommendations or you think that I could do anything differently feel free to leave a comment 馃檪.
A sneak peek of the result:
and a closer look 馃憖:
The starting point 馃弫
As always, the first step is to split the design to smaller chunks. Looking at the main section of the home page, I mark all the new components.
You can see the new components marked in the picture below:
Code 馃捇
If you want to follow along, you can find the code from the part 3 (Search page) of the series in this Github gist and the part 2 (Header & Sidebar) in this Github gist.
Structure
I will start by adding the html code for the section head and section body. Inside the section head there could be the following items:
- A title
- A subtitle
- A 'VIEW MORE' link
<main>
<section class="section">
<div class="section--header">
<div class="section--header--left">
<h2 class="title">螁魏慰蠀蟽蔚蟼 蟺蟻蠈蟽蠁伪蟿伪</h2>
</div>
<div class="section--header--right">
<a href="#" class="section--header--right--more">VIEW ALL</a>
</div>
</div>
<div class="section--body">
<div class="section--body--item album--item">
<div class="section--body--item--img">
<img src="http://via.placeholder.com/150x150" alt="">
</div>
<p class="section--body--item--title">Album name</p>
<p class="section--body--item--subtitle"><a href="#">Artist name</a></p>
<div class="section--body--item--play">
<i class="lni lni-play"></i>
</div>
</div>
<div class="section--body--item artist--item">
<div class="section--body--item--img">
<img src="http://via.placeholder.com/150x150" alt="">
</div>
<p class="section--body--item--title">LEX</p>
<p class="section--body--item--subtitle">Artist</p>
<div class="section--body--item--play">
<i class="lni lni-play"></i>
</div>
</div>
</div>
</section>
</main>
This is how the section looks without any added styles:
Styling
main .section .subtitle {
color: #b3b3b3;
font-size: 1rem;
margin-top: -8px;
font-weight: 100;
}
.section--header {
display: flex;
justify-content: space-between;
}
a.section--header--right--more,
.section--body--item--subtitle,
.section--body--item--subtitle a {
color: #b3b3b3;
font-size: 0.8rem;
text-decoration: none;
}
a.section--header--right--more:hover,
.section--body--item--subtitle a:hover {
border-bottom: 1px solid #b3b3b3;
}
a.section--header--right--more {
font-weight: 700;
letter-spacing: 1.35px;
}
After applying the above styles the section now looks like the image below
Now I need to add the styles for the section body, one for the album card and one for the artist card.
.section--body--item {
width: 165px;
height: 240px;
background-color: rgb(38, 38, 38);
}
.section--body--item.album--item,
.section--body--item.artist--item {
padding: 20px;
cursor: pointer;
}
.section--body--item .section--body--item--img {
width: 125px;
height: 125px;
margin: 0 auto;
}
.section--body--item .section--body--item--img img {
max-width: 100%;
height: auto;
box-shadow: 0 10px 30px 0 rgba(0,0,0,.3), 0 1px 2px 0 rgba(0,0,0,.2);
}
.section--body--item--title {
margin-top: 1rem;
margin-bottom: 0;
font-weight: 600;
font-size: 0.9rem;
text-overflow: ellipsis;
overflow-x: hidden;
white-space: nowrap;
}
.section--body--item--subtitle {
margin: 0;
margin-top: 1px;
}
.section--body--item.artist--item .section--body--item--img img {
border-radius: 50%;
}
.section--body--item--play {
display: none;
height: 40px;
width: 40px;
border-radius: 50%;
background: #1db954;
align-items: center;
justify-content: center;
position: absolute;
bottom: 15px;
right: 15px;
box-shadow: 0px 0px 8px 8px rgb(37, 37, 37);
cursor: default;
}
.section--body--item--play:hover,
.section--body--item--play.active {
transform: scale(1.05);
}
.section--body--item:hover .section--body--item--play,
.section--body--item--play.active {
display: flex;
}
After applying the above styles, the page looks like this:
The last step is to add some javascript code to toggle the Play/Pause ( 鈴笍 ) icon. The functionality that I want to achieve is the following:
When the user clicks the 'Play' ( 鈻讹笍 ) button:
- the icon should change to 'Pause' ( 鈴革笍 ) and it should be always visible.
- all the previous 'Pause' ( 鈴革笍 ) buttons should change to Play ( 鈻讹笍 )
When the user click the 'Pause' ( 鈴革笍 ) button:
- the icon should change to 'Play' ( 鈻讹笍 )
const _play_pause_els = document.querySelectorAll('.section--body--item--play');
/* Get all the 'Play' buttons */
_play_pause_els.forEach(_el => {
/* When the user clicks the button */
_el.addEventListener('click', (e) => {
/* Get all the play buttons
1. remove the 'active' class
2. Change the 'pause' icon to the 'play' icon
*/
_play_pause_els.forEach(_el2 => {
if(_el != _el2) {
_el2.classList.remove('active');
const _icon_el2 = _el2.querySelector('i');
if(_icon_el2) {
_icon_el2.classList.remove('lni-pause')
_icon_el2.classList.add('lni-play');
}
}
});
_el.classList.toggle('active');
const _icon_el = _el.querySelector('i');
if(_icon_el) {
/* Toggle the icon to 'pause' or 'play' */
if(_icon_el) {
if(_el.classList.contains('active')) {
_icon_el.classList.remove('lni-play');
_icon_el.classList.add('lni-pause');
} else {
_icon_el.classList.remove('lni-pause')
_icon_el.classList.add('lni-play');
}
}
}
});
});
A close look to the section body cards with the added functionality:
And how the whole page looks:
Conclusion
馃帀 Thank you for reading through all the post! 馃帀
If you have any questions or any feedback, let me know in the comments 馃棬.
For the next part of the series I will create the bottom bar of the main layout. You can see it in this image:
If you want to follow along, you can find the code of the series in these Gists:
Posted on March 15, 2020
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.
Related
August 18, 2024