Trung tâm CSS hiển thị khối nội tuyến?


207

Tôi có một mã làm việc ở đây: http://jsfiddle.net/WVm5d/ (bạn có thể cần phải làm cho cửa sổ kết quả lớn hơn để xem hiệu ứng trung tâm căn chỉnh)

Câu hỏi

Mã này hoạt động tốt nhưng tôi không muốn có display: table;. Đó là cách duy nhất tôi có thể làm cho trung tâm sắp xếp lớp bọc. Tôi nghĩ sẽ tốt hơn nếu có cách sử dụng display: block;hay display: inline-block;. Có thể giải quyết trung tâm align một cách khác?

Thêm một cố định với container không phải là một lựa chọn cho tôi.

Tôi cũng sẽ dán mã của mình vào đây nếu liên kết JS Fiddle bị hỏng trong tương lai:

body {
    background: #bbb;
}

.wrap {
    background: #aaa;
    margin: 0 auto;
    display: table;
    overflow: hidden;
}

.sidebar {
    width: 200px;
    float: left;
    background: #eee;
}

.container {
    margin: 0 auto;
    background: #ddd;
    display: block;
    float: left;
    padding: 5px;
}

.box {
    background: #eee;
    border: 1px solid #ccc;
    padding: 10px;
    margin: 5px;
    float: left;
}

.box:nth-child(3n+1) {
    clear: left;
}
<div class="wrap">
    <div class="sidebar">
        Sidebar
    </div>
    <div class="container">
        <div class="box">
            Height1
        </div>
        <div class="box">
            Height2<br />
            Height2
        </div>
        <div class="box">
            Height3<br />
            Height3<br />
            Height3
        </div>
        <div class="box">
            Height1
        </div>
        <div class="box">
            Height2<br />
            Height2
        </div>
        <div class="box">
            Height3<br />
            Height3<br />
            Height3
        </div>
    </div>
    <div class="sidebar">
        Sidebar
    </div>
</div>

Câu trả lời:


79

Giải pháp được chấp nhận sẽ không hiệu quả với tôi vì tôi cần một phần tử con display: inline-blockcó cả chiều ngang và chiều dọc trong phạm vi cha mẹ 100% chiều rộng.

Tôi đã sử dụng các thuộc tính justify-contentvà hộp của Flexbox align-items, tương ứng cho phép bạn căn giữa các phần tử theo chiều ngang và chiều dọc. Bằng cách đặt cả hai centerlên cha, phần tử con (hoặc thậm chí nhiều phần tử!) Sẽ hoàn toàn ở giữa.

Giải pháp này không yêu cầu chiều rộng cố định, điều này sẽ không phù hợp với tôi vì văn bản của nút của tôi sẽ thay đổi.

Dưới đây là bản demo CodePen và một đoạn mã liên quan dưới đây:

.parent {
  display: flex;
  justify-content: center;
  align-items: center;
}

.child {
  display: inline-block;
}
<div class="parent">
  <a class="child" href="#0">Button</a>
</div>


1
Câu hỏi này đã được tạo ra trước Flexbox nhưng bây giờ cách tiếp cận này tốt hơn, vì vậy tôi đã chấp nhận nó như là câu trả lời.
Jens Törnell 19/03/18

@ JensTellell việc sử dụng khối nội tuyến là vô ích trong trường hợp này có thể được gỡ bỏ
Temani Afif

Điều này tốt hơn nhiều so với việc sử dụng trung tâm căn chỉnh văn bản. Việc thực hiện đó chỉ rò rỉ định tâm văn bản cho tất cả các thành phần con. Đừng làm điều đó.
Truy tìm

265

Thử cái này. Tôi đã thêm text-align: centervào cơ thể và display:inline-blockđể bọc, và sau đó loại bỏ của bạndisplay: table

body {
    background: #bbb;
    text-align: center;
}

.wrap {
    background: #aaa;
    margin: 0 auto;
    display: inline-block;
    overflow: hidden;
}

27
@zack div hoạt động như văn bản khi được hiển thị dưới dạng khối nội tuyến. Bạn có thể sử dụng những thứ như white-space: nowrap;trên chúng quá.
dùng2

5
và điều gì xảy ra nếu tôi không muốn TẤT CẢ các yếu tố của mình được đặt ở vị trí bodytrung tâm liên kết văn bản ?? điều này nghe có vẻ như quá mức cần thiết đối với tôi
phil294

4
@Blauhirn, chỉ cần tạo một phần tử khối bao quanh phần tử khối nội tuyến và sau đó đặt thuộc tính css text-align: centre; anh ta dùng thẻ body làm ví dụ.
Arsalan Sheikh

71

Nếu bạn có một <div>với text-align:center;, thì bất kỳ văn bản nào bên trong nó sẽ được căn giữa đối với chiều rộng của phần tử container đó. inline-blockcác yếu tố được coi là văn bản cho mục đích này, vì vậy chúng cũng sẽ được tập trung.


2
Làm thế nào về hiển thị: các yếu tố nội tuyến? Tôi đã thử nghiệm nó không hoạt động theo cách tôi mong đợi
tắc kè

11

Bạn cũng có thể làm điều này với định vị, đặt div cha thành tương đối và div con thành tuyệt đối.

.wrapper {
      position: relative;
  }
.childDiv {
      position: absolute;
      left: 50%;
      transform: translateX(-50%);
  }

1

Bạn không cần sử dụng "display: table". Lý do lề của bạn: 0 nỗ lực định tâm tự động không hoạt động là do bạn không chỉ định chiều rộng.

Điều này sẽ làm việc tốt:

.wrap {
    background: #aaa;
    margin: 0 auto;
    width: some width in pixels since it's the container;
}

Bạn không cần chỉ định display: block vì div sẽ được chặn theo mặc định. Bạn cũng có thể mất tràn: ẩn.


1

Tương tự như câu trả lời của @ vijayscode, điều này sẽ tập trung theo chiều ngang một phần tử khối nội tuyến (nhưng không cần phải sửa đổi kiểu của cha mẹ):

  display: inline-block;
  position: relative;
  left: 50%; // Move the element to the left by 50% of the container's width
  transform: translateX(-50%); // Calculates 50% of the element's width and moves it by that amount across the X-axis to the left


-6

Bài viết tuyệt vời tôi tìm thấy những gì làm việc tốt nhất cho tôi là thêm% vào kích thước

.wrap {
margin-top:5%;
margin-bottom:5%;
height:100%;
display:block;}

-9

Chỉ dùng:

line-height:50px

Thay thế "50px" bằng cùng chiều cao với div của bạn.


1
Xin hãy cụ thể hơn ở nơi để thêm line-height.
Marcel Gwerder

Câu hỏi ban đầu là về định tâm ngang, như được chỉ ra bởi việc sử dụng text-align: center;. Điều chỉnh chiều cao đường thẳng là một giải pháp cho định tâm dọc, mặc dù không phải là giải pháp rất mạnh mẽ cho khối nội tuyến.
cdaddr
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.