Div cố định ở giữa với chiều rộng động (CSS)


88

Tôi có một div sẽ có CSS ​​này:

#some_kind_of_popup
{
    position: fixed;
    top: 100px;
    min-height: 300px;
    width: 90%;
    max-width: 900px;
}

Bây giờ, làm thế nào tôi có thể đặt div này ở giữa? Tôi có thể sử dụng margin-left: -450px; left: 50%;nhưng điều này sẽ chỉ hoạt động khi màn hình> 900 pixel. Sau đó (khi cửa sổ <900 pixel), nó sẽ không được căn giữa nữa.

Tất nhiên tôi có thể làm điều này với một số loại js, nhưng có cách nào "đúng hơn" khi làm điều này với CSS không?


4
@Liam - Tôi không đồng ý, tôi nghĩ câu hỏi này là hoàn toàn riêng của nó. Những câu hỏi đó không trả lời câu hỏi này liên quan đến việc có một div không có chiều rộng cố định ở giữa.
Joshua M

Những gì Joshua đã nói, đó là để căn giữa một div trong một div khác.
gubbfett

7
@Liam - Hơn nữa, bạn không thể sử dụng a margin: 0 autotrên position: fixeddiv. Bạn thậm chí đã đọc câu hỏi?
Joshua M

^ nope. tôi cũng đã thử điều đó. : p
gubbfett

3
@JoshuaM Khẳng định của bạn không đúng 100%. Hãy xem câu trả lời của tôi.
laconbass

Câu trả lời:


221

Bạn có thể căn giữa một fixedhoặc absolutecài đặt phần tử được định vị rightleftđến 0, sau đó margin-left& margin-rightđến autonhư thể bạn đang căn giữa một staticphần tử được định vị.

#example {
    position: fixed;
    /* center the element */
    right: 0;
    left: 0;
    margin-right: auto;
    margin-left: auto;
    /* give it dimensions */
    min-height: 10em;
    width: 90%;
}

Xem ví dụ này hoạt động trên trò chơi này .


1
Chỉ cần đề cập đến ... Nó không phải là bất ngờ, nhưng nó không thành công trong IE7. Nó được định vị 0px từ bên trái ở đây. Nó không bao giờ hoàn hảo làm việc trong IE 8.
gubbfett

Điều này không hoạt động khi chiều rộng của phần tử lớn hơn chiều rộng của màn hình .. sẽ rất tuyệt nếu nó hoạt động trong tình huống đó.
andrewb

1
@andrewb, bạn có thể áp dụng một biên độ âm như nhau cả trên rightleftít nhất là a value >= witdth / 2, như đã thấy trên jsfiddle.net/PvfFy/168 , nhưng không phải là một cách tiếp cận thanh lịch IMHO. Tôi đã thử nghiệm nó trên chrome cho vui, tôi không biết nếu nó sẽ làm việc trên phần còn lại
laconbass

5
Bên ngoài phạm vi câu hỏi, điều này phụ thuộc vào việc đặt chiều rộng của phần tử, vì vậy sẽ không tốt nếu bạn có nội dung động có chiều rộng thay đổi hoặc không xác định. Bỏ căn giữa sang một bên, tôi thường làm điều đó với màn hình: khối nội tuyến và không có chiều rộng đặt. Có ai có một giải pháp không-js cho trường hợp đó?
enigment

4
Câu hỏi nói chiều rộng động , đó là toàn bộ vấn đề, bạn không thể bỏ qua điều đó.
Gil Epshtain

54

Đây là một phương pháp khác nếu bạn có thể sử dụng thuộc tính CSS3 một cách an toàn transform:

.fixed-horizontal-center
{
    position: fixed;
    top: 100px; /* or whatever top you need */
    left: 50%;
    width: auto;
    -webkit-transform: translateX(-50%);
    -moz-transform: translateX(-50%);
    -ms-transform: translateX(-50%);
    -o-transform: translateX(-50%);
    transform: translateX(-50%);
}

... hoặc nếu bạn muốn căn giữa theo chiều ngang VÀ chiều dọc:

.fixed-center
{
    position: fixed;
    top: 50%;
    left: 50%;
    width: auto;
    height: auto;
    -webkit-transform: translate(-50%,-50%);
    -moz-transform: translate(-50%,-50%);
    -ms-transform: translate(-50%,-50%);
    -o-transform: translate(-50%,-50%);
    transform: translate(-50%,-50%);
}

5
Miễn là nó dành cho một trình duyệt hiện đại, thì đây là giải pháp TỐT NHẤT cho câu trả lời này! Là người duy nhất đó là giống như một sự thật 'float: trung tâm, trong đó bạn có thể nhấp vào xung quanh yếu tố đóng gói và không bị mắc kẹt phải cách cá xung quanh nó. Thích câu trả lời này!
SpYk3HH

1
Cẩn thận, không sử dụng tính năng dịch theo tỷ lệ phần trăm sang giữa văn bản vì nó sẽ được làm mịn nếu giá trị kết quả là số nổi. Ho boy, bạn không muốn điều đó, không bạn không.
gnou

Việc sử dụng các biến đổi CSS có thể khiến quá trình làm mịn diễn ra trên nhiều văn bản; Tôi nhận được các đường viền vui nhộn là kết quả của quá trình chuyển đổi.
Nathan K

1
Có khả năng bị co lại sớm khi thay đổi kích thước màn hình (tùy thuộc vào kích thước của bộ phận), dẫn đến học sinh lớn xung quanh mép của bộ phận.
Thực thể độc thân

7
<div id="container">
    <div id="some_kind_of_popup">
        center me
    </div>
</div>

Bạn cần phải bọc nó trong một hộp đựng. đây là css

#container{
    position: fixed;
    top: 100px;
    width: 100%;
    text-align: center;
}
#some_kind_of_popup{
    display:inline-block;
    width: 90%;
    max-width: 900px;  
    min-height: 300px;  
}

Ah, tôi thích suy nghĩ của bạn. Div cố định sẽ chỉ là vùng chứa cho div khác với kết quả thực tế? Tôi sẽ thử cái này!
gubbfett

Mặc dù tôi thích tính trực quan của câu trả lời của bạn, tôi không thấy nó sẽ cho phép hỗ trợ ie6 / 7 như thế nào.
Mathew Berg

1
@MathewBerg, điểm tốt về ie6/7. Trong trường hợp đó, câu trả lời của bạn sẽ hiệu quả nhất. Đây là một chút cố gắng, nhưng cá nhân tôi nghĩ rằng các nhà phát triển không nên dành thời gian sửa chữa các thứ cho <= ie7. Tôi nghĩ rằng thực sự các nhà phát triển nên chặn các trình duyệt đó để buộc mọi người và các công ty có hệ thống cũ nâng cấp. Bán ý tưởng đó cho một khách hàng trả tiền thật khó biết bao! ;)
gubbfett

Có, nhưng không may là một số công ty yêu cầu hỗ trợ cho các trình duyệt cũ cho dù chúng tôi nhận được bao xa trong tương lai. Hãy tiếp tục và chấp nhận câu trả lời của tôi hoặc laconbass 'tùy thuộc vào nhu cầu của bạn.
Mathew Berg

1
điều này cũng không làm việc như bạn vẫn không thể nhấp qua "container"
SpYk3HH

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.