CSS는 플로팅 div를 세로로 정렬


89

나란히 서있는 2 개의 div가 포함 된 div (#wrapper)가 있습니다.

right-div를 세로로 정렬하고 싶습니다. 내 주 래퍼에서 vertical-align : middle을 시도했지만 작동하지 않습니다. 그것은 나를 미치게 만든다!

누군가가 도울 수 있기를 바랍니다.

http://cssdesk.com/LWFhW

HTML :

<div id="wrapper">
  <div id="left-div">
    <ul>
      <li>One</li>
      <li>Two</li>
    </ul>
  </div>  
  <div id="right-div">
    Here some text...
  </div>
</div>

CSS :

#wrapper{
  width:400px;
  float:left;
  height:auto;
  border:1px solid purple;}

#left-div{
  width:40px;
  border:1px solid blue;
  float:left;}

#right-div{
  width:350px;
  border:1px solid red;
  float:left;}

ul{
  list-style-type: none;
  padding:0;
  margin:0;}

답변:


67

부동 요소에는 운이 없습니다. 수직 정렬을 따르지 않고

display:inline-block대신 다음 이 필요 합니다.

http://cssdesk.com/2VMg8

조심


display: inline-block;요소 사이의 공백을 실제 공백으로 해석하므로 주의하십시오 . 그렇게 무시하지 않습니다 display: block.

나는 이것을 추천한다 :

설정 font-size에 포함 된 요소의 0(영)과를 재설정 font-size요소가 너무 좋아에 필요한 값으로

ul {
    margin: 0;
    padding: 0;
    list-style: none;
    font-size: 0;
}
ul > li {
    font-size: 12px;
}

여기에서 데모를 참조하십시오. http://codepen.io/HerrSerker/pen/mslay


CSS

#wrapper{
  width:400px;
  height:auto;
  border:1px solid green;
  vertical-align: middle;
  font-size: 0;
}

#left-div{
  width:40px;
  border:1px solid blue;
  display: inline-block;
  font-size: initial;
  /* IE 7 hack */
  *zoom:1;
  *display: inline;
  vertical-align: middle;
}

#right-div{
  width:336px;
  border:1px solid red;
  display: inline-block;  
  font-size: initial;
  /* IE 7 hack */
  *zoom:1;
  *display: inline;
  vertical-align: middle;
}
  

#wrapper 높이가 고정되어 있으면 작동하지 않습니다. # right-div는 래퍼 요소가 아니라 # left-div를 기준으로 중앙에 배치 됩니다. ( inline-block차종은 인라인처럼 행동 imgalign속성 세트)
코스타

@Costa 그것이 있어야하는 방식이라고 생각합니다.
yunzen

그것이 어떤 방식이어야하는지는 중요하지 않습니다. 부동 요소를 사용해야하는 경우가 많으며 CSS에서 작업을 수행하는 방법이 항상 있습니다. 항상. 가장 간단한 경우, 부동
vsync

11
그러나 솔루션도 작동하지 않을 것입니다. 왜냐하면 float를 사용하지 않기로 결정할 수 없기 때문입니다. 요점은 float를 사용하는 동안 어떻게 든 수직 정렬하는 것입니다.
vsync 2013-08-21

2
내 요점은 때때로 인라인 차단이 옵션이 아니고 Google에서이 페이지에 접속할 수있는 다른 사람들을 돕기 위해 사용 사례를 제공했다는 것입니다. 무례 할 필요가 없었습니다.
Jamie Barker

21

디스플레이 테이블과 디스플레이 테이블 셀을 사용하면이 작업을 매우 쉽게 수행 할 수 있습니다.

#wrapper {
    width: 400px;
    float: left;
    height: auto;
    display: table;
    border: 1px solid green;
}

#right-div {
    width: 356px;
    border: 1px solid red;
    display: table-cell;
    vertical-align: middle;
}

편집 : 실제로 CSS 데스크에서 빠르게 엉망이되었습니다-http : //cssdesk.com/RXghg

다른 편집 : Flexbox를 사용하십시오. 이것은 작동하지만 꽤 구식입니다-http: //www.cssdesk.com/davf5

#wrapper {
    display: flex;
    align-items: center;
    border:1px solid green;
}

#left-div {
    border:1px solid blue;
}

#right-div {
    border:1px solid red;
}

1
안녕하세요 SpaceBeers. right-div의 오버플로를 숨기고 있기 때문에 귀하의 제안이 작동하지 않습니다 (방금 CSS 데스크에 코드를 추가했습니다). 솔루션을 사용하면 오버플로가 숨겨지지 않고 div가 너비를 확장합니다 ...
Marc

11

나는 이것이 고대의 질문이라는 것을 알고 있지만 플로트 수직 정렬 문제에 대한 해결책을 게시하는 것이 유용하다고 생각했습니다.

플로팅하려는 콘텐츠 주위에 래퍼를 만들면 :: after 또는 :: before 의사 선택기를 사용하여 래퍼 내에서 콘텐츠를 수직으로 정렬 할 수 있습니다. 정렬에 영향을주지 않고 원하는 콘텐츠의 크기를 조정할 수 있습니다. 유일한 캐치는 래퍼의 100 % 높이를 작성해야한다는 것입니다 자사의 컨테이너를.

http://jsfiddle.net/jmdrury/J53SJ/

HTML

<div class="container">
    <span class="floater">
        <span class="centered">floated</span>
    </span>
    <h1>some text</h1>
</div>

CSS

div {
    border:1px solid red;
    height:100px;
    width:100%;
    vertical-align:middle;
    display:inline-block;
    box-sizing: border-box;
}
.floater {
    float:right;
    display:inline-block;
    height:100%;
    box-sizing: border-box;
}
.centered {
    border:1px solid blue;
    height: 30px;
    vertical-align:middle;
    display:inline-block;
    box-sizing: border-box;
}
h1 {
    margin:0;
    vertical-align:middle;
    display:inline-block;
    box-sizing: border-box;
}
.container:after, .floater:after, .centered:after, h1:after {
    height:100%;
    content:'';
    font-size:0;
    vertical-align:middle;
    display:inline-block;
    box-sizing: border-box;
}

나는 당신이 무엇을하는지 잘 모르겠지만, centered클래스를 삭제하고 그 CSS에서 많은 중복 항목을 정리 한 후에도 여전히 수직 정렬을 잘 수행합니다. (포맷 손실에 대해 죄송합니다! ...) :div { border:1px solid red; height:100px; } .floater { float:right; height:100%; } h1 { vertical-align:middle; } .container:after, .floater:after, .centered:after { height:100%; content:''; font-size:0; vertical-align:middle; display:inline-block; }
Sz.


2

수레를 사용하지 않기 위해 최선을 다하지만 필요한 경우 다음 줄을 사용하여 가운데에 수직으로 정렬합니다.

position: relative;
top: 50%;
transform: translateY(-50%);

-1

내 수정 사항의 유일한 단점은 div 높이가 설정되어 있다는 것입니다 ... 그게 문제인지 아닌지 모르겠습니다.

http://cssdesk.com/kyPhC


1
안녕 션. 감사합니다.하지만 저는 유연한 솔루션을 사용하려고하므로 이런 종류의 솔루션을 피하고 싶습니다.
Marc
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.