如何右键对齐flex项?

Mar*_*der 598 html css html5 css3 flexbox

是否有更多的flexbox-ish方式来正确对齐"联系"而不是使用position: absolute

.main { display: flex; }
.a, .b, .c { background: #efefef; border: 1px solid #999; }
.b { flex: 1; text-align: center; }
.c { position: absolute; right: 0; }
Run Code Online (Sandbox Code Playgroud)
<h2>With title</h2>
<div class="main">
    <div class="a"><a href="#">Home</a></div>
    <div class="b"><a href="#">Some title centered</a></div>
    <div class="c"><a href="#">Contact</a></div>
</div>
<h2>Without title</h2>
<div class="main">
    <div class="a"><a href="#">Home</a></div>
    <!--<div class="b"><a href="#">Some title centered</a></div>-->
    <div class="c"><a href="#">Contact</a></div>
</div>
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/vqDK9/

adr*_*ift 1031

更灵活的方法是使用auto左边距(弹性项处理自动边距与在块格式化上下文中使用时略有不同).

.c {
    margin-left: auto;
}
Run Code Online (Sandbox Code Playgroud)

更新小提琴:

.main { display: flex; }
.a, .b, .c { background: #efefef; border: 1px solid #999; }
.b { flex: 1; text-align: center; }
.c {margin-left: auto;}
Run Code Online (Sandbox Code Playgroud)
<h2>With title</h2>
<div class="main">
    <div class="a"><a href="#">Home</a></div>
    <div class="b"><a href="#">Some title centered</a></div>
    <div class="c"><a href="#">Contact</a></div>
</div>
<h2>Without title</h2>
<div class="main">
    <div class="a"><a href="#">Home</a></div>
    <!--<div class="b"><a href="#">Some title centered</a></div>-->
    <div class="c"><a href="#">Contact</a></div>
</div>
<h1>Problem</h1>
<p>Is there a more flexbox-ish way to right align "Contact" than to use position absolute?</p>
Run Code Online (Sandbox Code Playgroud)

  • @MarkBoulder:出于兼容性原因,他的方法更好,但是如果你已经使用了flexbox,我的回答会更有意义. (4认同)
  • @MarkBoulder:在这种情况下,他们都完成了同样的事情.优点是具有与表方法没有的flex项相关联的其他属性(和行为)([`flex`](http://www.w3.org/TR/css3-flexbox/#flex), [`order`](http://www.w3.org/TR/css3-flexbox/#order-property)等). (4认同)
  • 如果你不能包装元素并且需要浮动说最后三个,那么只用这个`margin-left:auto;`样式从最后一个目标开始. (3认同)
  • 谢谢。您个人喜欢上面的Yohann Tilotti的display table方法吗?如果是这样,为什么? (2认同)
  • 这应该是公认的答案。因为 `justify-content: space-between;` 只有当你的 flex 容器中只有 2 个项目时才能实现你想要的(第一个项目在左边,第二个在右边)。但是对于2个以上的项目,只在右边对齐一些,这是正确的方法! (2认同)
  • @Justin弄清楚了,不需要把它们包起来-我不能。解决的办法是只用`margin-left:auto;`定位三个项目中的第一个。 (2认同)

Kev*_*tle 393

干得好.设置justify-content: space-between在flex容器上.

.main { 
    display: flex; 
    justify-content: space-between;
  }
.a, .b, .c { background: #efefef; border: 1px solid #999; }
.b { text-align: center; }
Run Code Online (Sandbox Code Playgroud)
<h2>With title</h2>
<div class="main">
    <div class="a"><a href="#">Home</a></div>
    <div class="b"><a href="#">Some title centered</a></div>
    <div class="c"><a href="#">Contact</a></div>
</div>
<h2>Without title</h2>
<div class="main">
    <div class="a"><a href="#">Home</a></div>
<!--     <div class="b"><a href="#">Some title centered</a></div> -->
    <div class="c"><a href="#">Contact</a></div>
</div>
Run Code Online (Sandbox Code Playgroud)

  • 或者'证明 - 内容:flex-end` (237认同)
  • 请注意,这并不总是以您期望的方式工作,例如当存在`.c :: after`伪元素时.根据我的经验,`margin-left:auto;`是要走的路. (19认同)
  • 或者`flex-flow:row-reverse;` (11认同)
  • 如果您不希望在flex容器中仅对齐一项,我看不出这是正确的答案。 (7认同)

Nic*_*k F 37

如果你想使用flexbox,你可以通过这样做(display: flex在容器上,flex: 1在项目上,以及text-align: right.c):

.main { display: flex; }
.a, .b, .c {
    background: #efefef;
    border: 1px solid #999;
    flex: 1;
}
.b { text-align: center; }
.c { text-align: right; }
Run Code Online (Sandbox Code Playgroud)

...或者(甚至更简单),如果项目不需要满足,您可以justify-content: space-between在容器上使用并text-align完全删除规则:

.main { display: flex; justify-content: space-between; }
.a, .b, .c { background: #efefef; border: 1px solid #999; }
Run Code Online (Sandbox Code Playgroud)

这是Codepen上的一个演示,允许您快速尝试上述内容.

  • ````space-between````正是我想要的,谢谢! (2认同)

Arn*_*rno 32

您还可以使用填充填充剩余空间.

<div class="main">
    <div class="a"><a href="#">Home</a></div>
    <div class="b"><a href="#">Some title centered</a></div>
    <div class="filler"></div>
    <div class="c"><a href="#">Contact</a></div>
</div>

.filler{
    flex-grow: 1;
}
Run Code Online (Sandbox Code Playgroud)

我已经用3个不同版本更新了解决方案.这是因为讨论了使用附加填料元件的有效性.如果你运行代码剪切,你会发现所有解决方案都做了不同的事情.例如,在项目b上设置填充类将使此项目填充剩余空间.这样做的好处是没有不可点击的"死"空间.

<div class="mainfiller">
    <div class="a"><a href="#">Home</a></div>
    <div class="b"><a href="#">Some title centered</a></div>
    <div class="filler"></div>
    <div class="c"><a href="#">Contact</a></div>
</div>

<div class="mainfiller">
    <div class="a"><a href="#">Home</a></div>
    <div class="filler b"><a href="#">Some title centered</a></div>
    <div class="c"><a href="#">Contact</a></div>
</div>



<div class="main">
    <div class="a"><a href="#">Home</a></div>
    <div class="b"><a href="#">Some title centered</a></div>
    <div class="c"><a href="#">Contact</a></div>
</div>

<style>
.main { display: flex; justify-content: space-between; }
.mainfiller{display: flex;}
.filler{flex-grow:1; text-align:center}
.a, .b, .c { background: yellow; border: 1px solid #999; }
</style>
Run Code Online (Sandbox Code Playgroud)

  • @Kokodoko是的,使用一个非语义的html元素来移动另一个元素是理解flexbox的顶层... (8认同)
  • 最后有人了解flexbox (2认同)
  • @Kokodoko` justify-content:space-between`是"那么多"css,严肃吗?无需进一步评论(但如果您愿意 - 欢迎聊天).这个答案有权在这里,因为它*是一个解决方案.但绝对不是*最佳的.Idk,也许你没有注意到,但是大多数来自另一个答案的css都是OP,答案实际上减少了(一点点)作者的css数量.这个答案与其他人相比没有更少的css(如果没有OP的css将无法工作 - https://jsfiddle.net/63ma3b56/).但它还有一个html元素. (2认同)

Mel*_*hia 27

或者你可以使用 justify-content: flex-end

.main { display: flex; }
.c { justify-content: flex-end; }
Run Code Online (Sandbox Code Playgroud)

  • “ justify-content”属性是flex-container的属性,请参见Chris Coyer的flexy速查表:https://css-tricks.com/snippets/css/a-guide-to-flexbox/ (3认同)
  • 这是此页面上唯一对我有用的解决方案。 (3认同)

CES*_*SCO 19

一样容易

.main {
    display: flex;
    flex-direction:row-reverse;
}
Run Code Online (Sandbox Code Playgroud)


and*_*rob 11

将以下CSS类添加到样式表中:

.my-spacer {
    flex: 1 1 auto;
}
Run Code Online (Sandbox Code Playgroud)

在左侧的元素和想要右对齐的元素之间放置一个空元素:

<span class="my-spacer"></span>


Mon*_*han 10

margin-left: auto 效果很好。但是干净的 flex box 解决方案在主类中是空的。如果有两个或更多元素,则间距效果很好。我也为单个元素添加了一个解决方案。

.main { display: flex; justify-content: space-between; }
.a, .b, .c { background: #efefef; border: 1px solid #999; padding: 0.25rem; margin: 0.25rem;}
.b { flex: 1; text-align: center; }

.c-wrapper {
  display: flex;
  flex: 1;
  justify-content: flex-end;
}

.c-wrapper2 {
  display: flex;
  flex: 1;
  flex-flow: row-reverse;
}
Run Code Online (Sandbox Code Playgroud)
<div class="main">
    <div class="a"><a href="#">Home</a></div>
    <div class="b"><a href="#">Some title centered</a></div>
    <div class="c"><a href="#">Contact</a></div>
</div>

<div class="main">
    <div class="a"><a href="#">Home</a></div>
    <div class="c"><a href="#">Contact</a></div>
</div>

<div class="main">
    <div class="c-wrapper">
      <a class="c" href="#">Contact</a>
      <a class="c" href="#">Contact2</a>
    </div>
</div>
<div class="main">
    <div class="c-wrapper2">
      <span class="c">Contact</span>
      <span class="c">Contact2</span>
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)


Tet*_*Dev 8

如果您需要一个项目左对齐(如标题)但是然后多个项目右对齐(如3个图像),那么您将执行以下操作:

h1 {
   flex-basis: 100%; // forces this element to take up any remaining space
}

img {
   margin: 0 5px; // small margin between images
   height: 50px; // image width will be in relation to height, in case images are large - optional if images are already the proper size
}
Run Code Online (Sandbox Code Playgroud)

这就是它的样子(上面的代码段只包含了相关的CSS)

在此输入图像描述


Lin*_*son 6

对于使用 Angular 和 Flex-Layout 的用户,请在 flex-item 容器上使用以下内容:

<div fxLayout="row" fxLayoutAlign="flex-end">

请参阅此处的fxLayoutAlign 文档和此处的完整 fxLayout 文档。


小智 5

“价格合理的内容:弹性端”在价格盒容器中工作。

.price-box {
    justify-content: flex-end;
}
Run Code Online (Sandbox Code Playgroud)