Skip
Skip

Reputation: 480

Complicated flexbox layout

I always struggle with flexboxes. This time is no exception trying to solve this for a solid hour and read a lot of similar questions but none of these gave me the right idea on how to do it with my layout. I hope that some of you could help me out with how to do this :)

I'm creating a MiniPlayer. The desired look of it is like that:

enter image description here

enter image description here

At the moment it looks like this:

enter image description here

This is my current css file:

.MiniPlayer {
    position: fixed;
    bottom: 0;
    left: 0;
    right: 0;
    height: 100px;
    display: flex;
    flex-direction: row;

img{
    width: auto;
    height: 90%;
    max-height: 100px;
    max-width: 100px;
    flex-direction: column;
}

.Title{
    flex-direction: column;
    flex-wrap: wrap;
}

.Name{
    flex-direction: column;
    flex-wrap: wrap;
}

.MediaButton{
    flex-direction: row;
}

.Slider{
    flex-direction: column;
    flex-wrap: wrap;
    flex-grow: 4;
}

Upvotes: 0

Views: 348

Answers (2)

Kameron
Kameron

Reputation: 10846

Figured I would add a flexbox solution as initially requested.

* {
  text-align: center;
}

.img,
.title,
.name,
.btn,
.slider {
  border: solid black 2px;
}

.wrapper {
  border: solid 1px orange;
  padding: 1em;
  display: flex;
}

.wrapper-2 {
  margin-left: 1em;
  width: 75%;
  display: flex;
  flex-direction: column;
}

.img {
  width: 25%;
}

.title,
.name {
  width: 50%;
  margin-bottom: 1em;
}

.btn {
  width: 25%;
  margin-bottom: 1em;
}

.space-between {
  display: flex;
  justify-content: space-between;
}
<div class="wrapper">
  <div class="img">img</div>
  <div class="wrapper-2">
    <div class="title">title</div>
    <div class="space-between">
      <div class="name">name</div>
      <div class="btn">btn</div>
    </div>
    <div class="slider">slider</div>
  </div>
</div>

Upvotes: 2

Sigurd Mazanti
Sigurd Mazanti

Reputation: 2395

Would highly recommend doing this in grid. It is possible by making a lot of clumsy new containers, but you have much better layout control with grid.

If you're not too comfortable with grid, you can use a CSS Grid Generator to do the work for you - works just fine.

.parent {
  display: grid;
  grid-template-columns: repeat(6, 1fr);
  grid-template-rows: repeat(4, 1fr);
  grid-gap: 5px;
}

.parent div {
  border: 1px solid black;
}

.div1 {
  grid-area: 1 / 1 / 5 / 3;
}

.div2 {
  grid-area: 4 / 3 / 5 / 7;
}

.div3 {
  grid-area: 3 / 6 / 4 / 7;
}

.div4 {
  grid-area: 1 / 3 / 2 / 6;
}

.div5 {
  grid-area: 2 / 3 / 3 / 6;
}
<div class="parent">
  <div class="div1">img</div>
  <div class="div2">slider</div>
  <div class="div3">pause</div>
  <div class="div4">title</div>
  <div class="div5">name</div>
</div>

Upvotes: 1

Related Questions