DEV Community

Cover image for Recreate: Spotify (part 5) - Bottom Bar
tsanak
tsanak

Posted on

Recreate: Spotify (part 5) - Bottom Bar

Intro

Welcome back to the Recreate Spotify Series! In this part I will recreate a portion of the bottom bar!

What I want to recreate:
Alt Text

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:

Alt Text

and a closer look ๐Ÿ‘€:

Alt Text

The starting point ๐Ÿ

As always, the first step is to split the design to smaller chunks.

Looking at the bottom bar of the Spotify I can see 3 different areas.

Alt Text

In this part of the series I will focus in the area marked with the number 1.

Alt Text

After splitting the design I can see 3 main areas, marked in the image below:

Alt Text

One extra step

Before starting to code it is a good idea to hover & click the elements in the design to see what happens. Maybe an event, such as hovering over an item, triggers a new element to appear or changes the color of an item.

After hovering over the area I see some minor changes in the design:

Alt Text

These are the following:

  1. Hovering over the image, makes a new element visible (the arrow circle)
  2. Text hover changes color to white (#fff) and "underlines" the text. (I will explain later why the "underlines" is in quotes ๐Ÿค” )
  3. Icon hover changes the color to white (#fff) again.

Code ๐Ÿ’ป

If you want to follow along, you can find the code from the part 4 (Home page) of the series in this Github gist.

Structure

I will start by adding the html code for the bottom bar right after the ending of the </main> tag.

</main>
<div class="bottom-bar">
    <div class="bottom-bar--left-col">
        <div class="bottom-bar--left-col--song">
            <div class="bottom-bar--left-col--song--img">
                <div class="bottom-bar--left-col--song--img--pull-up">
                    <i class='lni lni-chevron-up'></i>
                </div>
                <img src="http://via.placeholder.com/150x150" alt="">
            </div>
            <div class="bottom-bar--left-col--song--details">
                <div class="bottom-bar--left-col--song--details--wrapper">
                    <a href="#" class="bottom-bar--left-col--song--details--title">Song Title</a>
                </div>
                <div class="bottom-bar--left-col--song--details--wrapper">
                    <a href="#" class="bottom-bar--left-col--song--details--artist">Artist</a>
                </div>
            </div>
        </div>
        <div class="bottom-bar--left-col--actions">
            <button class="bottom-bar--left-col--actions--favorite">
                <i class='lni lni-heart'></i>
            </button>
            <button class="bottom-bar--left-col--actions--pip">
                <i class="pip-icon"></i>
            </button>
        </div>
    </div>
</div>

This is how the section looks without any added styles:

Alt Text

Yep, that's right! You can't even see it without any styling ๐Ÿ˜…

Styling

Adding the basic styles so that the bottom bar is correctly positioned and is visible.

main {
    max-height: calc(100vh - 90px); /* 90px is the height of the bottom bar */
    min-height: calc(100vh - 90px); /* 90px is the height of the bottom bar */
}

.sidebar {
    height: calc(100% - 90px); /* 90px is the height of the bottom bar */
}

.bottom-bar {
    width: 100%;
    height: 90px;
    border-top: 1px solid #000;
    background-color: rgba(24, 24, 24, 1);
    z-index: 1;
    position: absolute;
    bottom: 0;
    padding-left: 16px;
    padding-right: 16px;
    display: flex;
}

Alt Text

I know it is not looking the best right now, but at least it's visible.

First things first, I need to contain the elements inside the bottom bar and not let them overflow it.

.bottom-bar--left-col {
    display: flex;
    align-items: center;
    position: relative;
    transition: left 300ms;
    left: 0;
}

.bottom-bar--left-col--song {
    display: flex;
}

.bottom-bar--left-col--song--img img {
    height: 56px;
    width: 56px;
}

Alt Text

It looks much better now!

Time to focus on the actual styling of the elements. I will start working on the image and the hoverable arrow icon.

.bottom-bar--left-col--song--img img {
    height: 56px;
    width: 56px;
    box-shadow: 0 10px 30px 0 rgba(0,0,0,.3), 0 1px 2px 0 rgba(0,0,0,.2);
}

.bottom-bar--left-col--song--img {
    margin-right: 14px;
    display: flex;
    position: relative;
}

.bottom-bar--left-col--song--img--pull-up {
    position: absolute;
    top: 4px;
    right: 4px;
    background: #000;
    width: 24px;
    height: 24px;
    opacity: 0.7;
    border-radius: 50%;
    display: none;
    align-items: center;
    justify-content: center;
    font-size: 0.75rem;
    color: #b3b3b3;
}

.bottom-bar--left-col--song--img--pull-up:hover {
    /* Hovering over the arrow icon makes it bigger and brighter */
    opacity: 0.8;
    transform: scale(1.1);
    color: #fff;
}

.bottom-bar--left-col--song--img:hover .bottom-bar--left-col--song--img--pull-up {
    /* Hovering over the image reveals the arrow icon */
    display: flex;
}

Alt Text

Now the image part of the bottom bar is finished and I can move on the the text on the right side of the image.

.bottom-bar--left-col--song--details {
    justify-content: center;
    display: flex;
    flex-direction: column;
    margin-right: 14px;
}

.bottom-bar--left-col--song--details--wrapper {
    display: block;
    line-height: 17px;
}

.bottom-bar--left-col--song--details a {
    display: inline;
    text-decoration: none;
    color: #fff;
    letter-spacing: 0;
}

.bottom-bar--left-col--song--details a:hover {
    color: #fff;
    /* Border-bottom instead of text-decoration: underline */
    border-bottom: 1px solid #fff;
}

.bottom-bar--left-col--song--details--title {
    font-size: 0.875rem;
}

.bottom-bar--left-col--song--details--artist {
    font-size: 0.75rem;
}

Alt Text

When hovering over the text "Song Title" we get the underline effect.

Alt Text

โš” Text-decoration: underline vs border-bottom ("underline")

Now remember when I talked about the Text hover "underline" and why the "underline" was in quotes?

Let's see the Spotify hover text "underline":

Alt Text

Now let's see how the text-decoration: underline looks like on the "Song Title":

.bottom-bar--left-col--song--details a:hover {
    text-decoration: underline;
}

Alt Text

As you can see the difference between text-decoration: underline; and border-bottom is subtle, but it does exist.

Alt Text

Now let's begin working with the icons on the right side.

I will start with the heart icon, since this one is available in the LineIcons library.

.bottom-bar--left-col--actions {
    display: flex;
    align-items: center;
}

.bottom-bar--left-col--actions--favorite {
    background: transparent;
    border: 0;
    outline: 0;
    color: #b3b3b3;
    font-size: 1rem;
    margin-right: 10px;
}

.bottom-bar--left-col--actions--favorite:hover {
    color: #fff;
}

Alt Text

When hovering over the icon:

Alt Text

As you can see I still have to style the last icon, which is the Picture in Picture (PiP) icon.

Alt Text

Boy am I in a pickle, I couldn't find any icon resembling the Picture in Picture icon in the LineIcons library.

Since I can't find the icon, I have 3 options:

  1. Use a png of an icon from some other site,
  2. Use one more icon library that contains the PiP icon
  3. Build the icon with css

Well, I didn't want to use a png for icon, because it is a very simple icon, and I didn't want to bloat the project with 2 icon libraries. So, I went with option 3, which is good since this series is targeted for beginners.

/* Reset the button's default styles  */
.bottom-bar--left-col--actions--pip {
    background: transparent;
    border: 0;
    outline: 0;
    position: relative;
    /* Width and height will be the actual size of the PiP icon */
    width: 16px;
    height: 13px;
    padding: 0;
}

/* The outside of the PiP icon, the Rectangle part of the icon */
.pip-icon {
    border: 1px solid;
    border-bottom: 2px solid;
    border-radius: 1px;
    border-color: #b3b3b3;
    width: 100%;
    height: 100%;
    position: absolute;
    left: 0;
    top: 0;
}

/* 
    The small rectangle of the PiP icon 
    that is on filled and is on the bottom right corner of the icon 
*/
.pip-icon:before {
    content: '';
    position: absolute;
    bottom: 1px;
    right: 1px;
    height: 3px;
    width: 5px;
    background: #b3b3b3;
    border-radius: 1px;
}

.bottom-bar--left-col--actions--pip:hover .pip-icon {
    border-color: #fff;
}

.bottom-bar--left-col--actions--pip:hover .pip-icon:before {
    background: #fff;
}

Alt Text

When the user hovers over the PiP icon:

Alt Text

That is the last part that I will add to this section of the series. Now let's have a look at the result:

Alt Text

And a closer look at the bottom bar ๐Ÿ‘€:

Alt Text

Conclusion

alt text

๐ŸŽ‰ 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 rest of the bottom bar. You can see it in this image:

Alt Text

If you want to follow along, you can find the code of the series in these Gists:

Top comments (0)