CSS 하나의 항목을 flexbox와 바로 정렬


212

https://jsfiddle.net/vhem8scs/

flexbox와 두 개의 항목을 왼쪽으로 정렬하고 하나의 항목을 오른쪽으로 정렬 할 수 있습니까? 링크가 더 명확하게 보여줍니다. 마지막 예는 내가 달성하고자하는 것입니다.

flexbox에는 하나의 코드 블록이 있습니다. float을 사용하면 네 개의 코드 블록이 있습니다. 이것이 내가 flexbox를 선호하는 이유 중 하나입니다.

HTML

<div class="wrap">
  <div>One</div>
  <div>Two</div>
  <div>Three</div>
</div>

<!-- DESIRED RESULT -->

<div class="result">
  <div>One</div>
  <div>Two</div>
  <div>Three</div>
</div>

CSS

.wrap {
  display: flex;
  background: #ccc;
  width: 100%;
  justify-content: space-between;
}

.result {
  background: #ccc;
  margin-top: 20px;
}

.result:after {
  content: '';
  display: table;
  clear: both;
}

.result div {
  float: left;
}
.result div:last-child {
  float: right;
}

답변:


524

하나의 플렉스 자식을 오른쪽에 맞추려면margin-left: auto;

로부터 플렉스 사양 :

주축에서 자동 여백을 사용하는 것은 플렉스 항목을 별개의 "그룹"으로 분리하는 것입니다. 다음 예제에서는이를 사용하여 공통 UI 패턴 (일부는 왼쪽에 정렬되고 일부는 오른쪽에 정렬 됨)을 재현하는 방법을 보여줍니다.

.wrap div:last-child {
  margin-left: auto;
}

바이올린 업데이트

노트 :

중간 항목 (또는 속기 flex:1) 에서 flex-grow : 1을 설정 하여 마지막 항목을 오른쪽으로 끝까지 밀면 비슷한 효과를 얻을 수 있습니다. ( 데모 )

그러나 분명한 차이점은 중간 항목이 필요 이상으로 커진다는 것입니다. 차이점을 보려면 flex 항목에 테두리를 추가하십시오.

데모


감사! 나는 이것을 읽기 전에 효과가 있었던 다른 것을 시도했다. 그것은 다른 하나를 밀어야하는 요소에 flex-grow : 1을 설정하는 것이 었습니다. 그것은 또한 효과가 있었다. 어느 쪽이 더 좋고 왜 그런지 아십니까?
Jens Törnell

2
좋은 대답입니다. 따라서 여백은 추가 공간을 차지하지 않으며 플렉스는 1입니다. 멋있는!
Jens Törnell

4
@ JensTörnell에서 auto여백은 컨테이너의 빈 공간을 사용하여 플렉스 항목을 분리합니다. flex-grow/의 flex속성은, 그 빈 공간을 차지하는 양만큼 확장 플렉스 항목에 제공합니다. Danield가 언급했듯이 후자의 방법은 플렉스 항목 2를 더 크게 만듭니다.
마이클 벤자민

12
모든 영웅이 망토를 입는 것은 아닙니다.
Tom

2
@ user1063287 여러 요소를 오른쪽에 맞추려면 오른쪽 정렬 해야하는 첫 번째 요소에 margin-left : auto를 적용하십시오. 마지막 4 개의 요소를 오른쪽에 맞추고 싶다고 가정 해 봅시다. div:nth-last-child(4) { margin-left: auto } codepen.io/danield770/pen/ERyoar
Danield

37

간결하고 순수한 flexbox 옵션의 경우 왼쪽 정렬 항목과 오른쪽 정렬 항목을 그룹화하십시오.

<div class="wrap">
  <div>
    <span>One</span>
    <span>Two</span>
  </div>
  <div>Three</div>
</div>

그리고 사용 space-between:

.wrap {
  display: flex;
  background: #ccc;
  justify-content: space-between;
}

이 방법으로 여러 항목을 오른쪽 (또는 하나)으로 그룹화 할 수 있습니다.

https://jsfiddle.net/c9mkewwv/3/


이것은 작동하지만 각 그룹 내부의 요소를 display: inline;또는로 변경하지 않으면 display: inline-block;flexbox와 같은 행에 모두 대신 쌓입니다. 그렇지 않으면 그렇지 않습니다.
DIMM 리퍼

@TheDIMMReaper 문제가 있는지 확실하지 않습니다. 당신은 확장 할 수 있습니까?
spflow

태그를 즉시 줄 바꿈 One하고 s Two에서 divs로 변경 한 방법을 의미합니다. span여전히 태그가 있으면 display: block;별도의 줄로 흐릅니다. OP는 원래 divs를 가지고 있었기 때문에 div원래 태그의 표시를 변경하지 않고 다른 태그에 넣는 것은 효과가 없다는 것을 지적하고 싶었습니다 .
DIMM 리퍼

1
예, 요소가 이제 레벨 display: flex이 낮아져 더 이상 레이아웃에 영향을 미치지 않습니다. div를 사용하려면 예 inline또는 inline-block작동합니다. 또한 부모 div와 함께 flex기본값 flex-direction: row으로 사용하고 있기 때문에 분명히 . 전의. jsfiddle.net/ynbb5964/2
spflow

고맙게도 align-self : flex-end를 시도했지만 왜 작동하지 않습니까?
Anand

3

중앙의 일부 요소 (headerElement)와 오른쪽의 마지막 요소 (headerEnd)를 정렬합니다.

.headerElement {
    margin-right: 5%;
    margin-left: 5%;
}
.headerEnd{
    margin-left: auto;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.