top of page
logo-2-color_2x.png

Layout Review Exercise

Points: 

10

Due By:

February 10, 2026 at 5:59:00 AM

Table of Contents



The Challenge

This is an assignment where are you tasked with deciding how to translate a design layout into code. You are provided with the HTML and some basic CSS. A high-res mockup is also included.




Parent-Child Relationships

The biggest thing you can do to understand the code and formulate an approach is to see the structure in the HTML. In particular, you want to look at parent-child relationships.


Below are some screenshots that these relationships.





Opportunities and Constraints

 

You ARE allowed to:


  • add non-semantic parent elements such as <div> to help group elements.

  • use grid, flex, or a combination of the 2 to achieve the layout. The most important thing is that you are reflecting on why you are doing what you are doing.


You ARE NOT allowed to:

  • change any HTML that is already there.



Starting Files




General Guidance


Use Flexbox When:

  • Items are arranged in a single row or column

  • You want items to automatically size based on content

  • You need to align items along one axis

  • Items should wrap to new lines

  • You want flexible spacing between items


Use Grid When:

  • You need precise control over rows AND columns

  • Layout is truly two-dimensional

  • You want named grid areas for clarity

  • Items need to align in both directions

  • You have a fixed number of columns/rows





Common Patterns You'll Need


css

/* Pattern 1: Horizontal Alignment With Space Between */

.example {
    display: flex;
    justify-content: space-between;
    align-items: center;
}

/* Pattern 2: Vertical stacking with gap */

.example {
    display: flex;
    flex-direction: column;
    gap: var(--spacing-md);
}

/* Pattern 3: Item that grows to fill space...to be used on the child element */

.example {
    flex-grow: 1;
}


/* Pattern 4: Centered content */

.example {
    display: flex;
    align-items: center;
    justify-content: center;
}


/* Pattern 5: Three-column layout */
.example {
    display: grid;
    grid-template-columns: auto 1fr auto;
}





Additional Tips

Your objective is to finish this assignment independently as much as you can. Use this as a reference if you need a hint. Keep in mind that this is my solution. Often, you can begin with either flex or grid and achieve the same outcome. It all hinges on how you handle the specifics.


Recommended: Grid or Flexbox


Why Grid might work well:

/* Creates explicit columns with fixed outer widths */
display: grid;
grid-template-columns: var(--sidebar-width) 1fr var(--queue-panel-width);

Why Flexbox might work well:


/* More flexible, items size themselves */
display: flex;

/* Sidebar and queue have fixed width, main content grows */

Key consideration: Do you want explicit column definitions (Grid) or flexible growing/shrinking (Flex)?

Recommended: Flexbox


Reasoning: Single column of items stacked vertically



display: flex;
flex-direction: column;

What you need:

  • Vertical stacking

  • Consistent spacing between navigation items

  • Logo at top, nav items below

Recommended: Regular block flow (no flex/grid needed for the container itself)


Reasoning: Content flows naturally top-to-bottom. Individual sections inside may use flex/grid.


Key: Just needs `overflow-y: auto` for scrolling


Recommended: Flexbox


Reasoning: Two items side-by-side (album art + info)



display: flex;
align-items: flex-end; /* Align to bottom */
gap: var(--spacing-xl);

Recommended: Flexbox


Reasoning: Multiple items in a horizontal row (avatar, artist, •, album, •, year)


display: flex;
align-items: center;
gap: var(--spacing-sm);

Recommended: Flexbox


Reasoning: Two items with space between (title left, button right)


display: flex;
justify-content: space-between;
align-items: center;

Recommended: Flexbox


Reasoning: Multiple items in a row, middle item should grow


display: flex;
align-items: center;
gap: var(--spacing-md);

Key: The `.song-item__info` should have `flex: 1` to take remaining space


Recommended: Flexbox or Grid


Why Grid might work well:


display: grid;
grid-template-columns: 25% 50% 25%;

/* Or: */

grid-template-columns: 1fr 2fr 1fr;

Why Flexbox might work well:


display: flex;
justify-content: space-between;
align-items: center;

Key consideration: Three sections that need specific width relationships


Recommended: Flexbox


Reasoning: Horizontal items (artwork, details, like button)


display: flex;
align-items: center;
gap: var(--spacing-md);

Key: Details should grow: `flex: 1`


Recommended: Flexbox


Reasoning: Vertical stacking (buttons on top, progress bar below)



display: flex;
flex-direction: column;
align-items: center;

Recommended: Flexbox


Reasoning: Horizontal row of buttons


display: flex;
align-items: center;
gap: var(--spacing-md);

Recommended: Flexbox


Reasoning: Three items in a row (current time, slider, total time)



display: flex;
align-items: center;
gap: var(--spacing-sm);

Key: Progress bar should grow: `flex: 1`


Recommended: Flexbox


Reasoning: Horizontal row of buttons, aligned to right


display: flex;
align-items: center;
justify-content: flex-end;
gap: var(--spacing-md);

Recommended: Flexbox


Reasoning: Vertical stack of song items



display: flex;
flex-direction: column;
gap: var(--spacing-sm);




Deliverable

Please upload:

  • HTML file (because you can make changes)

  • CSS file





Tips

  • Markup the handout you are provided. Identify what is best suited for flexbox or grid (and why)

  • Get used to using your inspector (Chrome or Firefox). This will help tremendously.

  • Start with the biggest parts of the layout first. 

  • Take one section at a time after deciding on the major layout.




Locked Message

bottom of page