8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

将一个 Flexbox 元素居中对齐,并将其他 Flexbox 元素右/左对齐

NFern 1月前

13 0

我希望 AB 和 C 在中间对齐。如何让 D 完全移到右边?BEFORE: AFTER: ul { padding: 0; margin: 0; display: flex; flex-direction: ro...

我希望 A B C 位于中间。

我怎样才能 D 完全走向正确?

前:

enter image description here

后:

enter image description here

ul {
  padding: 0;
  margin: 0;
  display: flex;
  flex-direction: row;
  justify-content: center;
  align-items: center;
}
li {
  display: flex;
  margin: 1px;
  padding: 5px;
  background: #aaa;
}
li:last-child {
  background: #ddd;
  /* magic to throw to the right*/
}
<ul>
  <li>A</li>
  <li>B</li>
  <li>C</li>
  <li>D</li>
</ul>

https://jsfiddle.net/z44p7bsx/

帖子版权声明 1、本帖标题:将一个 Flexbox 元素居中对齐,并将其他 Flexbox 元素右/左对齐
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由NFern在本站《css》版块原创发布, 转载请注明出处!
最新回复 (0)
  • \'li\' 在其 css 规则中不需要 display: flex。

  • 以下是实现此布局的五种选项:

    • CSS 定位
    • 带有不可见 DOM 元素的 Flexbox
    • 带有不可见伪元素的 Flexbox
    • 弹性框 flex: 1
    • CSS 网格布局

    方法 1:CSS 定位属性

    应用于 position: relative 弹性容器。

    适用 position: absolute 于项目 D。

    现在这个项目绝对定位在弹性容器内。

    最近定位祖先 的范围内 .

    使用 CSS 偏移属性 top 将此 right 元素移动到位。

    li:last-child {
      position: absolute;
      top: 0;
      right: 0;
      background: #ddd;
    }
    ul {
      position: relative;
      padding: 0;
      margin: 0;
      display: flex;
      flex-direction: row;
      justify-content: center;
      align-items: center;
    }
    li {
      display: flex;
      margin: 1px;
      padding: 5px;
      background: #aaa;
    }
    p {
      text-align: center;
      margin-top: 0;
    }
    span {
      background-color: aqua;
    }
    <ul>
      <li>A</li>
      <li>B</li>
      <li>C</li>
      <li>D</li>
    </ul>
    <p><span>true center</span></p>

    一个缺点 是,某些浏览器可能无法完全将绝对定位的弹性项目从正常流中移除。这会以非标准、意想不到的方式改变对齐方式。更多详细信息: IE11 中绝对定位的弹性项目不会从正常流中移除


    方法 2:弹性自动边距和不可见弹性项目(DOM 元素)

    自动边距 auto margins 可以实现布局。

    新的弹性项目与项目 D 相同,且位于另一端(左边缘)。

    更具体地说,由于弹性对齐基于可用空间的分布,因此新项目是保持三个中间框水平居中的必要平衡。新项目的宽度必须与现有的 D 项目相同,否则中间框将无法精确居中。

    新项目将从视图中移除, visibility: hidden .

    简而言之:

    • 创建该元素的副本 D
    • 将其放置在列表的开头。
    • 使用弹性 auto 边距保持 A , B 居中 C ,使两个 D 元素从两端创建相同的平衡。
    • 应用于 visibility: hidden 重复项 D

    li:first-child {
      margin-right: auto;
      visibility: hidden;
    }
    li:last-child {
      margin-left: auto;
      background: #ddd;
    }
    ul {
      padding: 0;
      margin: 0;
      display: flex;
      flex-direction: row;
      justify-content: center;
      align-items: center;
    }
    li {
      display: flex;
      margin: 1px;
      padding: 5px;
      background: #aaa;
    }
    p { text-align: center; margin-top: 0; }
    span { background-color: aqua; }
    <ul>
      <li>D</li><!-- new; invisible spacer item -->
      <li>A</li>
      <li>B</li>
      <li>C</li>
      <li>D</li>
    </ul>
    <p><span>true center</span></p>

    方法 3:Flex 自动边距和不可见 Flex 项目(伪元素)

    必须知道 D 的宽度

    • 创建一个与宽度相同的伪元素 D .
    • 将其放置在容器的开头 ::before .
    • 使用弹性 auto 边距保持 A , B C 完美居中,伪元素 D 从两端创建平等的平衡。

    ul::before {
      content:"D";
      margin: 1px auto 1px 1px;
      visibility: hidden;
      padding: 5px;
      background: #ddd;
    }
    li:last-child {
      margin-left: auto;
      background: #ddd;
    }
    ul {
      padding: 0;
      margin: 0;
      display: flex;
      flex-direction: row;
      justify-content: center;
      align-items: center;
    }
    li {
      display: flex;
      margin: 1px;
      padding: 5px;
      background: #aaa;
    }
    p { text-align: center; margin-top: 0; }
    span { background-color: aqua; }
    <ul>
      <li>A</li>
      <li>B</li>
      <li>C</li>
      <li>D</li>
    </ul>
    <p><span>true center</span></p>

    方法 4:添加 flex: 1 到左侧和右侧项目

    从上面的方法 2 或 3 开始,无需担心左右项目的宽度是否相等以保持平衡,只需给每个项目 flex: 1 。这将迫使它们都占用可用空间,从而使中间项目居中。

    然后,您可以添加 display: flex 单个项目以对齐其内容。

    关于将此方法与 min-height 一起使用的 about using this method with min-height : 目前在 Chrome、Firefox、Edge 以及可能的其他浏览器中,简写规则 flex: 1 分解如下:

    • flex-grow: 1
    • flex-shrink: 1
    • flex-basis: 0%

    单位 (%) on flex-basis 导致此方法中断 min-height 。这是因为,一般来说,子元素的百分比高度需要 height 在父元素上进行显式属性设置。

    这是一条可追溯到 1998 年( CSS Level 2 )的旧 CSS 规则,它仍然在很多浏览器中或多或少地有效。有关完整详细信息,请参见 此处 此处 .

    在评论中提出的问题的说明 user2651804 :

    #flex-container {
      display: flex;
      flex-direction: column;
      background: teal;
      width: 150px;
      min-height: 80vh;
      justify-content: space-between;
    }
    
    #flex-container>div {
      background: orange;
      margin: 5px;
    }
    
    #flex-container>div:first-child {
      flex: 1;
    }
    
    #flex-container::after {
      content: "";
      flex: 1;
    }
    <div id="flex-container">
      <div>very long annoying text that will add on top of the height of its parent</div>
      <div>center</div>
    </div>

    解决方案是不使用百分比单位。尝试一下 px 或者干脆什么都不用( 这实际上是规范所推荐的 ,尽管至少有一些主流浏览器出于某种原因附加了百分比单位)。

    #flex-container {
      display: flex;
      flex-direction: column;
      background: teal;
      width: 150px;
      min-height: 80vh;
      justify-content: space-between;
    }
    
    #flex-container > div {
      background: orange;
      margin: 5px;
    }
    
    
    /* OVERRIDE THE BROWSER SETTING IN THE FLEX PROPERTY */
    
    #flex-container > div:first-child {
      flex: 1;
      flex-basis: 0;
    }
    
    #flex-container::after {
      content: "";
      flex: 1;
      flex-basis: 0;
    }
    
    
    /* OR... JUST SET THE LONG-HAND PROPERTIES INDIVIDUALLY
    
    #flex-container > div:first-child {
      flex-grow: 1;
      flex-shrink: 1;
      flex-basis: 0;
    }
    
    #flex-container::after {
      content: "";
      flex-grow: 1;
      flex-shrink: 1;
      flex-basis: 0;
    }
     */
    <div id="flex-container">
      <div>very long annoying text that will add on top of the height of its parent</div>
      <div>center</div>
    </div>

    方法#5:CSS网格布局

    这可能是最干净、最有效的方法。无需绝对定位、虚假元素或其他黑客手段。

    只需创建一个包含多列的网格。然后将项目放置在中间和末尾的列中。基本上,只需将第一列留空即可。

    ul {
      display: grid;
      grid-template-columns: 1fr repeat(3, auto) 1fr;
      grid-column-gap: 5px;
      justify-items: center;
    }
    
    li:nth-child(1) { grid-column-start: 2; }
    li:nth-child(4) { margin-left: auto; }
    
    /* for demo only */
    ul { padding: 0; margin: 0; list-style: none; }
    li { padding: 5px; background: #aaa; }
    p  { text-align: center; }
    <ul>
      <li>A</li>
      <li>B</li>
      <li>C</li>
      <li>D</li>
    </ul>
    <p><span>| true center |</span></p>
  • \'新项目的宽度必须与现有的 D 项目的宽度相同,否则中间的框将不会精确居中。\' - 必须具有相同的宽度真是糟糕,但感谢上帝创造了 CSS 网格 :)

  • 使用网格技术,项目不在正中央,有没有办法让徽标元素位于正中央?imgur.com/a/SVg9xsj

  • 为了使网格布局方法在垂直轴上工作,除了显而易见的之外,它只需要一行额外的代码:.com/questions/72440616/…

  • @Daniel,也许可以发布一个完整的问题并附上示例,这样你就可以得到完整的答案。但是,一般来说,除非你对 flex / grid 项目应用绝对定位(即 position: absolute 或 position: fixed),否则它仍会保留在正常的文档流中。

  • 太棒了@Michael Benjamin 那么它将保持在正常流程中,只是以网格布局/Flexbox布局(视情况而定)而不是块布局进行分布,对吗?

  • 最简单的解决方案是将内容中心对齐到父容器,并为第一个和最后一个子元素提供自动左边距。

    ul {
      display:flex;
      justify-content:center;
    }
    
    
    .a,.d {
      margin-left:auto;
    }
    <ul>
      <li class="a">A</li>
      <li>B</li>
      <li>C</li>
      <li class="d">D</li>
    </ul>
  • 不幸的是,通过这种方法,A/B/C 将在剩余空间内居中。换句话说,即使它们在整个宽度上有足够的空间居中,它们也不会居中。

  • 最简单的方法

    .box{
      display:flex;
      justify-content:center;
    }
    .item1{
       flex:1;
       display: flex;
       justify-content: center;
       transform: translateX(10px);/*D element Width[if needed]*/
    }
     <div class="box">
       <div class="item1">
          <div>A</div>
          <div>B</div>
          <div>C</div>
       </div>
       <div class="item2">D</div>
     </div>
  • 使用该 display:grid 方法,您可以简单地将所有 ul 子项放入同一个单元格,然后设置 justify-self :

    .ul {
      display: grid;
    }
    
    .ul > * {
      grid-column-start: 1;
      grid-row-start: 1;
      justify-self:center;
    }
    
    .ul > *:last-child {
      justify-self: right;
    }
    
    /* Make Fancy */
    .li {
      display:inline-block;
      margin: 1px;
      padding: 5px;
      background: #bbb;
    }
    <div class='ul'>
      <span>
         <span class='li'>A</span>
         <span class='li'>B</span>
         <span class='li'>C</span>
      </span>
      <span class='li'>D</span>
    </div>
  • 引用 13

    不要仅仅为了实现某种外观而使用额外的 HTML,否则可能会破坏其他浏览器中的页面

  • 最简单的方法:

    .wrap {
        display:flex;
    }
    .full-width {
        width: 100%;
    }
    .centered {
        display: flex;
        justify-content:center;
    }
    .btn {
        display: flex;
        justify-content: end;
    }
    <div class="wrap">
       <div class="full-width"></div>
       <div class="full-width centered">
          <div>A</div>
          <div>B</div>
          <div>C</div>
       </div>
       <div class="full-width btn">D</div>
     </div>
  • 如果将:justify-self:end;添加到 D 的 CSS 中,它将位于容器的末尾。

  • 引用 16

    受到方法 #5: CSS 网格布局 @Michal Benjamin 启发,因为我正在使用 Tailwind,到目前为止,默认情况下仍然无法访问所有网格选项。这似乎有效:

    ul {
      display: grid;
      grid-template-columns: repeat(3, minmax(0, 1fr));
    }
    
    li {
      align-self: center;
    }
    
    li:nth-child(1) {
      justify-content: flex-start; /* OR margin-right: auto */
    }
    
    li:nth-child(3) {
      justify-content: flex-end; /* OR margin-left:auto */
    }
    <ul>
      <li>A</li>
      <li>B</li>
      <li>C</li>
    </ul>

    PS:不确定像这样混合 flex 和 grid 是否是个好主意!

  • 您没有混合使用 grid 和 flex,justifty-content 是 CSS 网格属性和 flexbox 属性(align-self 相同)

  • 我尝试在代码片段演示中理解您的 CSS。您的注释标记无效,冒号也多余。如果不正确,请随时修改。

  • 可以稍微改变一下接受的答案,因为你可以使用网格模板区域,而不需要假元素。

    grid-template-areas '. b c'
    grid-template-columns: 1fr 1fr 1fr
    
  • 您可以随意复制代码片段并进行更改。此外,指向特定答案的链接比指向已接受答案的潜在过时引用要好。

返回
作者最近主题: