div 내에서 가변 높이로 콘텐츠를 세로로 가운데 맞추는 방법은 무엇입니까?


158

내용의 높이가 가변적 일 때 div의 내용을 세로로 가운데 맞추는 가장 좋은 방법은 무엇입니까? 내 특별한 경우에는 컨테이너 div의 높이가 고정되어 있지만 컨테이너의 높이가 가변적 인 경우 해결책이 있다면 좋을 것입니다. 또한 CSS 해킹 및 / 또는 비의 미적 마크 업을 사용하지 않거나 거의 사용하지 않는 솔루션을 원합니다.

대체 텍스트


이 기사의 방법은 Safari (4.0.5)에서 분리됩니다 : S

7
@ ripper234 정확하지 않게,이 질문은 가변 높이 사업부에 대해 그대로
참여한 Rauli Rajande

9
또한이 질문이 먼저 제기되었습니다.
Gui Imamura

답변:


147

그냥 추가

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

내부 div.

내부 div의 상단 테두리를 외부 div의 절반 높이 ( top: 50%;)로 이동 한 다음 내부 div의 높이를 절반 ( transform: translateY(-50%))으로 이동합니다. 이것은 작동합니다 position: absoluterelative.

있다는 사실을 숙지 transform하고 translate단순에 포함되지 않은 업체 접두사가 있습니다.

코덱 : http://codepen.io/anon/pen/ZYprdb


6
왜 이것이 Chrome과 Firefox에서 작동하는지 궁금하지만 Safari에서는 그렇지 않습니다. 그런 다음 대부분의 transform관련 항목이 -webkit-접두어로 표시되어 작동합니다. 다시 -webkit-말해 , 접두사 를 추가하는 것을 잊지 마십시오 .
miho

5
github.com/postcss/autoprefixer 와 같은 도구 를 사용하여 접두사를 처리하십시오.
Jamie Chong

6
이 답변은 맨 위에 있어야합니다.
Jose Faeti

3
훨씬 더 많은 투표를해야합니다! 그건 그렇고, 그것은 또한 작동 position: absolute하지 않습니까?
caw

4
이 방법은 Chrome에서 불행한 부작용이 있습니다. 래퍼에 홀수의 픽셀이 있으면 translate모든 것에서 0.5 픽셀 높이를 처리하려고 할 때 모든 것이 흐릿하게 렌더링됩니다.
Keith

157

브라우저가 ::before의사 요소 인 CSS-Tricks : Centering in the Unknown을 지원하는 한이 문제에 대해 내가 찾은 최고의 솔루션 인 것 같습니다 .

추가 마크 업이 필요하지 않으며 매우 잘 작동하는 것 같습니다. 요소가 속성을 준수하지 않기 display: table때문에 메서드를 사용할 수 없습니다 .tablemax-height

.block {
  height: 300px;
  text-align: center;
  background: #c0c0c0;
  border: #a0a0a0 solid 1px;
  margin: 20px;
}

.block::before {
  content: '';
  display: inline-block;
  height: 100%; 
  vertical-align: middle;
  margin-right: -0.25em; /* Adjusts for spacing */

  /* For visualization 
  background: #808080; width: 5px;
  */
}

.centered {
  display: inline-block;
  vertical-align: middle;
  width: 300px;
  padding: 10px 15px;
  border: #a0a0a0 solid 1px;
  background: #f5f5f5;
}
<div class="block">
    <div class="centered">
        <h1>Some text</h1>
        <p>But he stole up to us again, and suddenly clapping his hand on my
           shoulder, said&mdash;"Did ye see anything looking like men going
           towards that ship a while ago?"</p>
    </div>
</div>


3
이제는 -BRILLIANT- 솔루션입니다. 이것을 게시 해 주셔서 감사합니다!
Troy Alford

다른 답변과 마찬가지로 접근 방식을 설명하고 링크의 코드를 포함하면이 방법이 훨씬 좋습니다.
KatieK

3
+1,이 솔루션은 정말 독창적입니다! .block { white-space: nowrap; font-size: 0; line-height: 0; }그러나 의사 요소에 음의 오른쪽 여백을 추가 하고 남겨 둘 수 있습니다. fs와 lh를 .centered에서 재설정해야합니다. 이렇게하면 요소가 뷰포트보다 넓은 경우에도 요소의 위치가 올바르게 지정됩니다. imo를 약간 지저분한 음수 마진을 사용할 필요는 없습니다).
Simon

@jessegavin-귀하의 의견으로는 ... 다음은 당신이 설명한 접근 방식에 대해 어떻게
쌓입니까

1
또한 이것은 외부 컨테이너 블록이 높이 대신 최소 높이를 가질 때 고장납니다.
링컨 B

16

이것은 여러 번 수행 해야하는 일이며 일관된 솔루션을 유지하려면 시맨틱하지 않은 마크 업과 브라우저 특정 해킹을 추가해야합니다. CSS 3에 대한 브라우저 지원을 받으면 죄를 짓지 않고 수직 센터링을 얻을 수 있습니다.

이 기술에 대한 더 나은 설명을 위해 내가 수정 한 기사를 볼 수 있지만 기본적으로 추가 요소를 추가하고 IE와 브라우저 position:table\table-cell에서 테이블이 아닌 요소 를 지원 하는 다른 스타일을 적용하는 것이 포함됩니다 .

<div class="valign-outer">
    <div class="valign-middle">
        <div class="valign-inner">
            Excuse me. What did you sleep in your clothes again last night. Really. You're gonna be in the car with her. Hey, not too early I sleep in on Saturday. Oh, McFly, your shoe's untied. Don't be so gullible, McFly. You got the place fixed up nice, McFly. I have you're car towed all the way to your house and all you've got for me is light beer. What are you looking at, butthead. Say hi to your mom for me.
        </div>
    </div>
</div>

<style>
    /* Non-structural styling */
    .valign-outer { height: 400px; border: 1px solid red; }
    .valign-inner { border: 1px solid blue; }
</style>

<!--[if lte IE 7]>
<style>
    /* For IE7 and earlier */
    .valign-outer { position: relative; overflow: hidden; }
    .valign-middle { position: absolute; top: 50%; }
    .valign-inner { position: relative; top: -50% }
</style>
<![endif]-->
<!--[if gt IE 7]> -->
<style>
    /* For other browsers */
    .valign-outer { position: static; display: table; overflow: hidden; }
    .valign-middle { position: static; display: table-cell; vertical-align: middle; width: 100%; }
</style>

특정 브라우저 세트에 스타일을 적용하는 많은 방법 (해킹)이 있습니다. 조건부 주석을 사용했지만 위에 링크 된 기사를보고 다른 두 가지 기술을 확인하십시오.

참고 : 높이를 미리 알고 있거나 한 줄의 텍스트를 가운데에 배치하려는 경우 또는 다른 여러 경우에 세로 가운데를 맞추는 간단한 방법이 있습니다. 브라우저 해킹이나 시맨틱하지 않은 마크 업이 필요없는 방법이있을 수 있으므로 더 자세한 정보가있는 경우 처리하십시오.

업데이트 : CSS3에 대한 브라우저 지원이 향상되어 플렉스 박스와 변환이 모두 수직 중심화 (다른 효과 중에서)를 얻는 대체 방법으로 제공됩니다. 참조 이 다른 질문을 현대적인 방법에 대한 자세한 내용은, 그러나 브라우저 지원은 여전히 CSS3에 대한 스케치 있음을 유의하십시오.


예, 오늘 그 기사를 찾았고 특정 상황에서 작동하도록 만들 수 없었습니다. 아마도 더 자세히 살펴볼 필요가 있습니다.
jessegavin

작동하지 않는 코드를 게시 할 수 있습니까?
Chris Marasti-Georg

이것이 여전히이 문제에 대한 최상의 솔루션입니까?
ripper234

이 기사는 Chrome 23, Firefox 16 및 IE 9에서는 작동하지 않는 것 같습니다. 이 답변이 더 나은 솔루션 인 것 같습니다.
페르난도 코 레이아

아니요,이 도움말은 2013 년 2 월 24 일부터 최신 Chrome 및 Firefox에서 작동합니다.
OMA

9

자식 선택기를 사용하여 위 의 Fadi의 놀라운 대답을 취해 적용 할 수있는 하나의 CSS 규칙으로 정리했습니다. 이제 내가 contentCentered중심에두고 싶은 요소에 클래스 이름을 추가 하기 만하면됩니다.

.contentCentered {
  text-align: center;
}

.contentCentered::before {
  content: '';
  display: inline-block;
  height: 100%; 
  vertical-align: middle;
  margin-right: -.25em; /* Adjusts for spacing */
}

.contentCentered > * {
  display: inline-block;
  vertical-align: middle;
}
<div class="contentCentered">
  <div>
    <h1>Some text</h1>
    <p>But he stole up to us again, and suddenly clapping his hand on my
      shoulder, said&mdash;"Did ye see anything looking like men going
      towards that ship a while ago?"</p>
  </div>
</div>

갈래 코드 펜 : http://codepen.io/dougli/pen/Eeysg


멋있는. 공유해 주셔서 감사합니다. 주의 할 점은 *셀렉터가 허용 된 답변보다 성능이 떨어질 것입니다. 문제가되지는 않지만 주목할 가치가 있습니다. stevesouders.com/blog/2009/06/18/simplifying-css-selectors
jessegavin

감사. 예, 아마도 성능이 떨어질 수 있지만 요즘 CSS 규칙은 크게 영향을 미치지 않을 것입니다. > div대신 에를 선택하여이를 개선 할 수 있습니다 . calendar.perfplanet.com/2011/…
dougli

간단하고 훌륭합니다. 완벽하게 작동합니다.
Lovro

4

지금까지 가장 좋은 결과 :

중심이 될 div :

position: absolute;
top: 50%;
transform: translateY(-50%);
margin: 0 auto;
right: 0;
left: 0;

매력처럼 일했다
m4heshd

3

여백 자동을 사용할 수 있습니다. 플렉스를 사용하면 div도 세로 중앙에있는 것처럼 보입니다.

body,
html {
  height: 100%;
  margin: 0;
}
.site {
  height: 100%;
  display: flex;
}
.site .box {
  background: #0ff;
  max-width: 20vw;
  margin: auto;
}
<div class="site">
  <div class="box">
    <h1>blabla</h1>
    <p>blabla</p>
    <p>blablabla</p>
    <p>lbibdfvkdlvfdks</p>
  </div>
</div>

display : flex는 여전히 실제 실험 기능입니다. 아직 브라우저를 지원하지 않습니다
andreszs

1

나를 위해 가장 좋은 방법은 다음과 같습니다.

.container{
  position: relative;
}

.element{
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
}

장점은 높이를 명시 적으로 만들 필요가 없습니다.


0

이것은 div동적 (백분율) 높이의 멋진 솔루션입니다 .

CSS

.vertical_placer{
  background:red;
  position:absolute; 
  height:43%; 
  width:100%;
  display: table;
}

.inner_placer{  
  display: table-cell;
  vertical-align: middle;
  text-align:center;
}

.inner_placer svg{
  position:relative;
  color:#fff;
  background:blue;
  width:30%;
  min-height:20px;
  max-height:60px;
  height:20%;
}

HTML

<div class="footer">
    <div class="vertical_placer">
        <div class="inner_placer">
            <svg> some Text here</svg>
        </div>
    </div>
</div>  

혼자서 시도하십시오.


0

아래 코드와 같은 플렉스 디스플레이를 사용할 수 있습니다.

.example{
  background-color:red;
  height:90px;
  width:90px;
  display:flex;
  align-items:center; /*for vertically center*/
  justify-content:center; /*for horizontally center*/
}
<div class="example">
    <h6>Some text</h6>
</div>

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