复杂的 flexbox 布局

Complicated flexbox layout

我总是与 flexbox 作斗争。这次也不例外地尝试解决这个问题并阅读了很多类似的问题,但是 none 这些问题让我对如何使用我的布局做到这一点有了正确的想法。我希望你们中的一些人能帮助我解决这个问题:)

我正在创建一个迷你播放器。想要的样子是这样的:

目前看起来是这样的:

这是我当前的 css 文件:

.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;
}

强烈建议在 grid 中这样做。通过制作大量笨拙的新容器是可能的,但是使用 grid.

可以更好地控制布局

如果您对 grid 不太满意,可以使用 CSS Grid Generator 为您完成这项工作 - 效果很好。

.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>

我想我会按照最初的要求添加一个 flexbox 解决方案。

* {
  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>