Định tâm ngang CSS của một div cố định?


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

Tôi biết câu hỏi này là một triệu lần ngoài kia, tuy nhiên tôi không thể tìm ra giải pháp cho trường hợp của mình. Tôi đã có một div, cần được sửa trên màn hình, ngay cả khi trang được cuộn, nó vẫn luôn luôn ở giữa màn hình!

Div nên có 500pxchiều rộng, nên 30pxcách xa đỉnh (lề trên), nên được đặt ở giữa theo chiều ngang ở giữa trang cho tất cả các kích thước trình duyệt và không nên di chuyển khi cuộn phần còn lại của trang.

Điều đó có thể không?


Câu trả lời:


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

25
nó không hoạt động như dự định khi bạn thay đổi kích thước cửa sổ trình duyệt.

3
@Bahodir: Bạn có chắc không? Nó có vẻ đúng với tôi về thay đổi kích thước. Tôi nghĩ rằng điều này -400là do chiều rộng của div được đặt thành 800.
Merlyn Morgan-Graham

1
@PrestonBadeer - Giống như câu hỏi đang hỏi về?
Quentin

3
Hoàn toàn đồng ý - đây KHÔNG phải là một giải pháp! Không bao giờ mã cứng một cái gì đó theo cách này. -1
Nate I

3
Tôi đã bỏ phiếu này KHÔNG vì đó là một câu trả lời tồi cho ngày hôm nay - đó là một câu trả lời hay, nhưng vì nó không còn nữa, và câu trả lời cao nhất tiếp theo cần tất cả sự giúp đỡ để có thể được coi là câu trả lời tốt nhất HIỆN NAY. Quentin: Tôi nghĩ rằng sẽ là một ý tưởng tốt để chỉnh sửa trong một nhận xét về hiệu ứng đó trong chính câu trả lời - Sau đó tôi sẽ đảo ngược phiếu bầu của mình.
Nick Rice

546

Các câu trả lời ở đây đã lỗi thời. Bây giờ bạn có thể dễ dàng sử dụng một biến đổi CSS3 mà không cần mã hóa lề . Điều này hoạt động trên tất cả các yếu tố, bao gồm các yếu tố không có chiều rộng hoặc chiều rộng động.

Trung tâm ngang:

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

Trung tâm dọc:

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

Cả ngang và dọc:

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

Khả năng tương thích không phải là vấn đề: http://caniuse.com/#feat=transforms2d


86
+1 Câu trả lời này thể hiện một vấn đề với stackoverflow: Câu trả lời cũ tốt cho ngày của họ và được chấp nhận một cách đúng đắn có thể tự hào trên đầu mang lại ấn tượng rằng chúng vẫn phù hợp, trong khi câu trả lời tuyệt vời cho một thế giới mới hơn, như thế giới này, phải chiến đấu theo cách của họ chống lại tỷ lệ cược.
Nick Rice

10
@NickRice đồng ý 100%. Câu trả lời này phải là câu trả lời mới được chấp nhận. Junior devs thậm chí không nên xem câu trả lời được chấp nhận hiện tại!
Nate I

2
@matt vui lòng chấp nhận cái này thay thế. Di chuyển xa đến lâu để thấy điều này.
ssbb

4
Điều này làm cho hiệu ứng mờ trong bóng hộp trong các yếu tố nội dung.
rab

4
Có, Chrome không chính xác làm mờ nội dung được chuyển đổi. Văn bản cũng bị mờ. Nhưng đây là giải pháp duy nhất để có một phần tử cố định tập trung mà không cần mã hóa cứng và sử dụng các phần tử trình bao bọc. Nếu bạn không quan tâm đến các sự kiện con trỏ của nền, bạn có thể đạt được hiệu ứng tương tự với trình bao bọc toàn màn hình và flexbox hoặc giải pháp @ salomvary bên dưới.
Maciej Krawchot

58

Nếu sử dụng khối nội tuyến là một tùy chọn, tôi sẽ khuyên bạn nên sử dụng phương pháp này:

.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;
} 

Tôi đã viết một bài viết ngắn về điều này ở đây: http://salomvary.github.com/poseition-fixed-horizontally-centered.html


1
10 lần, điều này rất hữu ích đối với tôi khi không phải mã hóa bất kỳ số nào cho widthhoặc một cái gì đó - không giống như câu trả lời của
@Quentins

30

Chỉnh sửa tháng 9 năm 2016: Mặc dù thật tuyệt khi vẫn nhận được một phiếu bầu thỉnh thoảng cho điều này, bởi vì thế giới đã chuyển sang, bây giờ tôi đi với câu trả lời sử dụng biến đổi (và có rất nhiều sự ủng hộ). Tôi sẽ không làm theo cách này nữa.

Một cách khác để không phải tính toán ký quỹ hoặc cần một thùng chứa phụ:

#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 Đáy: 0 làm gì? tức là tại sao cần thiết? (Đó là một thời gian kể từ khi tôi nhìn vào điều này!)
Nick Rice

bottom:0sẽ đảm bảo menu luôn được căn giữa theo chiều dọc, nhưng tôi thấy bây giờ đó không phải là những gì OP yêu cầu. :)
Jordan H

Tôi đã cố gắng sử dụng điều này trong một bối cảnh khác bằng cách tìm ra nó không tập trung vào FF nếu chiều cao của các phần tử cao hơn chiều cao cửa sổ (khung nhìn)
Philipp Werminghausen

Bởi vì thế giới đã chuyển sang, bây giờ tôi đi với câu trả lời sử dụng biến đổi. (Tôi đã đưa ra nhận xét này trước đây, tham khảo tên mà người trả lời đã sử dụng - nhưng họ đã thay đổi tên đó để nhận xét của tôi không còn ý nghĩa nữa và tôi đã xóa nó - chỉ cần tìm kiếm trên trang này để chuyển đổi.)
Nick Rice

6

Có thể trung tâm khủng khiếp div theo cách này:

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;
}

Sử dụng theo cách này, bạn sẽ luôn đặt khối bên trong của mình làm trung tâm, ngoài ra, nó có thể dễ dàng chuyển thành phản hồi thực (trong ví dụ này sẽ chỉ là chất lỏng trên màn hình nhỏ hơn), do đó không có giới hạn như trong ví dụ câu hỏi và trong câu trả lời được chọn .


5

... hoặc bạn có thể gói bạn div menu khác:

    <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

Đây là một giải pháp hai div. Đã cố gắng để giữ cho nó súc tích và không bị mã hóa cứng. Đầu tiên, html mong đợi:

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

Nguyên tắc đằng sau css sau là định vị một số phía của "bên ngoài", sau đó sử dụng thực tế là nó giả định kích thước của "bên trong" để thay đổi tương đối phía sau.

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

Cách tiếp cận này tương tự như Quentin, nhưng bên trong có thể có kích thước thay đổi.


-1

Đây là một giải pháp flexbox khi sử dụng div trình bao bọc toàn màn hình. trung tâm nội dung biện minh đó là div con theo chiều ngang và căn chỉnh các mục trung tâm theo chiều dọc.

<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
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.