Làm cách nào để căn giữa div theo chiều dọc bên trong div div được định vị tuyệt đối


146

Tôi đang cố gắng để có được container màu xanh ở giữa màu hồng, tuy nhiên dường như vertical-align: middle;không thực hiện được công việc trong trường hợp đó.

<div style="display: block; position: absolute; left: 50px; top: 50px;">
    <div style="text-align: left; position: absolute;height: 56px;vertical-align: middle;background-color: pink;">
        <div style="background-color: lightblue;">test</div>
    </div>
</div>

Kết quả:

nhập mô tả hình ảnh ở đây

Sự mong đợi:

nhập mô tả hình ảnh ở đây

Xin đề nghị làm thế nào tôi có thể đạt được điều đó.

Jsfiddle


1
Có một lý do tại sao bạn sử dụng position: absoluteở khắp mọi nơi?
Vucko

các vertical-align: middle;công trình với display: inline-blockhoặc bố trí bảng
ctf0

kiểm tra liên kết này: vanseodesign.com/css/vertical-centering ;)
Jordi Castilla

@Vucko có - đó là điều kiện tiên quyết vì đây chỉ là phiên bản đơn giản hóa của bố cục rất phức tạp, nhưng vị trí tuyệt đối trong cả hai div hàng đầu là điều quan trọng.
Vladimir

@Vladimirs tôi chỉ có thể nghĩ đến margin-top: calc((56px - 16px) / 2), nơi 56px - parent height, 16px - element height/font-size- JSFiddle
Vucko

Câu trả lời:


331

Trước hết lưu ý rằng vertical-alignchỉ áp dụng cho các ô của bảng và các phần tử mức nội tuyến.

Có một số cách để đạt được sự sắp xếp theo chiều dọc mà có thể hoặc không thể đáp ứng nhu cầu của bạn. Tuy nhiên tôi sẽ chỉ cho bạn hai phương pháp từ mục yêu thích của tôi:

1. Sử dụng transformtop

.valign {
    position: relative;
    top: 50%;
    transform: translateY(-50%);
    /* vendor prefixes omitted due to brevity */
}
<div style="position: absolute; left: 50px; top: 50px;">
    <div style="text-align: left; position: absolute;height: 56px;background-color: pink;">
        <div class="valign" style="background-color: lightblue;">test</div>
    </div>
</div>

Điểm mấu chốt là giá trị phần trăm trên topcó liên quan đến heightkhối chứa; Trong khi giá trị phần trăm trên transforms tương đối với kích thước của chính hộp (hộp giới hạn).

Nếu bạn gặp vấn đề kết xuất phông chữ (phông chữ mờ), cách khắc phục là thêm perspective(1px)vào transformkhai báo để nó trở thành:

transform: perspective(1px) translateY(-50%);

Điều đáng chú ý là CSS transform được hỗ trợ trong IE9 + .

2. Sử dụng inline-blockcác yếu tố (giả)

Trong phương pháp này, chúng ta có hai inline-blockphần tử anh chị em được sắp xếp theo chiều dọc ở giữa bằng cách vertical-align: middlekhai báo.

Một trong số chúng có một heighttrong 100%những cha mẹ của nó và cái còn lại là yếu tố mong muốn của chúng tôi mà chúng tôi muốn sắp xếp nó ở giữa.

.parent {
    text-align: left;
    position: absolute;
    height: 56px;
    background-color: pink;
    white-space: nowrap;
    font-size: 0; /* remove the gap between inline level elements */
}

.dummy-child { height: 100%; }

.valign {
    font-size: 16px; /* re-set the font-size */
}

.dummy-child, .valign {
    display: inline-block;
    vertical-align: middle;
}
<div style="position: absolute; left: 50px; top: 50px;">
    <div class="parent">
        <div class="dummy-child"></div>
        <div class="valign" style="background-color: lightblue;">test</div>
    </div>
</div>

Cuối cùng, chúng ta nên sử dụng một trong các phương thức có sẵn để loại bỏ khoảng cách giữa các yếu tố cấp độ nội tuyến .


Cảm ơn lời khuyên hữu ích này. Nó đã làm việc cho dự án của tôi. Công việc tốt
Sedat Kumcu

Đối với valignphần tử phương thức đầu tiên phải làdisplay: block
Oleg

transform: translateY(-50%);Chưa bao giờ thấy điều này trước đây, nhưng nó hoạt động hoàn hảo. Cứu người thật.
Benny Bottema

55

dùng cái này :

.Absolute-Center {
    margin: auto;
    position: absolute;
    top: 0; left: 0; bottom: 0; right: 0;
}

tham khảo liên kết này: https://www.smashingmagazine.com/2013/08/absolute-horizontal-vertical-centering-css/


Làm thế nào đây không phải là giải pháp chính? Thật dễ dàng và nó hoạt động!
Mason

21
Hãy nhớ rằng heighttài sản phải được xác định (theo px, em, v.v.) để làm việc này.
Vaidas

Nếu tôi có nhiều div bên trong cha mẹ thì sao? tất cả sẽ không được đặt lên nhau?
psykid

nó không hoạt động nếu có thêm một đứa trẻ ở cùng cấp độ với "trung tâm tuyệt đối"
Pascut

18

Sử dụng flex blox trong div vị trí vô tư của bạn để tập trung vào nội dung của nó.

Xem ví dụ https://plnkr.co/edit/wJIX2NpbNhO34X68ZyoY?p=preview

.some-absolute-div {    
  display: -webkit-box;
  display: -webkit-flex;
  display: -moz-box;
  display: -moz-flex;
  display: -ms-flexbox;
  display: flex;

  -webkit-box-pack: center;
  -ms-flex-pack: center;
  -webkit-justify-content: center;
  -moz-justify-content: center;
  justify-content: center;

  -webkit-box-align: center;
  -ms-flex-align: center;
  -webkit-align-items: center;
  -moz-align-items: center;
  align-items: center;
}

11

Trung tâm theo chiều dọc và chiều ngang:

.parent{
  height: 100%;
  position: absolute;
  width: 100%;
  top: 0;
  left: 0;
}
.c{
  position: absolute;
  top: 50%;
  left: 0;
  right: 0;
  transform: translateY(-50%);
}

3

Bạn có thể sử dụng display:table/table-cell;

.a{
   position: absolute; 
  left: 50px; 
  top: 50px;
  display:table;
}
.b{
  text-align: left; 
  display:table-cell;
  height: 56px;
  vertical-align: middle;
  background-color: pink;
}
.c {
  background-color: lightblue;
}
<div class="a">
  <div  class="b">
    <div class="c" >test</div>
  </div>
</div>


Cảm ơn, ví dụ của bạn hoạt động hoàn hảo, tuy nhiên .bthiếu position: absolute;, điều quan trọng là có được những thứ khác được hiển thị thuộc tính mà tôi không bao gồm để giữ mã rõ ràng hơn. Tôi biết điều đó không có nghĩa là có vị trí ô bảng tuyệt đối nhưng có thể có một cách tiếp cận khác sẽ cho phép giữ lại position: absolute;trong cả hai .a.bcác lớp?
Vladimir

nếu a là vị trí tuyệt đối và b (đứa trẻ) cho nó kích thước của nó, b tự nó ở vị trí tuyệt đối đối với phần còn lại của nội dung. trừ khi a được cho là vẫn chưa được thống nhất tôi không hiểu mục đích tuyệt đối bên trong tuyệt đối?
G-Cyrillus

1

Đây là cách đơn giản bằng cách sử dụng đối tượng Top.

ví dụ: Nếu kích thước phần tử tuyệt đối là 60px.

.absolute-element { 
    position:absolute; 
    height:60px; 
    top: calc(50% - 60px);
}

2
Sử dụng calclà hữu ích, mặc dù điều này nên được top: calc(50% - 30px)thực sự tập trung.
túi não

1

Một giải pháp đơn giản bổ sung

HTML:

<div id="d1">
    <div id="d2">
        Text
    </div>
</div>

CSS:

#d1{
    position:absolute;
    top:100px;left:100px;
}

#d2{
    border:1px solid black;
    height:50px; width:50px;
    display:table-cell;
    vertical-align:middle;
    text-align:center;  
}

0

Vui lòng kiểm tra câu trả lời này cho một vấn đề tương tự.

Đây là cách dễ nhất mà tôi đã tìm thấy.

https://stackoverflow.com/a/26079837/4593442

GHI CHÚ. Tôi đã sử dụng màn hình: -webkit-flex; thay vì hiển thị: flex; để thử nghiệm bên trong safari.

BÓNG ĐÁ. Tôi chỉ là người mới, chia sẻ sự giúp đỡ từ một người có kinh nghiệm rõ ràng.


0

Bạn có thể làm điều đó bằng cách sử dụng display:table;trong div cha và display: table-cell; vertical-align: middle;div con

<div style="display:table;">
      <div style="text-align: left;  height: 56px;  background-color: pink; display: table-cell; vertical-align: middle;">
          <div style="background-color: lightblue; ">test</div>
      </div>
  </div>


3
có thể câu trả lời của bạn là tốt nhưng bạn có thể cải thiện nó rất nhiều bằng cách thêm một số mô tả về mã của bạn làm gì ...
DaFois
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.