Trung tâm một DIV không đồng đều sử dụng CSS


23

Tôi đang định tâm một DIV bên trong một DIV khác bằng flexbox. Hãy nghĩ về một cửa sổ hộp thoại bật lên ở giữa màn hình khi cần thiết.

Nó hoạt động tốt, tuy nhiên nó sẽ trông tốt hơn nhiều nếu không gian bên trên và bên dưới hộp thoại không chính xác bằng nhau, có 40% không gian còn lại ở trên và 60% bên dưới hộp thoại. Nó trở nên khó khăn vì chiều cao hộp thoại thay đổi theo số lượng văn bản bên trong.

Vì vậy, ví dụ, nếu chiều cao trình duyệt là 1000 px và chiều cao cửa sổ hộp thoại là 400 px, tôi muốn không gian dọc còn lại (600 px) ở trên 240 px và 360 px bên dưới hộp thoại. Tôi có thể làm điều đó với Javascript, nhưng tôi tò mò liệu có cách nào thông minh với CSS không. Tôi đã thử thêm một lề dưới vào #dialogBox DIV, nhưng nó không hoạt động khi chiều cao hộp thoại đang ở gần độ cao của trình duyệt.

#dialogBoxPanel
  {
  position:absolute;
  display:flex;
  align-items:center;
  justify-content:center;
  left:0px;
  top:0px;
  width:100%;
  height:100%;
}
#dialogBox
  {
  width:350px;
}
<div id="dialogBoxPanel">
  <div id="dialogBox">Text</div>
</div>


Bạn có cần bảng điều khiển bên ngoài để bao quát toàn bộ khung nhìn? Nếu không, tôi sẽ đi với giải pháp từ css-tricks.com/centering-css-complete-guide , phần "Cả hai chiều dọc và chiều dọc / Là yếu tố có chiều rộng và chiều cao không xác định?", Và sửa đổi giá trị phần trăm dịch. (Và ngay cả khi bạn cần kích thước khung nhìn đầy đủ của phụ huynh [phông nền?], Bạn sẽ có thể kết hợp cả hai - tránh xa các công cụ flex, nghỉ ngơi.)
04FS 24/11/19

Phải, tôi có một hiệu ứng mờ ở bảng điều khiển bên ngoài vì vậy nó cần phải bao phủ toàn bộ khung nhìn. Nhưng tôi có thể thêm một DIV khác bên trong nó, và giải pháp của bạn sẽ hoạt động tốt. Cảm ơn 04FS!
Bjorn Morén

Để cho chính xác, bạn đang nói về căn chỉnh dọc, không phải định tâm.
Michael Benjamin

Câu trả lời:


11

Sử dụng phần tử giả và hướng cột để mô phỏng khoảng trắng. Đơn giản chỉ cần điều chỉnh flex-growphần tử giả để kiểm soát lượng không gian trống mà mỗi người nên sử dụng. Tăng trưởng flex bằng nhau sẽ cho không gian bằng nhau:

Bạn cũng có thể sử dụng 23. Chúng ta chỉ cần giữ nguyên tỷ lệ:

Một ý tưởng khác là sử dụng giá trị hàng đầu bằng 40%và chỉnh sửa vị trí bằng dịch (cùng logic với 50%khi định tâm)

#dialogBoxPanel {
  position: absolute;;
  left: 0px;
  top: 0px;
  width: 100%;
  height: 100%;
  /* the center */
  background:linear-gradient(red,red) center/100% 1px no-repeat;
}

#dialogBox {
  position:relative;
  top:40%;
  width: 350px;
  transform:translateY(-40%);
  margin:auto;
  border:1px solid;
}
<div id="dialogBoxPanel">
  <div id="dialogBox">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc hendrerit diam eu nisl fringilla ornare. Pellentesque aliquam quam et tellus egestas sodales. Interdum et malesuada fames ac ante ipsum primis in faucibus. Proin bibendum,</div>
</div>


Cảm ơn rất nhiều Temani! Cả hai giải pháp đều hoạt động hoàn hảo và có vẻ giống hệt nhau ngoại trừ trường hợp đặc biệt trong đó hộp thoại cao hơn trình duyệt. Giải pháp đầu tiên giữ phần trên cùng của hộp thoại được căn chỉnh với phần trên của trình duyệt, cắt xén ở phía dưới. Các vụ thứ hai cả dưới cùng và trên cùng. Chỉ là vấn đề ưu tiên.
Bjorn Morén

5

Giải pháp này sử dụng display: grid, đây là một tính năng mới, vì vậy hãy chắc chắn kiểm tra hỗ trợ trình duyệtnhấp vào đây để tìm hiểu thêm.

Đây là dòng kiểm soát không gian trên cùng và dưới cùng:

grid-template-rows: 40fr [content-start] auto [content-end] 60fr;

Nội dung văn bản đoạn trích có thể được chỉnh sửa để bạn kiểm tra xem hộp có giữ chính giữa ngay cả khi chiều cao thay đổi hay không.

#dialogBoxPanel {
    display: grid;
    place-content: center;
    position: absolute;
    left: 0;
    top: 0;
    width: 100%;
    height: 100%;
    grid-template-rows: 40fr [content-start] auto [content-end] 60fr;
}
#dialogBox {
    border: 1px solid;
    width: 350px;
    grid-area: content;
}
<div id="dialogBoxPanel">
   <div id="dialogBox" contenteditable>Text</div>
</div>


1
Tôi sẽ xem xét việc sử dụng 4fr auto 6fr. Những gì bạn có hoạt động nhưng với một số tràn vì 40% + 60% + 1fr sẽ luôn lớn hơn 100% và bạn đang định tâm, do đó, phần thừa sẽ được chia đều từ trên xuống dưới: jsfiddle.net/cobutn0e/2 . Bạn cũng sẽ nhận thấy rằng nó không giống như 100% như mong đợi
Temani Afif

Tôi chỉ thay đổi 1fr thành tự động, tôi muốn để lại dưới dạng% để khớp với các giá trị câu hỏi. Cảm ơn rất nhiều vì đã chỉ ra lỗi!
rafaelcastrocouto

auto và 1fr sẽ cho kết quả tương tự trong trường hợp của bạn, vấn đề là việc sử dụng tỷ lệ phần trăm; 1fr=minmax(auto,1fr)và trong trường hợp của bạn, nó sẽ rơi xuống autovì không có không gian trống vì 40% + 60% = 100% (đó là lý do tại sao bạn sẽ luôn bị tràn)
Temani Afif

1
Đây là một câu đố khác để minh họa quan điểm của tôi: jsfiddle.net/cobutn0e/3 chú ý cách 3 người đầu tiên giống nhau, người thứ ba rơi xuống 0 và người cuối cùng là những gì tôi đề xuất
Temani Afif

Bây giờ tôi có được nó, có ý nghĩa. Gonna sử dụng 40fr và 60fr vì nó giống nhau vào cuối ngày. Cảm ơn một lần nữa vì đã dành thời gian của bạn để dạy tôi!
rafaelcastrocouto

4

Bạn có thể thêm div spacers và đặt flex-grow với tỷ lệ 4: 6.

#dialogBoxPanel {
  position: absolute;
  display: flex;
  flex-direction: column;
  align-items: center;

  left: 0px;
  top: 0px;
  width: 100%;
  height: 100%;
}

#dialogBox {
  width: 350px;
  border: 1px solid black;
}

.spacer-top{
  flex-grow: 4;
}
.spacer-bottom{
  flex-grow: 6;
<div id="dialogBoxPanel">
  <div class="spacer-top"></div>
  <div id="dialogBox">Text</div>
  <div class="spacer-bottom"></div>
</div>


Chỉ bây giờ mới thấy câu trả lời của @Temani Afif, nhưng nó hoạt động tương tự với "sau" và "trước"
Itay Gal

0

Cách đơn giản bằng cách sử dụng vị trí và lề, tôi giả định rằng chiều cao hộp thoại của bạn luôn bằng 40% chiều cao trình duyệt.

.modal{
            max-height:50%;
            width:400px;
            margin: 10% auto 5% auto;
            position:absolute;
            top:0;
            bottom:0;
            right:0;
            left:0;
            overflow-y: auto
        }
        .modal-body{
            background-color: beige;
            padding: 20px;
            line-height: 21px
        }

HTML

<div class="modal">
 <div class="modal-body">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea </div>
</div>

Xin chào, lần sau xin vui lòng đọc kỹ câu hỏi, nó ghi: "chiều cao hộp thoại thay đổi theo số lượng văn bản bên trong."
rafaelcastrocouto

1
@rafaelcastrocouto - bây giờ kiểm soát nó thông qua chiều cao tối đa theo tỷ lệ phần trăm, vì để nó không có chiều cao sẽ không giải quyết được mục đích câu hỏi của thẩm mỹ không gian trên và dưới.
Anshul Chaurasia
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.