trung tâm sắp xếp một vị trí cố định div


126

Tôi đang cố gắng để có một div có position:fixedtrung tâm được căn chỉnh trên trang của tôi.

Tôi luôn có thể làm điều đó với các div có vị trí tuyệt đối bằng cách sử dụng "hack" này

left: 50%; width: 400px; margin-left:-200px

... Trong đó giá trị cho lề trái là một nửa chiều rộng của div.

Điều này dường như không hoạt động đối với các div vị trí cố định, thay vào đó, nó chỉ đặt chúng với góc ngoài cùng bên trái của chúng ở mức 50% và bỏ qua khai báo bên trái.

Bất kỳ ý tưởng về cách khắc phục điều này để tôi có thể căn giữa các yếu tố định vị cố định?

Và tôi sẽ gửi phần thưởng M & M nếu bạn có thể cho tôi biết một cách tốt hơn để căn giữa các yếu tố được định vị tuyệt đối so với cách tôi đã nêu ở trên.


Làm việc cho tôi. Trong tất cả trừ IE6 (rõ ràng).
bobince

@Kyle nếu bạn có thể chọn một câu trả lời, nó sẽ giúp người dùng khác xác định giải pháp cho vấn đề của bạn.
andreihondrari

Câu trả lời:


199

Câu trả lời của Koen không chính xác tập trung vào yếu tố.

Cách thích hợp là sử dụng CCS3 transformtài sản. Mặc dù nó không được hỗ trợ trong một số trình duyệt cũ . Và chúng ta thậm chí không cần thiết lập một cố định hoặc tương đối width.

.centered {
    position: fixed;
    left: 50%;
    transform: translate(-50%, 0);
}

Làm việc so sánh jsfiddle ở đây .


1
đó là hoàn hảo. Tôi đã sử dụng ứng dụng này cho một ứng dụng cordova và dự kiến ​​nó sẽ chạy trong các trình duyệt được cập nhật lớn :)
saurabh

2
Rất đơn giản nhưng hoàn toàn hữu ích. Cảm ơn bạn.
Gilberto Sánchez

Ồ cảm ơn nhé! Tôi đã cố gắng tập trung văn bản giữa hai div không đồng đều và đây là cách duy nhất hoạt động mà không phá hủy đánh dấu!
Andrey Kaipov 20/03/2016

4
Câu trả lời thực tế +1
sn3ll

3
@Alex left: 50%di chuyển div đến 50% của trang. Nhưng bạn phải nhớ rằng nó di chuyển nó bắt đầu từ phía bên trái của div, do đó div chưa được căn giữa. translate(-50%, 0)về cơ bản translateX(-50%)là xem xét chiều rộng hiện tại của div và di chuyển nó bằng -50% chiều rộng của nó sang bên trái từ vị trí thực tế.
emil.c

168

Đối với những người có cùng vấn đề này, nhưng với thiết kế đáp ứng, bạn cũng có thể sử dụng:

width: 75%;
position: fixed;
left: 50%;
margin-left: -37.5%;

Làm điều này sẽ luôn giữ cố định của bạn divtập trung vào màn hình, ngay cả với một thiết kế đáp ứng.


2
Điều này đã giúp tôi ra ngoài với một dự án RWD :)
tctc91

6
37,5% này lấy từ đâu?
aurora

7
@aurora - đó là -1/2 của cài đặt vị trí (vì vậy -(75/2)trong trường hợp này)
Inaimathi

1
Tại sao đây không phải là câu trả lời được chấp nhận là một bí ẩn, nó chỉ hoạt động (tm)
CGK

2
Cropis có một giải pháp tốt hơn
Arnaldo Capo

44

Bạn cũng có thể sử dụng flexbox cho việc này.

.wrapper {
  position: fixed;
  top: 0;
  left: 0;
  height: 100%;
  width: 100%;
  
  /* this is what centers your element in the fixed wrapper*/
  display: flex;
  flex-flow: column nowrap;
  justify-content: center; /* aligns on vertical for column */
  align-items: center; /* aligns on horizontal for column */
  
  /* just for styling to see the limits */
  border: 2px dashed red;
  box-sizing: border-box;
}

.element {
  width: 200px;
  height: 80px;

  /* Just for styling */
  background-color: lightyellow;
  border: 2px dashed purple;
}
<div class="wrapper"> <!-- Fixed element that spans the viewport -->
  <div class="element">Your element</div> <!-- your actual centered element -->
</div>


12
Tại sao phải đề cập đến trung tâm và align = "centre"? text-align: centre is the way
wlf

1
Bạn nên bao gồm kiểu căn chỉnh văn bản vào ví dụ của bạn.
Manatax

Cảm ơn bạn rất nhiều! Điều này thực sự giúp tôi!
Joan.bdm

Tôi đã thay đổi câu trả lời của mình bằng cách loại bỏ đề cập <center>bị từ chối và bằng cách sử dụng một kỹ thuật hiện đại như display: flexvà một số thuộc tính liên quan.
andreihondrari

33

Từ bài viết trên, tôi nghĩ cách tốt nhất là

  1. Có một div cố định với width: 100%
  2. Bên trong div, tạo một div tĩnh mới với margin-left: automargin-right: auto, hoặc cho bảng tạo ra nó align="center".
  3. Tadaaaah, bạn đã tập trung vào div cố định của bạn bây giờ

Hy vọng điều này sẽ giúp.


2
+1 rất hữu ích nếu bạn cần căn giữa một div với chiều rộng cố định. Ví dụ: 990px.
dcernahoschi

Đây cũng là cách duy nhất tôi biết để cho phép max-widths cho các phần tử vị trí cố định. Bạn muốn một thanh bên cố định đáp ứng 30% max-width: 1200pxtrang web của bạn ? Điều này sẽ đưa bạn đến đó.
Michael - Clay Shirky ở đâu

7

Các div bình thường nên sử dụng margin-left: automargin-right: auto, nhưng điều đó không hiệu quả với các div cố định. Cách giải quyết tương tự như câu trả lời của Andrew , nhưng không sử dụng <center>điều không được chấp nhận . Về cơ bản, chỉ cần cung cấp cho div cố định một gói.

#wrapper {
    width: 100%;
    position: fixed;
    background: gray;
}
#fixed_div {
    margin-left: auto;
    margin-right: auto;
    position: relative;
    width: 100px;
    height: 30px;
    text-align: center;
    background: lightgreen;
}
<div id="wrapper">
    <div id="fixed_div"></div>
</div

Điều này sẽ tập trung vào một div cố định trong một div trong khi cho phép div phản ứng với trình duyệt. tức là div sẽ được căn giữa nếu có đủ dung lượng, nhưng sẽ va chạm với cạnh của trình duyệt nếu không có; tương tự như cách một div trung tâm thông thường phản ứng.


4

Nếu bạn muốn căn giữa một vị trí cố định div cả theo chiều dọc và chiều ngang, hãy sử dụng cái này

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

3

Nếu bạn biết chiều rộng là 400px thì đây sẽ là cách dễ nhất để làm điều đó tôi đoán.

 left: calc(50% - 200px);

3
<div class="container-div">
  <div class="center-div">

  </div>
</div>

.container-div {position:fixed; left: 0; bottom: 0; width: 100%; margin: 0;}
.center-div {width: 200px; margin: 0 auto;}

Điều này nên làm như vậy.


2

Điều này hoạt động nếu bạn muốn phần tử trải dài trên trang như một thanh điều hướng khác.

chiều rộng: calc (chiều rộng: 100% - chiều rộng bất cứ điều gì khác nằm ngoài trung tâm của nó)

Ví dụ: nếu thanh điều hướng bên của bạn là 200px:

chiều rộng: calc (100% - 200px);


1

Nó khá dễ dàng sử dụng chiều rộng: 70%; trái: 15%;

Đặt chiều rộng phần tử thành 70% của cửa sổ và để lại 15% cho cả hai bên


1

Tôi đã sử dụng như sau với Twitter Bootstrap (v3)

<footer id="colophon" style="position: fixed; bottom: 0px; width: 100%;">
    <div class="container">
        <p>Stuff - rows - cols etc</p>
    </div>
</footer>

Tức là tạo một phần tử chiều rộng đầy đủ ở vị trí cố định và chỉ cần đẩy một container trong đó, container được căn giữa so với chiều rộng đầy đủ. Nên cư xử cũng ok đáp ứng.


0

Một giải pháp sử dụng hộp flex; đáp ứng đầy đủ:

parent_div {
    position: fixed;
    width: 100%;
    display: flex;
    justify-content: center;
}

child_div {
    /* whatever you want */
}

-1

nếu bạn không muốn sử dụng phương thức trình bao bọc. sau đó bạn có thể làm điều này:

.fixed_center_div {
  position: fixed;
  width: 200px;
  height: 200px;
  left: 50%;
  top: 50%;
  margin-left: -100px; /* 50% of width */
  margin-top: -100px; /* 50% of height */
}
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.