【问题标题】:Am I using flex correctly in this situation?在这种情况下我是否正确使用了 flex?
【发布时间】:2017-11-13 21:03:18
【问题描述】:

假设我想要一个看起来像这样的课程容器

让“课程”的每个部分都成为自己的弹性盒,这很糟糕吗?

.course-container {
  display: flex;
  flex-direction: column;
}

.course-options {
  display: flex;
  flex-direction: row;
  justify-content: space-between;
}

.course-title {
  display: flex;
  flex-direction: row;
  justify-content: center;
}

.course-grade {
  display: flex;
  flex-direction: row;
  justify-content: flex-end;
}
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet" />
<div class="course-container">
  <div class="course">
    <div class="course-options">
      <i class='fa fa-pencil-square-o fa-lg' aria-hidden="true"></i>
      <i class='fa fa-trash-o fa-lg' aria-hidden="true"></i>
    </div>
    <div class="course-title">
      <a href="">Course 1</a>
    </div>
    <div class="course-grade">
      <a href="">Grade: 0.00%</a>
    </div>
  </div>
  <div class="course">
    <div class="course-options">
      <i class='fa fa-pencil-square-o fa-lg' aria-hidden="true"></i>
      <i class='fa fa-trash-o fa-lg' aria-hidden="true"></i>
    </div>
    <div class="course-title">
      <a href="">Course 2</a>
    </div>
    <div class="course-grade">
      <a href="">Grade: 0.00%</a>
    </div>
  </div>
</div>

【问题讨论】:

  • 我觉得不错。只要它适合您的需求 - 我会说没有对错。

标签: html twitter-bootstrap css flexbox


【解决方案1】:

你不需要在每个内部元素上定义display: flex,你可以使用align-self来代替。

.course-container,
.course {
  display: flex;
  flex-direction: column;
}

.course {
  width: 300px;
  border: 1px solid black;
  padding: 10px;
  height: 100px;
  margin: 5px;
  justify-content: space-between;
}

.course-options {
  display: flex;
  justify-content: space-between;
}

.course-title {
  align-self: center;
}

.course-grade {
  align-self: flex-end;
}
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet" />
<div class="course-container">
  <div class="course">
    <div class="course-options">
      <i class='fa fa-pencil-square-o fa-lg' aria-hidden="true"></i>
      <i class='fa fa-trash-o fa-lg' aria-hidden="true"></i>
    </div>
    <div class="course-title">
      <a href="">Course 1</a>
    </div>
    <div class="course-grade">
      <a href="">Grade: 0.00%</a>
    </div>
  </div>
  <div class="course">
    <div class="course-options">
      <i class='fa fa-pencil-square-o fa-lg' aria-hidden="true"></i>
      <i class='fa fa-trash-o fa-lg' aria-hidden="true"></i>
    </div>
    <div class="course-title">
      <a href="">Course 2</a>
    </div>
    <div class="course-grade">
      <a href="">Grade: 0.00%</a>
    </div>
  </div>
</div>

【讨论】:

    【解决方案2】:

    你如何设置它没有任何问题,它是否是最好的很大程度上取决于course 盒子应该如何表现。

    根据我现在所知道的,您可以优化该代码,我会这样做,并获得相同的结果。

    在这里,我删除了所有内部包装器并使用了 auto margins,它使用 Flexbox 进行了升级,可以轻松地在其父级中对齐项目。

    这样的结构的好处是,除了标记更少之外,您还有无数种方法可以根据内容或屏幕尺寸对项目进行重新排序。

    堆栈sn-p

    .course-container {
      display: flex;
      flex-direction: column;
    }
    .course {
      display: flex;
      flex-wrap: wrap;
      align-items: flex-start;   /*  align to top, and prevent from stretch  */
      width: 250px;
      height: 120px;
      margin: 5px;
      border: 1px solid lightgray;
    }
    .course .fa-trash-o,
    .course .grade {
      margin-left: auto;         /*  push trash and grade to the right  */
    }
    .course .grade {
      margin-top: auto;          /*  push to bottom  */
    }
    .course .title {
      flex-basis: 100%;          /*  take full width, make it wrap on a row of its own  */
      margin: auto 0;            /*  center vertically  */
      text-align: center;
    }
    <link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet" />
    <div class="course-container">
      <div class="course">
          <i class='fa fa-pencil-square-o fa-lg' aria-hidden="true"></i>
          <i class='fa fa-trash-o fa-lg' aria-hidden="true"></i>
          <a class='title' href="">Course 1</a>
          <a class='grade' href="">Grade: 0.00%</a>
      </div>
      <div class="course">
          <i class='fa fa-pencil-square-o fa-lg' aria-hidden="true"></i>
          <i class='fa fa-trash-o fa-lg' aria-hidden="true"></i>
          <a class='title' href="">Course 2</a>
          <a class='grade' href="">Grade: 0.00%</a>
      </div>
    </div>

    【讨论】:

      【解决方案3】:

      这种情况不需要 flexbox。 Flexbox 仍然有less than 90% browser support worldwide(无前缀),所以我暂时不会使用它,除非你绝对别无选择。

      这是适用于所有浏览器的正确解决方案:

      .card {
        text-align: center; 
        position: relative; 
        width: 100%; 
        max-width: 300px; 
        height: 100px; 
        line-height: 100px; 
        border: 1px solid black; 
        margin: 5px;
      }
      .card > * {line-height: 1.4em; position: absolute;}
      .card > .edit {left: 0; top: 0;}
      .card > .delete {right: 0; top: 0;}
      .card > .grade {right: 0; bottom: 0;}
      <div class="card">
        <a href="#" class="edit">edit</a>
        <a href="#" class="delete">delete</a>
        <span class="grade">grade</span>
        course 1
      </div>
      <div class="card">
        <a href="#" class="edit">edit</a>
        <a href="#" class="delete">delete</a>
        <span class="grade">grade</span>
        course 2
      </div>

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-04-28
        • 2020-08-06
        • 2022-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多