căn dọc với Bootstrap 3


889

Tôi đang sử dụng Twitter Bootstrap 3 và tôi gặp vấn đề khi tôi muốn căn chỉnh theo chiều dọc hai div, ví dụ - liên kết JSFiddle :

<!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css">

<!-- Optional theme -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap-theme.min.css">

<!-- Latest compiled and minified JavaScript -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
<div class="row">
  <div class="col-xs-5">
    <div style="height:5em;border:1px solid #000">Big</div>
  </div>
  <div class="col-xs-5">
    <div style="height:3em;border:1px solid #F00">Small</div>
  </div>
</div>

Hệ thống lưới trong Bootstrap sử dụng float: left, không display:inline-block, vì vậy thuộc tính vertical-alignkhông hoạt động. Tôi đã thử sử dụng margin-topđể sửa nó, nhưng tôi nghĩ rằng đây không phải là một giải pháp tốt cho thiết kế đáp ứng.


1
không không, tôi muốn căn chỉnh theo chiều dọc 2 div, không có văn bản bên trong, đại loại như thế này jsfiddle.net/corinem/Aj9H9 nhưng trong ví dụ này tôi không sử dụng bootstrap
corinem 12/12/13


6
QUAN TRỌNG: Cả hai cột đều cần lớp "vcenter". Nếu không nó sẽ không hoạt động. Đã dành một giờ một giờ bây giờ chỉ cần tìm ra rằng.
Cymro

không ai trong số các câu trả lời hoạt động hoàn hảo trên chrome IE8 và di động đối với tôi với một hàng chứa 5 col- (và 3 col- trên thiết bị di động)
amdev

Trong Bootstrap 4, căn chỉnh trung tâm dọc rất khác nhau: stackoverflow.com/a/41464397/171456
Zim

Câu trả lời:


938

Câu trả lời này trình bày một bản hack, nhưng tôi thực sự khuyên bạn nên sử dụng flexbox (như đã nêu trong câu trả lời @Hasool ), vì nó hiện được hỗ trợ ở mọi nơi.

Liên kết trình diễn:
- Bootstrap 3
- Bootstrap 4 alpha 6

Bạn vẫn có thể sử dụng một lớp tùy chỉnh khi bạn cần:

.vcenter {
    display: inline-block;
    vertical-align: middle;
    float: none;
}
<div class="row">
    <div class="col-xs-5 col-md-3 col-lg-1 vcenter">
        <div style="height:10em;border:1px solid #000">Big</div>
    </div><!--
    --><div class="col-xs-5 col-md-7 col-lg-9 vcenter">
        <div style="height:3em;border:1px solid #F00">Small</div>
    </div>
</div>

Bootply

Sử dụng inline-blockthêm không gian bổ sung giữa các khối nếu bạn để một không gian thực trong mã của mình (như ...</div> </div>...). Không gian thêm này phá vỡ lưới của chúng tôi nếu kích thước cột thêm tối đa 12:

<div class="row">
    <div class="col-xs-6 col-md-4 col-lg-2 vcenter">
        <div style="height:10em;border:1px solid #000">Big</div>
    </div>
    <div class="col-xs-6 col-md-8 col-lg-10 vcenter">
        <div style="height:3em;border:1px solid #F00">Small</div>
    </div>
</div>

Tại đây, chúng tôi đã có thêm khoảng trắng giữa <div class="[...] col-lg-2"><div class="[...] col-lg-10">(trả lại vận chuyển và 2 tab / 8 khoảng trắng). Và vì thế...

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

Hãy đá thêm không gian này !!

<div class="row">
    <div class="col-xs-6 col-md-4 col-lg-2 vcenter">
        <div style="height:10em;border:1px solid #000">Big</div>
    </div><!--
    --><div class="col-xs-6 col-md-8 col-lg-10 vcenter">
        <div style="height:3em;border:1px solid #F00">Small</div>
    </div>
</div>

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

Để ý những bình luận dường như vô dụng <!-- ... -->? Chúng rất quan trọng - không có chúng, khoảng trắng giữa các <div>phần tử sẽ chiếm không gian trong bố cục, phá vỡ hệ thống lưới.

Lưu ý: Bootply đã được cập nhật


18
Điều này sẽ phá vỡ nếu bạn chỉ định các lưới cột có tối đa 12 (ví dụ: sử dụng col-lg-2col-lg-10). Thật thú vị, nếu bạn thêm mã JS sau (giả sử jQuery), nó sẽ tự sửa:$('.row').html($('.vcenter'));
Jake Z

8
@paseme Điều này được gây ra bởi inline-block không gian thêm (nổi tiếng) . Tôi đưa ra một giải pháp trong chỉnh sửa của tôi.
zessx

92
Phần với các bình luận trống rỗng cảm thấy như ma thuật sâu, tối, ác. Và nó là. Nhưng ai đó ở đâu đó đã quyết định nó nên hoạt động, vì vậy nó làm.
cfstras

5
Ngạc nhiên là chưa có ai đề cập đến vấn đề này, nhưng thay vì các công cụ bình luận, bạn có thể đặt "font-size: 0;" trên cha mẹ của divs khối nội tuyến để xóa "không gian bí ẩn"
Poff

4
Không cần sử dụng bất kỳ nhận xét html <! - -> hoặc bất kỳ mã javascript nào để khắc phục vấn đề không gian thêm, có một mẹo CSS đơn giản và hiệu quả: lề âm. Chỉ cần thêm lề phải: -4px; đến lớp .vcenter. Đã thử nghiệm và làm việc với tất cả các trình duyệt (ngoại trừ IE6 và IE7 cũ ... nhưng ai quan tâm đến thời tiền sử;))
Frank

897

Bố trí hộp linh hoạt

Với sự ra đời của Hộp linh hoạt CSS , nhiều cơn ác mộng 1 của các nhà thiết kế web đã được giải quyết. Một trong những hacky nhất, liên kết dọc. Bây giờ nó có thể ngay cả ở độ cao chưa biết .

"Hai thập kỷ hack bố trí sắp kết thúc. Có thể không phải ngày mai, mà là sớm, và cho đến hết cuộc đời."

- Huyền thoại CSS Eric Meyer tại W3Conf 2013

Hộp linh hoạt (hay nói ngắn gọn là Flexbox), là một hệ thống bố cục mới được thiết kế riêng cho mục đích bố trí. Các đặc điểm kỹ thuật nêu :

Bố cục Flex tương tự bề ngoài với bố cục khối. Nó thiếu nhiều thuộc tính văn bản hoặc tài liệu trung tâm phức tạp hơn có thể được sử dụng trong bố cục khối, chẳng hạn như phao và cột. Đổi lại, nó có được các công cụ đơn giản và mạnh mẽ để phân phối không gian và sắp xếp nội dung theo cách mà các ứng dụng web và các trang web phức tạp thường cần.

Làm thế nào nó có thể giúp đỡ trong trường hợp này? Được rồi để xem.


Cột thẳng hàng

Sử dụng Twitter Bootstrap, chúng tôi .rowcó một số .col-*s. Tất cả những gì chúng ta cần làm là hiển thị .row2 mong muốn dưới dạng hộp chứa flex và sau đó căn chỉnh tất cả các mục flex của nó (các cột) theo chiều dọc theo thuộc align-itemstính.

VÍ DỤ TẠI ĐÂY (Vui lòng đọc các bình luận cẩn thận)

<div class="container">
    <div class="row vertical-align"> <!--
                    ^--  Additional class -->
        <div class="col-xs-6"> ... </div>
        <div class="col-xs-6"> ... </div>
    </div>
</div>
.vertical-align {
    display: flex;
    align-items: center;
}

Đầu ra

Các cột thẳng hàng trong Twitter Bootstrap

Vùng màu hiển thị hộp đệm của cột.

Làm rõ về align-items: center

8.3 Căn chỉnh trục chéo: align-itemstài sản

Các mục flex có thể được căn chỉnh theo trục chéo của dòng hiện tại của thùng chứa flex, tương tự justify-contentnhưng theo hướng vuông góc. align-itemsđặt căn chỉnh mặc định cho tất cả các mục của bộ chứa flex, bao gồm các mục flex ẩn danh .

align-items: center; Theo giá trị trung tâm, hộp lề của vật phẩm flex được đặt chính giữa trong trục chéo trong dòng.


Thông báo lớn

Lưu ý quan trọng # 1: Twitter Bootstrap không chỉ định các widthcột trong các thiết bị nhỏ hơn trừ khi bạn cung cấp một trong các .col-xs-#lớp cho các cột.

Do đó, trong bản demo cụ thể này, tôi đã sử dụng .col-xs-*các lớp để các cột được hiển thị đúng trong chế độ di động, vì nó chỉ định widthrõ ràng của cột.

Nhưng thay vào đó, bạn có thể tắt bố cục Flexbox chỉ bằng cách thay đổi display: flex;thành display: block;các kích thước màn hình cụ thể. Ví dụ:

/* Extra small devices (767px and down) */
@media (max-width: 767px) {
    .row.vertical-align {
        display: block; /* Turn off the flexible box layout */
    }
}

Hoặc bạn có thể xác định .vertical-align chỉ về kích cỡ màn hình cụ thể như sau:

/* Small devices (tablets, 768px and up) */
@media (min-width: 768px) {
    .row.vertical-align {
        display: flex;
        align-items: center;
    }
}

Trong trường hợp đó, tôi sẽ đi theo cách tiếp cận của @KevinNelson .

Lưu ý quan trọng # 2: Tiền tố nhà cung cấp bị bỏ qua do ngắn gọn. Cú pháp Flexbox đã được thay đổi trong thời gian. Cú pháp viết mới sẽ không hoạt động trên các phiên bản cũ hơn của trình duyệt web (nhưng không cũ như Internet Explorer 9! Flexbox được hỗ trợ trên Internet Explorer 10 trở lên).

Điều này có nghĩa là bạn cũng nên sử dụng các thuộc tính có tiền tố của nhà cung cấp như display: -webkit-boxvà trong chế độ sản xuất.

Nếu bạn nhấp vào "Toggle View Compiled" trong Demo , bạn sẽ thấy phiên bản khai báo CSS có tiền tố (nhờ Autoprefixer ).


Các cột có chiều cao đầy đủ với nội dung được sắp xếp theo chiều dọc

Như bạn thấy trong bản demo trước , các cột (các mục flex) không còn cao bằng thùng chứa của chúng (hộp chứa flex. Tức là .rowphần tử).

Điều này là do sử dụng centergiá trị cho align-itemstài sản. Giá trị mặc định là stretchđể các mục có thể lấp đầy toàn bộ chiều cao của phần tử cha.

Để khắc phục điều đó, bạn cũng có thể thêm display: flex;vào các cột:

VÍ DỤ TẠI ĐÂY (Một lần nữa, hãy chú ý các ý kiến)

.vertical-align {
  display: flex;
  flex-direction: row;
}

.vertical-align > [class^="col-"],
.vertical-align > [class*=" col-"] {
  display: flex;
  align-items: center;     /* Align the flex-items vertically */
  justify-content: center; /* Optional, to align inner flex-items
                              horizontally within the column  */
}

Đầu ra

Các cột có chiều cao đầy đủ với nội dung được căn chỉnh theo chiều dọc trong Twitter Bootstrap

Vùng màu hiển thị hộp đệm của cột.

Cuối cùng, nhưng không kém phần quan trọng , lưu ý rằng các bản demo và đoạn mã ở đây nhằm cung cấp cho bạn một ý tưởng khác, để cung cấp một cách tiếp cận hiện đại để đạt được mục tiêu. Vui lòng lưu ý phần " Thông báo lớn " nếu bạn định sử dụng phương pháp này trong các trang web hoặc ứng dụng trong thế giới thực.


Để đọc thêm bao gồm hỗ trợ trình duyệt, các tài nguyên này sẽ hữu ích:


1. Sắp xếp theo chiều dọc một hình ảnh bên trong div với chiều cao đáp ứng 2. Tốt hơn là sử dụng một lớp bổ sung để không thay đổi mặc định của Twitter Bootstrap .row.


9
Sau một nghiên cứu nhỏ, tôi thực sự thấy rằng HTML5Please.com nói rằng có đủ hỗ trợ để sử dụng nó. Vì vậy, đó là khá tuyệt vời! html5please.com/#flexbox
Alec Moore

6
Đây thực sự là giải pháp tốt nhất và cần có nhiều hỗ trợ hơn. Và tất nhiên, chúng tôi, các nhà phát triển, phải sử dụng nó nhiều nhất có thể để tuyên truyền nó.
Mateus Neves

12
Tôi đã thử điều này và không làm việc cho tôi theo cách mong đợi, cho đến khi tôi chỉnh sửa câu đố của bạn và nhận ra rằng điều này hoàn toàn không đáng tin và lãng phí thời gian. Làm điều này hoàn toàn bỏ lỡ điểm thiết kế đáp ứng, vì các cột sẽ không xếp chồng lên nhau khi chúng không vừa với màn hình, do đó khiến nhu cầu bootstrap hoàn toàn không đáng tin và khiến trang web của bạn không phản hồi. Để xem ý tôi là gì, hãy thay đổi bất kỳ col-xs- * nào thành col-xs-12 trong các ví dụ tương ứng, làm cho màn hình trình duyệt của bạn rất nhỏ (như thiết bị di động) và xem kết quả: không phản hồi nữa.
Pere

8
@HashemQolami mặc dù bạn đang sử dụng các lớp có tên col-*, fiddle / codepens của bạn không sử dụng bootstrap, vì vậy chúng gây hiểu nhầm. Ví dụ của bạn không hoạt động với bootstrap; hệ thống lưới của nó không dựa trên flex, do đó chúng không tương thích. Chỉ cần thử bất kỳ ví dụ nào của bạn trong trang hỗ trợ bootstrap và bạn sẽ nhận ra chúng không hoạt động.
Pere

5
@Hashem Qolami vẫn không thể tìm thấy bất kỳ trường hợp sử dụng nào cho các đề xuất của bạn. Một trong những tính năng cốt lõi, khác biệt của Bootstrap là các cột xếp chồng lên nhau khi chúng không khớp với nhau theo chiều ngang. Điều đó không xảy ra nữa với giải pháp của bạn. Hệ thống lưới hoạt động ngay cả khi bạn chỉ tải các kiểu, như bạn có thể thấy trong câu đố này . Không có js; chỉ css. Thay đổi kích thước của khu vực kết xuất và nó sẽ đáp ứng. Điều đó không xảy ra trong bất kỳ ví dụ nào của bạn. Cách tiếp cận "đầu tiên trên thiết bị di động" bị mất, khiến Bootstrap không cần thiết. Vì vậy, câu trả lời này không chính xác, sai lệch hoặc không đầy đủ.
Pere

48

Các mã dưới đây làm việc cho tôi:

.vertical-align {
    display: flex;
    align-items: center;
}

4
Giải pháp đơn giản nhất IMHO
saiyancoder

3
Bất cứ ai cũng có một giải pháp làm việc với một cột duy nhất? Tôi có một hàng, và sau đó bên trong chỉ là một chiếc col-md-6. Giải pháp này và phần còn lại của các hộp flexbox chỉ hoạt động khi có 2 cột
Ka Mok

36

Cập nhật 2020

Tôi biết câu hỏi ban đầu là dành cho Bootstrap 3, nhưng bây giờ Bootstrap 4 đã được phát hành, đây là một số hướng dẫn cập nhật về trung tâm dọc.

Quan trọng! Trung tâm dọc tương đối với chiều cao của cha mẹ

Nếu cha mẹ của phần tử mà bạn cố gắng căn giữa không có chiều cao xác định , thì không có giải pháp định tâm dọc nào sẽ hoạt động!

Bootstrap 4

Giờ đây, Bootstrap 4 là flexbox theo mặc định, có nhiều cách tiếp cận khác nhau để căn chỉnh theo chiều dọc bằng cách sử dụng: lề tự động , dụng cụ flexbox hoặc các tiện ích hiển thị cùng với các tiện ích căn chỉnh dọc . Lúc đầu, "tiện ích căn chỉnh dọc" có vẻ rõ ràng, nhưng chúng chỉ hoạt động với các yếu tố hiển thị nội tuyến và bảng. Dưới đây là một số tùy chọn định tâm dọc Bootstrap 4 ..


1 - Trung tâm dọc sử dụng lề tự động:

Một cách khác để trung tâm theo chiều dọc là sử dụng my-auto . Điều này sẽ tập trung các yếu tố trong container của nó. Ví dụ: h-100làm cho hàng đầy đủ chiều cao và my-autosẽ căn giữa col-sm-12cột.

<div class="row h-100">
    <div class="col-sm-12 my-auto">
        <div class="card card-block w-25">Card</div>
    </div>
</div>

Bootstrap 4 - trung tâm dọc sử dụng tính năng tự động lề Demo

my-auto đại diện cho lề trên trục y dọc và tương đương với:

margin-top: auto;
margin-bottom: auto;

2 - Trung tâm dọc với Flexbox:

Cột lưới trung tâm dọc

Vì Bootstrap 4 .rowbây giờdisplay:flex bạn chỉ cần sử dụng align-self-centertrên bất kỳ cột nào để căn giữa theo chiều dọc ...

       <div class="row">
           <div class="col-6 align-self-center">
                <div class="card card-block">
                 Center
                </div>
           </div>
           <div class="col-6">
                <div class="card card-inverse card-danger">
                    Taller
                </div>
          </div>
    </div>

hoặc, sử dụng align-items-centertrên toàn bộ.row trung tâm theo chiều dọc, sắp xếp tất cả col-*trong hàng ...

       <div class="row align-items-center">
           <div class="col-6">
                <div class="card card-block">
                 Center
                </div>
           </div>
           <div class="col-6">
                <div class="card card-inverse card-danger">
                    Taller
                </div>
          </div>
    </div>

Bootstrap 4 - Cột dọc chiều cao khác nhau Demo


3 - Trung tâm dọc sử dụng các tiện ích hiển thị:

Bootstrap 4 có utils hiển thị có thể được sử dụng cho display:table, display:table-cell, display:inline, vv .. Đây có thể được sử dụng với các utils sự liên kết dọc để inline class, inline-block hoặc các yếu tố ô trong bảng.

<div class="row h-50">
    <div class="col-sm-12 h-100 d-table">
        <div class="card card-block d-table-cell align-middle">
            I am centered vertically
        </div>
    </div>
</div>

Bootstrap 4 - Trung tâm dọc sử dụng dụng cụ hiển thị Demo

Xem thêm: Trung tâm căn chỉnh dọc trong Bootstrap 4


Bootstrap 3

Phương pháp Flexbox trên hộp chứa của vật phẩm đến trung tâm:

.display-flex-center {
    display: flex;
    align-items: center;
}

Chuyển đổi phương thức dịchY:

.transform-center-parent {
    position: relative;
    transform-style: preserve-3d;
}

.transform-center {
    position: relative;
    top: 50%;
    transform: translateY(-50%);
}

Hiển thị phương thức nội tuyến:

.display-inline-block {
    display: inline;
}
.display-inline-block > div {
    display: inline-block;
    float: none;
    vertical-align: middle;
}

Bản demo của phương pháp định tâm Bootstrap 3


1
Dưới đây là tài liệu Bootstrap cho mx-auto(định tâm ngang), do đó, nó có nghĩa là my-autotrung tâm theo chiều dọc (trục y).
xinthose


21

Tôi nghĩ rằng tôi sẽ chia sẻ "giải pháp" của mình trong trường hợp nó giúp bất kỳ ai khác không quen thuộc với các truy vấn @media.

Nhờ câu trả lời của @ HashemQolami, tôi đã xây dựng một số truy vấn phương tiện có thể hoạt động trên thiết bị di động như các lớp col- * để tôi có thể xếp col- * cho thiết bị di động nhưng hiển thị chúng được căn chỉnh theo chiều dọc ở giữa cho màn hình lớn hơn, ví dụ:

<div class='row row-sm-flex-center'>
    <div class='col-xs-12 col-sm-6'></div>
    <div class='col-xs-12 col-sm-6'></div>
</div>

.

.row-xs-flex-center {
    display:flex;
    align-items:center;
}
@media ( min-width:768px ) {
    .row-sm-flex-center {
        display:flex;
        align-items:center;
    }
}
@media ( min-width: 992px ) {
    .row-md-flex-center {
        display:flex;
        align-items:center;
    }
}
@media ( min-width: 1200px ) {
    .row-lg-flex-center {
        display:flex;
        align-items:center;
    }
}

Bố cục phức tạp hơn yêu cầu số lượng cột khác nhau trên mỗi độ phân giải màn hình (ví dụ: 2 hàng cho -xs, 3 cho -sm và 4 cho -md, v.v.) sẽ cần một số cách xử lý nâng cao hơn, nhưng đối với một trang đơn giản có -xs xếp chồng và -sm và lớn hơn trong các hàng, điều này hoạt động tốt.


Trong trường hợp của tôi, tôi đã phải thêm một clear: both;vào các lớp bên trong các truy vấn phương tiện để làm cho điều này hoạt động.
motaa

1
@motaa, Xin lỗi vì sự nhầm lẫn ... Trong thời trang BS3, như bạn có thể thấy trong ví dụ HTML của mình, tôi sử dụng nó như một công cụ .rowsửa đổi ... vì vậy nó sẽ trông như thế class="row row-sm-flex-center". .rowĐịnh nghĩa BS3 xử lýclear:both;
Kevin Nelson

Tôi nên đã phân tích mã html của bạn kỹ lưỡng hơn. :) Tôi cũng sử dụng công cụ sửa đổi .row, nhưng trong trường hợp của tôi (wordpress), nó đã được thay đổi trong chủ đề gốc, cuối cùng dẫn tôi thêm clear: both;một lần nữa.
motaa

21

Theo câu trả lời được chấp nhận, nếu bạn không muốn tùy chỉnh đánh dấu, để phân tách mối quan tâm hoặc đơn giản vì bạn sử dụng CMS, giải pháp sau hoạt động tốt:

.valign {
  font-size: 0;
}

.valign > [class*="col"] {
  display: inline-block;
  float: none;
  font-size: 14px;
  font-size: 1rem;
  vertical-align: middle;
}
<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css" rel="stylesheet"/>
<div class="row valign">
   <div class="col-xs-5">
      <div style="height:5em;border:1px solid #000">Big</div>
   </div>
   <div class="col-xs-5">
       <div style="height:3em;border:1px solid #F00">Small</div>
   </div>
 </div>

Hạn chế ở đây là bạn không thể kế thừa kích thước phông chữ từ phần tử cha vì hàng đặt kích thước phông chữ thành 0 để xóa khoảng trắng.



17

Đây là giải pháp của tôi. Chỉ cần thêm lớp này vào nội dung CSS của bạn.

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

Sau đó, HTML của bạn sẽ trông như thế này:

<div class="col-xs-12 align-middle">
  <div class="col-xs-6" style="background-color:blue;">
    <h3>Item</h3>
    <h3>Item</h3>
  </div>
  <div class="col-xs-6" style="background-color:red;">
    <h3>Item</h3>
  </div>
</div>

.align-middle {
  display: flex;
  justify-content: center;
  align-items: center;
}
<html>
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
<!DOCTYPE html>
    <title>Title</title>
  </head>
  <body>
    <div class="container">
      <div class="row">
        <div class="col-xs-12 align-middle">
          <div class="col-xs-6" style="background-color:blue;">
            <h3>Item</h3>
            <h3>Item</h3>
          </div>
          <div class="col-xs-6" style="background-color:red;">
            <h3>Item</h3>
          </div>
        </div>
      </div>
    </div>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
  </body>
</html>


1
Điều này phá vỡ các lớp đáp ứng, chẳng hạn như col-md-6
Lucas Bustamante

15

Tôi chỉ làm điều này và nó làm những gì tôi muốn nó làm.

.align-middle {
  margin-top: 25%;
  margin-bottom: 25%;
}

Và bây giờ trang của tôi trông như

<div class='container-fluid align-middle'>
    content

 +--------------------------------+
 |                                |
 |  +--------------------------+  |
 |  |                          |  |
 |  |                          |  |
 |  |                          |  |
 |  |                          |  |
 |  |                          |  |
 |  +--------------------------+  |
 |                                |
 +--------------------------------+

Vấn đề với cách tiếp cận này là nó dường như không hoạt động khi DIV có chiều cao được chỉ định: jsfiddle.net/4bpxen25/1 Tôi khuyên bạn nên: stackoverflow.com/a/28519318/1477388
user1477388

10

Tôi thực sự tìm thấy đoạn mã sau hoạt động bằng Chrome chứ không phải các trình duyệt khác ngoài câu trả lời hiện được chọn:

.v-center {
    display:table!important; height:125px;
}

.v-center div[class*='col-'] {
   display: table-cell!important;
   vertical-align:middle;
   float:none;
}
.v-center img {
   max-height:125px;
}

Liên kết khởi động

Bạn có thể cần sửa đổi độ cao (cụ thể là trên .v-center) và xóa / thay đổi div theo div[class*='col-']nhu cầu của bạn.


8

Tôi gặp vấn đề tương tự. Trong trường hợp của tôi, tôi không biết chiều cao của thùng chứa bên ngoài, nhưng đây là cách tôi sửa nó:

Đầu tiên hãy đặt chiều cao cho bạn htmlbodycác phần tử sao cho chúng là 100%. Điều này quan trọng! Không có điều này, các yếu tố htmlbodyđơn giản sẽ thừa hưởng chiều cao của con cái họ.

html, body {
   height: 100%;
}

Sau đó, tôi đã có một lớp container bên ngoài với:

.container {
  display: table;
  width: 100%;
  height: 100%; /* For at least Firefox */
  min-height: 100%;
}

Và cuối cùng là thùng chứa bên trong với lớp:

.inner-container {
  display: table-cell;
  vertical-align: middle;
}

HTML đơn giản như:

<body>
   <div class="container">
     <div class="inner-container">
        <p>Vertically Aligned</p>
     </div>
   </div>
</body>

Đây là tất cả những gì bạn cần để sắp xếp theo chiều dọc nội dung. Kiểm tra nó trong fiddle:

Jsfiddle


8

Không có nhu cầu về bảng và ô bảng. Nó có thể dễ dàng đạt được bằng cách sử dụng biến đổi.

Ví dụ: http://codepen.io/arvind/pen/QNbwyM

Mã số:

.child {
  height: 10em;
  border: 1px solid green;
  position: relative;
}
.child-content {
  position: absolute;
  top: 50%;
  left: 50%;
  -webkit-transform: translate(-50%, -50%);
  transform: translate(-50%, -50%);
}
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet" />
<div class="row parent">
  <div class="col-xs-6 col-lg-6 child">
    <div class="child-content">
      <div style="height:4em;border:1px solid #000">Big</div>
    </div>
  </div>
  <div class="col-xs-6 col-lg-6 child">
    <div class="child-content">
      <div style="height:3em;border:1px solid #F00">Small</div>
    </div>
  </div>
</div>


7

Nếu bạn đang sử dụng phiên bản Ít hơn của Bootstrap và tự biên dịch thành CSS, bạn có thể sử dụng một số lớp tiện ích để sử dụng với các lớp Bootstrap.

Tôi đã tìm thấy những thứ này hoạt động rất tốt, nơi tôi muốn duy trì khả năng phản hồi và cấu hình của hệ thống lưới Bootstrap (như sử dụng -mdhoặc-sm ), nhưng tôi muốn tất cả các cột trong một hàng nhất định đều có cùng chiều cao (để tôi có thể sau đó sắp xếp theo chiều dọc nội dung của chúng và có tất cả các cột trong hàng chia sẻ một khoảng giữa chung).

CSS / Ít hơn:

.display-table {
    display: table;
    width: 100%;
}
.col-md-table-cell {
    @media (min-width: @screen-md-min) {
        display: table-cell;
        vertical-align: top;
        float: none;
    }
}
.col-sm-table-cell {
    @media (min-width: @screen-sm-min) {
        display: table-cell;
        vertical-align: top;
        float: none;
    }
}
.vertical-align-middle {
    vertical-align: middle;
}

HTML:

<div class="row display-table">
    <div class="col-sm-5 col-sm-table-cell vertical-align-middle">
        ...
    </div>
    <div class="col-sm-5 col-sm-table-cell vertical-align-middle">
        ...
    </div>
</div>

6

Tôi đã xây dựng một chút về câu trả lời của zessx , để giúp sử dụng dễ dàng hơn khi trộn các kích cỡ cột khác nhau trên các kích thước màn hình khác nhau.

Nếu bạn sử dụng Sass , bạn có thể thêm tệp này vào tệp scss của mình:

@mixin v-col($prefix, $min-width) {
    @media (min-width: $min-width) {
        .col-#{$prefix}-v {
            display: inline-block;
            vertical-align: middle;
            float: none;
        }
    }
}

@include v-col(lg, $screen-lg);
@include v-col(md, $screen-md);
@include v-col(sm, $screen-sm);
@include v-col(xs, $screen-xs);

Cái nào tạo ra CSS sau (mà bạn có thể sử dụng trực tiếp trong biểu định kiểu của mình, nếu bạn không sử dụng Sass):

@media (min-width: 1200px) {
    .col-lg-v {
        display: inline-block;
        vertical-align: middle;
        float: none;
    }
}

@media (min-width: 992px) {
    .col-md-v {
        display: inline-block;
        vertical-align: middle;
        float: none;
    }
}

@media (min-width: 768px) {
    .col-sm-v {
        display: inline-block;
        vertical-align: middle;
        float: none;
    }
}

@media (min-width: 480px) {
    .col-xs-v {
        display: inline-block;
        vertical-align: middle;
        float: none;
    }
}

Bây giờ bạn có thể sử dụng nó trên các cột đáp ứng của bạn như thế này:

<div class="container">
    <div class="row">
        <div class="col-sm-7 col-sm-v col-xs-12">
            <p>
                This content is vertically aligned on tablets and larger. On mobile it will expand to screen width.
            </p>
        </div><div class="col-sm-5 col-sm-v col-xs-12">
            <p>
                This content is vertically aligned on tablets and larger. On mobile it will expand to screen width.
            </p>
        </div>
    </div>
    <div class="row">
        <div class="col-md-7 col-md-v col-sm-12">
            <p>
                This content is vertically aligned on desktops and larger. On tablets and smaller it will expand to screen width.
            </p>
        </div><div class="col-md-5 col-md-v col-sm-12">
            <p>
                This content is vertically aligned on desktops and larger. On tablets and smaller it will expand to screen width.
            </p>
        </div>
    </div>
</div>

Điều này thực sự tốt đẹp!
Pietro Coelho

Nâng cấp chỉ vì cú pháp ngắn và sử dụng các biến LESS.
Eduard Luca

5

Các hành vi Flex được hỗ trợ nguyên bản kể từ Bootstrap 4. Thêm d-flex align-items-centervàorow div. Bạn không còn cần phải sửa đổi nội dung CSS của bạn.

Ví dụ đơn giản: http://jsfiddle.net/vgks6L74/

<!-- language: html -->
<div class="row d-flex align-items-center">
  <div class="col-5 border border-dark" style="height:10em">  Big </div>
  <div class="col-2 border border-danger" style="height:3em"> Small </div>
</div>

Với ví dụ của bạn: http://jsfiddle.net/7zwtL702/

<!-- language: html -->
<div class="row d-flex align-items-center">
    <div class="col-5">
        <div class="border border-dark" style="height:10em">Big</div>
    </div>
    <div class="col-2">
        <div class="border border-danger" style="height:3em">Small</div>
   </div>
</div>

Nguồn: Flex · Bootstrap


4

OK, vô tình tôi đã trộn một vài giải pháp và cuối cùng nó cũng hoạt động với bố cục của tôi, nơi tôi đã cố gắng tạo một bảng 3x3 với các cột Bootstrap ở độ phân giải nhỏ nhất.

/* Required styles */

#grid a {
  display: table;
}

#grid a div {
  display: table-cell;
  vertical-align: middle;
  float: none;
}


/* Additional styles for demo: */

body {
  padding: 20px;
}

a {
  height: 40px;
  border: 1px solid #444;
}

a > div {
  width: 100%;
  text-align: center;
}
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" />

<div id="grid" class="clearfix row">
  <a class="col-xs-4 align-center" href="#">
    <div>1</div>
  </a>
  <a class="col-xs-4 align-center" href="#">
    <div>2</div>
  </a>
  <a class="col-xs-4 align-center" href="#">
    <div>3</div>
  </a>
  <a class="col-xs-4 align-center" href="#">
    <div>4</div>
  </a>
  <a class="col-xs-4 align-center" href="#">
    <div>5</div>
  </a>
  <a class="col-xs-4 align-center" href="#">
    <div>6</div>
  </a>
  <a class="col-xs-4 align-center" href="#">
    <div>7</div>
  </a>
  <a class="col-xs-4 align-center" href="#">
    <div>8</div>
  </a>
  <a class="col-xs-4 align-center" href="#">
    <div>9</div>
  </a>
</div>


2

    div{
        border: 1px solid;
    }
    span{
        display: flex;
        align-items: center;
    }
    .col-5{
        width: 100px;
        height: 50px;
        float: left;
        background: red;
    }
    .col-7{
        width: 200px;
        height: 24px;

        float: left;
        background: green;
    }
    <span>
        <div class="col-5">
        </div>
        <div class="col-7"></div>
    </span>


1

Thử cái này,

.exe {
  font-size: 0;
}

.exe > [class*="col"] {
  display: inline-block;
  float: none;
  font-size: 14px;
  font-size: 1rem;
  vertical-align: middle;
}
<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css" rel="stylesheet"/>
<div class="row  exe">
   <div class="col-xs-5">
      <div style="height:5em;border:1px solid grey">Big</div>
   </div>
   <div class="col-xs-5">
       <div style="height:3em;border:1px solid red">Small</div>
   </div>
 </div>


1

Có một số cách bạn có thể làm điều đó:

  1. Sử dụng 

    display: table-cell;
    vertical-align: middle;

    và CSS của container tới

    display: table;
  2. Sử dụng phần đệm cùng với màn hình phương tiện để thay đổi phần đệm so với kích thước màn hình. Google @media màn hình để biết thêm.

  3. Sử dụng đệm tương đối

    Tức là, chỉ định phần đệm theo%


0

Với Bootstrap 4 (hiện đang ở dạng alpha), bạn có thể sử dụng .align-items-centerlớp. Vì vậy, bạn có thể giữ nhân vật phản ứng nhanh của Bootstrap. Làm việc ngay lập tức tốt cho tôi. Xem Tài liệu Bootstrap 4 .


Điều này chỉ hoạt động đối với một số mục khi phần tử chứa được hiển thị: flex.
Zim

0

HTML

<div class="row">
    <div class="col-xs-2 pull-bottom"
         style="height:100px;background:blue">
    </div>
    <div class="col-xs-8 pull-bottom"
         style="height:50px;background:yellow">
    </div>
</div>

CSS

.pull-bottom {
    display: inline-block;
    vertical-align: bottom;
    float: none;
}

-4

Tôi đã gặp tình huống tương tự khi tôi muốn sắp xếp một vài phần tử div theo chiều dọc và thấy rằng các lớp Bootstrap col-xx-xx áp dụng kiểu cho div là float: left.

Tôi đã phải áp dụng kiểu trên các phần tử div như style = "Float: none" và tất cả các phần tử div của tôi bắt đầu căn chỉnh theo chiều dọc. Dưới đây là ví dụ hoạt động:

<div class="col-lg-4" style="float:none;">

Liên kết JsFiddle

Chỉ trong trường hợp ai đó muốn đọc thêm về thuộc tính float:

W3Schools - Phao


Điều này không làm việc cho tôi. Tôi đã thử nghiệm trên Firefox và Chrome. Tất cả các bảng được xếp theo chiều dọc.
Alf

float: none sẽ làm cho chúng được xếp theo chiều dọc, đây là cách nó nên hoạt động.
ATHER

1
Sau đó, đó là câu trả lời đúng cho một câu hỏi khác. ;)
Alf
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.