왜 세로 정렬 : 중간이 스팬 또는 div에서 작동하지 않습니까?


247

다른 요소 내 에서 span또는 div요소 를 세로로 가운데에 맞추려고합니다 div. 그러나 내가 넣을 때 vertical-align: middle아무 일도 일어나지 않습니다. display두 요소 의 속성을 변경하려고 시도했지만 아무것도 작동하지 않는 것 같습니다.

이것은 내가 현재 내 웹 페이지에서하고있는 일입니다.

.main {
  height: 72px;
  vertical-align: middle;
  border: 1px solid black;
  padding: 2px;
}
    
.inner {
  vertical-align: middle;
  border: 1px solid red;    
}
    
.second {
  border: 1px solid blue; 
}
<div class="main">
  <div class="inner">
    This box should be centered in the larger box
    <div class="second">Another box in here</div>
  </div>
</div>

작동하지 않는 것을 보여주는 구현의 jsfiddle은 다음과 같습니다. http://jsfiddle.net/gZXWC/

답변:


207

이것은 가장 좋은 방법 인 것 같습니다-원래 게시물 이후로 시간이 지났으며 지금해야 할 일입니다 .http : //jsfiddle.net/m3ykdyds/200

/* CSS file */

.main {
    display: table;
}

.inner {
    border: 1px solid #000000;
    display: table-cell;
    vertical-align: middle;
}

/* HTML File */
<div class="main">
    <div class="inner"> This </div>
</div>

2
그렇다면 OP가 원하는 것을 어떻게해야할까요?
Ryan Mortensen

가변 라인 단락에 대한 아이디어가 있습니까? 즉. 한 줄인지 두 줄인지 알 방법이 없다면. 그런 다음 jQuery를 사용해야합니까?
foochow

높이가 동적이어야하는 경우 어떻게해야합니까?
Murhaf Sousli

허용되는 답이 아니어야합니다. '.inner'의 높이를 아는 것에 의존하므로 OP가 요구하는 것과 정확하게 일치하지는 않으며 아래에서 훨씬 더 나은 대답은 @timbergus 또는 Tim Perkins의 대답이 바닥 근처에서 내려 오는 것을 참조하십시오.
mike-source

@ mike-source는 약간의 자바 스크립트가 해당 DOM 객체의 CSS 규칙을 알아 내고 동적으로 변경할 수 있기 때문에 높이가 동적 인 경우에도 내부의 높이를 아는 것은 100 % 가능합니다.
Charles Addis

143

CSS3 사용하기 :

<div class="outer">
   <div class="inner"/>
</div>

CSS :

.outer {
  display : flex;
  align-items : center;
  justify-content: center;
}

참고 : 이전 IE에서는 작동하지 않을 수 있습니다


16
이것은 모든 주요 최신 브라우저와 가장 단순하고 깨끗한 솔루션에 의해 지원됩니다.
Sam

2
또한 inline-flex내부 요소 내부에 여러 요소가 한 줄로 있어야합니다.
Dan Nissenbaum 2016 년

1
내 경우에는 .inner의 내용을 가로로 가운데에 맞추고 싶기 때문에을 추가해야했습니다 .inner { width: 100%; }. 이렇게 .outer { display: table; } .inner { display: table-cell; vertical-align: middle; }하면 최소 너비를 강요하지 않고 작동하는 것처럼 보입니다 .
Bart S

나는 justify-content: center;수평으로 정렬하여 잘 작동했습니다
Ruth Young

140

이것을 시도하고 나를 위해 잘 작동합니다 :

/* Internet Explorer 10 */
display:-ms-flexbox;
-ms-flex-pack:center;
-ms-flex-align:center;

/* Firefox */
display:-moz-box;
-moz-box-pack:center;
-moz-box-align:center;

/* Safari, Opera, and Chrome */
display:-webkit-box;
-webkit-box-pack:center;
-webkit-box-align:center;

/* W3C */
display:box;
box-pack:center;
box-align:center;

4
훌륭한 답변으로, 이것은 다른 노크 문제 (jquerymobile + phonegap를 사용하는 앱 및 다른 모든 솔루션으로 인해 CSS 및 div 크기 조정 문제가 발생하지 않음)를 발생시키지 않은 완전히 작동하는 솔루션을 제공했습니다. 이 매개 변수는 가운데 / 중간에 배치 할 요소에 특정한 CSS 블록에 추가해야한다는 것을 지적하십시오. 예 : #element span {height:100%;display:-webkit-box;-webkit-box-pack:center;-webkit-box-align:center;}-높이가 컨테이너의 전체 높이 (아마도 div)를 상속하도록 높이가 중요합니다. 당신은 여전히 ​​수직 중심을 얻지 못할 것입니다!
Andy Lorenz

BTW, 당신은 브라우저 접두사없이 표준 인 flexbox 코드를 작성할 수 있습니다 다음 브라우저가 autoprefixer의 접두사 얻을 github.com/postcss/autoprefixer 또는 온라인 데모를 통해 simevidas.jsbin.com/gufoko/quiet
starikovs

2
잘못된 속성 값 boxdisplay
Joaquinglezsantos

또한 @ user1782556의 답변은 외부 상자에 패딩이있을 때 더 잘 작동합니다.
iautomation

34

div를 포함하는 것과 같은 높이로 선 높이를 설정하면 작동합니다.

데모 http://jsfiddle.net/kevinPHPkevin/gZXWC/7/

.inner {
    line-height:72px;
    border: 1px solid #000000;
}

1
그 방법을 설명하는 링크를 게시했습니다. 그래도 나머지 레이아웃의 크기가 고정되어 있지 않으면 선호하는 방법이 아닙니다.이 방법으로 다른 크기의 뷰포트에서 문제가 발생했습니다.
Charles Addis

2
예. 줄 높이 기술은 잘 작동하지만 한 줄짜리 내용이있는 경우에만 가능합니다. 추가 라인이 유실되거나 컨테이너 외부로 유출되므로 다시 시작해야합니다!
Andy Lorenz

a) line-height내부 요소의 높이도 변경됩니다. b) 내부 요소가 여전히 정확하게 수직으로 중앙에 있지 않습니다. c) 텍스트를 포함하지 않는 요소 (예 :) <img>또는 높이가 고정 된 요소에서는 작동하지 않습니다 .
Alph.Dev

또한 글꼴 렌더링 차이로 인해 크로스 OS (Windows / Mac)에서 오류가 발생할 수 있습니다
LocalPCGuy

1
이것은 매우 예측할 수 없으며 종종 컨테이너에 여분의 높이가 생깁니다.
방해받지 않음

25

혹시 인 flexbox ... 장소에 의존 할 수 없습니다 .child.parent의 중심. 픽셀 크기를 알 수 없을 때 (즉, 항상) IE9 +에 문제가 없을 때 작동

.parent { position: relative; }

.child {
    position: absolute;
    top : 50%;
    left: 50%;
    -ms-transform: translate(-50%, -50%);
    transform    : translate(-50%, -50%);    
}
<div class="parent" style="background:lightyellow; padding:6em"> 
  <div class="child" style="background:gold; padding:1em">&mdash;</div> 
</div>


이것은 내가 지금까지 필요 IE9 호환성을 본 적이 특히 대부분의 프로젝트 때문에, 실제로 가장 잘 솔루션
재버 워키

21

vertical-align: middle내부 요소를 입어야 합니다외부 요소가 아닌 . line-height외부 요소 의 속성을 외부 요소 의 속성과 일치하도록 설정하십시오 height. 다음 설정 display: inline-blockline-height: normal내측 요소. 이렇게하면 내부 요소의 텍스트가 일반 선 높이로 줄 바꿈됩니다. Chrome, Firefox, Safari 및 IE 8 이상에서 작동

.main {
    height: 72px;
    line-height:72px;
    border: 1px solid black;
}
.inner {
    display: inline-block;
    vertical-align: middle;
    line-height: normal;
}
<div class="main">
    <div class="inner">Vertically centered text</div>
</div>

깡깡이


이것은 아마도 가장 간단한 방법 일 것입니다 ...이 페이지의 다른 모든 답변은 불필요하게 어색하거나 해킹되거나 이전 브라우저에서 지원되지 않거나 내부 요소의 높이를 알고 있어야합니다. 당신은 실제로 필요하지 않습니다 line-height: normal;display:inline;도 작동합니다. 이 방법의 보너스는 방해하지 않는 것입니다 text-align:center;사용하는 display: table-cell;문제를 만들 수 있습니다. 우리는 종종 수평뿐만 아니라 수직으로 정렬하기를 원합니다. 이 편집 된 바이올린을보십시오 : jsfiddle.net/br090prs/36
mike-source

2
@ 마이크 소스 이유는 사용 line-height: normal하고 display: inline-block내부 텍스트가 제대로 감싸도록한다. 내부 div의 텍스트가 줄 바꿈되지 않을 경우 이러한 속성이 필요하지 않습니다.
Tim Perkins

Microsoft가 이전 버전의 IE에 대한 지원을 종료 한 이래로 @ user1782556이 제안한대로 flexbox를 사용했습니다. 내 원래의 대답은 여전히 ​​IE 10 이상을 지원 해야하는 경우 갈 수있는 방법입니다.
팀 퍼킨스

100 % 동의하지만 개인적으로 아직 flex box를 사용하지는 않겠지 만, 브라우저의 76 %만이 2016 년 5 월 기준으로 완벽하게 지원합니다 (부분 지원을 포함하는 경우 94 %). caniuse.com/#search=flexible% 20 박스 . 그러나 사용자 기반에 따라 가장 합리적인 옵션에 매우 가까워지고 있습니다.
mike-source

10

나는 누군가를 돕는 경우를 대비하여 래퍼 div의 중앙에있는 모든 것을 정렬하기 위해 이것을 사용했습니다.

div.wrapper {
  /* --- This works --- */
  display: flex;
  /* Align Vertically */
  align-items: center;
  /* Align Horizontally */
  justify-content: center;
  /* --- ---------- ----- */
  width: 100%;
  height:100px;
  background-color: blue;
}
div.inner {
  width: 50px;
  height: 50px;
  background-color: orange;
}
<div class="wrapper">
  <div class="inner">
  </div>
</div>


7

다음은 수직 정렬을 수행하는 두 가지 방법의 예입니다. 나는 그것들을 사용하고 그들은 꽤 잘 작동합니다. 하나는 절대 위치를 사용하고 다른 하나는 flexbox를 사용 합니다 .

수직 정렬 예

인 flexbox를 사용하면 함께 다른 요소 내부에 자체적으로 요소를 정렬 할 수 있습니다 display: flex;사용 align-self. 당신은 수평으로 또한 정렬해야하는 경우 사용할 수 있습니다 align-itemsjustify-content 컨테이너에서 .

flexbox를 사용하지 않으려면 position 속성을 사용할 수 있습니다. 컨테이너를 상대 및 컨텐츠를 절대적으로 만들면 컨텐츠가 컨테이너 내부에서 자유롭게 이동할 수 있습니다. 그래서 당신이 사용하는 경우 top: 0;left: 0;내용에서, 그것은 컨테이너의 왼쪽 상단 모서리에 배치됩니다.

절대 위치

그런 다음 정렬하려면 상단 및 왼쪽 참조를 50 %로 변경하면됩니다. 그러면 컨텐츠의 왼쪽 상단 모서리에서 컨테이너 중심에 컨텐츠가 배치됩니다.

용기 중앙에 정렬

따라서 내용의 절반 크기를 왼쪽과 위쪽으로 변환하여이를 수정해야합니다.

절대 중심


5

여기에 정렬 방법에 대한 훌륭한 기사가 있습니다. 저는 플로트 방식을 좋아합니다.

http://www.vanseodesign.com/css/vertical-centering/

HTML :

<div id="main">
    <div id="floater"></div>
    <div id="inner">Content here</div>
</div>

그리고 해당 스타일 :

#main {
   height: 250px;
}

#floater {
   float: left;
   height: 50%;
   width: 100%;
   margin-bottom: -50px;
}

#inner {
   clear: both;
   height: 100px;
}

3
#inner 블록의 높이를 정의하면 올바른 수직 중심 개념이 무효화됩니다. OPS는 자동으로 만들 것을 요청했기 때문에 개념 상자에서 내부 상자의 높이를 알 수 없다는 것을 의미합니다.
Alexis Wilke

5

HTML

<div id="myparent">
  <div id="mychild">Test Content here</div>
</div>

CSS

#myparent {
  display: table;
}
#mychild {
  display: table-cell;
  vertical-align: middle;
}

부모 div를 테이블로 표시하고 자식 div를 테이블 셀로 표시하도록 설정했습니다. 그런 다음 자식 div에서 세로 정렬을 사용하고 그 값을 중간으로 설정할 수 있습니다. 이 자식 div 내부의 모든 것은 세로 중심이됩니다.


4

간단 해. display:table-cell메인 클래스에 추가 하십시오.

.main {
  height: 72px;
  vertical-align: middle;
  display:table-cell;
  border: 1px solid #000000;
}

jsfiddle을 확인하십시오 !


4

여기에 가장 간단한 해결책이 있습니다-아무것도 변경할 필요가 없으며, 중앙에 배치하려는 div 컨테이너에 3 줄의 CSS 규칙을 추가하십시오. 나는 Flex Box#LoveFlexBox를 사랑

.main {
  /* I changed height to 200px to make it easy to see the alignment. */
  height: 200px;
  vertical-align: middle;
  border: 1px solid #000000;
  padding: 2px;
  
  /* Just add the following three rules to the container of which you want to center at. */
  display: flex;
  flex-direction: column;
  justify-content: center;
  /* This is true vertical center, no math needed. */
}
.inner {
  border: 1px solid #000000;
}
.second {
  border: 1px solid #000000;
}
<div class="main">
  <div class="inner">This box should be centered in the larger box
    <div class="second">Another box in here</div>
  </div>
  <div class="inner">This box should be centered in the larger box
    <div class="second">Another box in here</div>
  </div>
</div>

보너스

justify-content값은 다음과 같은 몇 가지 옵션을 설정할 수 있습니다 :

  • flex-start하위 컨테이너를 상위 컨테이너에서 플렉스 흐름이 시작되는 위치에 정렬합니다. 이 경우 상단에 유지됩니다.

  • center하위 div를 부모 컨테이너의 중심에 정렬합니다. 모든 자식을 감싸기 위해 추가 div를 추가 할 필요가 없기 때문에 래퍼를 부모 컨테이너에 넣어 자식을 중앙에 배치 할 필요가 없기 때문에 이것은 정말 깔끔합니다. 그 때문에 이것은 진정한 의 수직 중심 ( column flex-direction. 유사하게, 당신은을 변경하는 경우 flow-directionrow, 그것은 수평으로 중심이 될 것입니다.

  • flex-end하위 컨테이너를 플렉스 흐름이 상위 컨테이너에서 끝나는 위치에 정렬합니다. 이 경우 아래쪽으로 이동합니다.

  • space-between흐름의 시작부터 흐름의 끝까지 모든 어린이를 분산시킵니다. 데모 인 경우 다른 자식 div를 추가하여 확산되었음을 보여줍니다.

  • space-around와 비슷 space-between하지만 흐름의 시작과 끝에 공백의 절반 이 있습니다.


완벽한 솔루션. 호환되지 않는 브라우저는 컨텐츠를 정렬하지 않고 사용자가 처리하거나 브라우저를 업그레이드해야합니다.
twicejr

0

이후 vertical-alignA의 예상대로 작동 td, 당신은 단세포를 넣을 수 tablediv그 내용을 정렬 할 수 있습니다.

<div>
    <table style="width: 100%; height: 100%;"><tr><td style="vertical-align: middle; text-align: center">
        Aligned content here...
    </td></tr></table>
</div>

어리석은 일이지만 내가 알 수있는 한 작동합니다. 다른 해결 방법의 단점이 없을 수 있습니다.


5
아니, 제발 더 이상 테이블이 없어 CSS는 깔끔하게 그렇게 할 수 있습니다. 이 경우 <table>을 사용할 필요가 없습니다.
enguerranws

0

내용을 높이가 100 % 인 표 안에 넣고 기본 div의 높이를 설정하십시오.

<div style="height:80px;border: 1px solid #000000;">
<table style="height:100%">
<tr><td style="vertical-align: middle;">
  This paragraph should be centered in the larger box
</td></tr>
</table>
</div>

0

다른 div 내에서 span 또는 div 요소를 세로로 가운데에 맞추려면 부모 div에 상대적인 위치를 추가하고 자식 div에 절대 위치를 지정하십시오. 이제 자식 div는 div 내부의 어느 위치 에나 배치 할 수 있습니다. 아래 예는 가로 및 세로 중앙에 있습니다.

<div class="parent">
    <div class="child">Vertically and horizontally centered child div</div>
</div>

CSS :

.parent{
    position: relative;
}
.child{
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    margin: auto;
}

0

이것은 현대적인 접근 방식이며 CSS Flexbox 기능을 사용합니다. 이제 수직 바로 이러한 스타일을 추가하여 부모 컨테이너 내의 내용을 정렬 할 수 있습니다 .main컨테이너

.main {
        display: flex;
        flex-direction: column;
        justify-content: center;
}

그리고 당신은 갈 수 있습니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.