고정 된 div의 CSS 수평 중심?


183
#menu {
    position: fixed;
    width: 800px;
    background: rgb(255, 255, 255); /* The Fallback */
    background: rgba(255, 255, 255, 0.8);
    margin-top: 30px;
}

나는이 질문이 백만 번 나왔다는 것을 알고 있지만 내 사건에 대한 해결책을 찾을 수 없습니다. 화면에 고정되어야하는 div가 있습니다. 페이지가 스크롤 되더라도 항상 화면 중앙에 CENTERED 상태로 있어야합니다!

div는 500px너비를 가져야 30px하고 상단 (여백 상단)에서 떨어져 있어야하며 모든 브라우저 크기에 대해 페이지 중앙에서 가로로 가운데에 있어야하며 나머지 페이지를 스크롤 할 때 움직이지 않아야합니다.

가능합니까?


답변:


167
left: 50%;
margin-left: -400px; /* Half of the width */

25
브라우저 창의 크기를 조정할 때 의도 한대로 작동하지 않습니다.

3
@Bahodir : 확실합니까? 크기 조정시 나에게 올바르게 보입니다. 나는 이것이 -400div의 너비가로 설정되어 있다고 생각 합니다 800.
Merlyn Morgan-Graham

1
@PrestonBadeer — 질문에 대한 질문처럼?
Quentin

3
완전히 동의하십시오-이것은 해결책 이 아닙니다 ! 이런 식으로 무언가를 하드 코딩 하지 마십시오 . -1
네이트 I I

3
나는 그 날에 대한 나쁜 대답이 아니기 때문에 이것을 아래로 투표하지 않았습니다. 좋은 답변 이었지만 더 이상 그렇지 않기 때문에 다음으로 높은 답변에는 최고의 답변으로 볼 수있는 모든 도움이 필요합니다. 지금. Quentin : 답변 자체에서 해당 효과에 대한 설명을 편집하는 것이 좋습니다. 그런 다음 내 투표를 취소합니다.
Nick Rice

547

여기에 대한 답변은 구식입니다. 이제 여백을 하드 코딩하지 않고도 CSS3 변환 쉽게 사용할 수 있습니다 . 너비 나 동적 너비가없는 요소를 포함한 모든 요소에서 작동합니다.

수평 중심 :

left: 50%;
transform: translateX(-50%);

수직 중심 :

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

수평 및 수직 모두 :

left: 50%;
top: 50%;
transform: translate(-50%, -50%);

호환성은 문제가되지 않습니다 : http://caniuse.com/#feat=transforms2d


86
+1이 답변은 stackoverflow의 문제를 보여줍니다. 하루에 좋았고 올바르게 받아 들여진 오래된 답변은 여전히 ​​적절한 인상을 주면서 자랑스럽게 앉아있을 수 있지만이 같은 새로운 세상에 대한 훌륭한 답변은 확률에 맞서 싸워라.
Nick Rice

10
@NickRice 100 % 동의했습니다. 이 답변은 새로 수락 된 답변이어야합니다. 주니어 개발자는 현재 허용되는 답변 조차 보지 않아야합니다 !
네이트 I

2
@matt 대신 이것을 받아주십시오. 이것을 보려면 길게 스크롤하십시오.
ssbb

4
이렇게하면 내용 요소의 상자 그림자에 흐림 효과가 나타납니다.
rab

4
예, Chrome은 변환 된 콘텐츠를 잘못 흐리게합니다. 텍스트도 흐려집니다. 그러나 이것은 하드 코딩없이 래퍼 요소를 사용하지 않고 고정 요소를 중심으로하는 유일한 솔루션입니다. 배경의 포인터 이벤트에 신경 쓰지 않으면 전체 화면 래퍼 및 flexbox 또는 아래 @salomvary의 솔루션으로 동일한 효과를 얻을 수 있습니다.
Maciej Krawczyk

58

인라인 블록을 사용하는 것이 옵션이라면이 방법을 권장합니다.

.container { 
    /* fixed position a zero-height full width container */
    position: fixed;
    top: 0; /* or whatever position is desired */
    left: 0;
    right: 0;
    height: 0;
    /* center all inline content */
    text-align: center;
}

.container > div {
    /* make the block inline */
    display: inline-block;
    /* reset container's center alignment */
    text-align: left;
} 

나는 여기에 짧은 게시물을 썼습니다 : http://salomvary.github.com/position-fixed-horizontally-centered.html


1
10 배, 이것은 나를 위해 큰 일 / O를위한 하드 코드에 어떤 번호를 가진 w width또는 무언가 - @Quentins 대답과는 달리
Yatharth 아가 왈

30

2016 년 9 월 편집 : 세상이 계속 움직 였기 때문에 여전히 찬성 투표를하는 것이 좋지만 이제는 변환을 사용하는 대답 (그리고 많은 찬성 투표가 있음)을 사용합니다. 나는 더 이상 이런 식으로하지 않을 것입니다.

여백을 계산하거나 하위 컨테이너가 필요하지 않은 다른 방법 :

#menu {
    position: fixed;   /* Take it out of the flow of the document */
    left: 0;           /* Left edge at left for now */
    right: 0;          /* Right edge at right for now, so full width */ 
    top: 30px;         /* Move it down from top of window */
    width: 500px;      /* Give it the desired width */ 
    margin: auto;      /* Center it */
    max-width: 100%;   /* Make it fit window if under 500px */ 
    z-index: 10000;    /* Whatever needed to force to front (1 might do) */
}

@Joey 바닥 : 0은 무엇을 하는가? 즉 왜 필요한가? (내가 이것을
Nick Rice

bottom:0메뉴가 항상 세로 중앙에 있는지 확인하지만 이제는 OP가 요청한 것이 아닙니다. :)
Jordan H

요소 높이가 창 (뷰포트) 높이보다 높으면 FF의 중심에 있지 않다는 것을 알았으므로 다른 컨텍스트에서 이것을 사용하려고했습니다.
Philipp Werminghausen

세계가 발전했기 때문에 이제 변환을 사용하는 대답을 살펴 보겠습니다. (응답자가 사용한 이름을 참조하여이 의견을 작성 했음에도 불구하고 이름이 바뀌어 내 ​​의견이 더 이상 이해되지 않고 삭제되었습니다. 대신이 페이지에서 변형을 검색하십시오.)
Nick Rice

7

이 방법으로 div를 수평으로 중앙에 배치하는 것이 가능합니다.

html :

<div class="container">
    <div class="inner">content</div>
</div>

CSS :

.container {
    left: 0;
    right: 0;
    bottom: 0; /* or top: 0, or any needed value */
    position: fixed;
    z-index: 1000; /* or even higher to prevent guarantee overlapping */
}

.inner {
    max-width: 600px; /* just for example */
    margin: 0 auto;
}

이 방법을 사용하면 항상 내부 블록을 중앙에 배치 할 수 있으며 또한 예를 들어 작은 화면에서는 유동적으로 반응하는 진정한 반응으로 쉽게 전환 할 수 있으므로 질문 예와 선택한 답변에 제한이 없습니다. .


5

... 또는 메뉴 div를 다른 것으로 감쌀 수 있습니다.

    <div id="wrapper">
       <div id="menu">
       </div>
    </div>


#wrapper{
         width:800px;
         background: rgba(255, 255, 255, 0.8);
         margin:30px auto;
         border:1px solid red;
    }

    #menu{
        position:fixed;
        border:1px solid green;
        width:300px;
        height:30px;
    }

5

또 다른 2 분할 솔루션이 있습니다. 간결하고 하드 코딩되지 않은 상태로 유지하려고했습니다. 먼저 예상되는 html :

<div id="outer">
  <div id="inner">
    content
  </div>
</div>

다음 CSS의 원리는 "외부"의 일부를 배치 한 다음 "내부"의 크기를 가정하여 후자를 상대적으로 이동시키는 것입니다.

#outer {
  position: fixed;
  left: 50%;          // % of window
}
#inner {
  position: relative;
  left: -50%;         // % of outer (which auto-matches inner width)
}

이 방법은 Quentin과 비슷하지만 내부 크기는 다양 할 수 있습니다.


-1

전체 화면 래퍼 div를 사용할 때 flexbox 솔루션이 있습니다. 정당화-컨텐츠는 자식 div를 가로로 맞추고 항목을 정렬합니다.

<div class="full-screen-wrapper">
    <div class="center"> //... content</div>
</div>

.full-screen-wrapper { 
  position: fixed;
  display: flex;
  justify-content: center;
  width: 100vw;
  height: 100vh;
  top: 0;
  align-items: center;
}

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