Làm cách nào để căn chỉnh dưới cùng các phần tử lưới trong bố cục chất lỏng bootstrap


123

Tôi có một bố cục linh hoạt bằng cách sử dụng bootstrap của Twitter, trong đó tôi có một hàng với hai cột. Cột đầu tiên có rất nhiều nội dung, tôi muốn điền khoảng cách bình thường. Cột thứ hai chỉ có một nút và một số văn bản, mà tôi muốn căn chỉnh dưới cùng so với ô trong cột đầu tiên.

Đây là những gì tôi có:

-row-fluid-------------------------------------
+-span6----------+ +-span6----------+
|                | |short content   |
| content        | +----------------+
| that           | 
| is tall        |    
|                |
+----------------+
-----------------------------------------------

Đây là những gì tôi muốn:

-row-fluid-------------------------------------
+-span6----------+
|                |
| content        |
| that           | 
| is tall        | +-span6----------+    
|                | |short content   |
+----------------+ +----------------+
-----------------------------------------------

Tôi đã thấy các giải pháp làm cho nhịp đầu tiên có chiều cao tuyệt đối và định vị nhịp thứ hai so với nó, nhưng giải pháp mà tôi không phải chỉ định chiều cao tuyệt đối của các div sẽ được ưu tiên hơn. Tôi cũng sẵn sàng suy nghĩ lại về cách đạt được hiệu quả tương tự. Tôi không kết hôn với việc sử dụng giàn giáo này, nó dường như có ý nghĩa nhất đối với tôi.

Bố cục này như một trò chơi:

http://jsfiddle.net/ryansturmer/A7buv/3/


Bạn có thể không thêm lề đầu khoảng 200px vào .rightspan của mình không?
Richlewis

Phím tắt cho CSS chỉ trả lời cho câu hỏi này: stackoverflow.com/a/14223553/259725
Adam

bootply.com/125740# (Xin lỗi tôi quên được câu trả lời cho câu hỏi mà SO liên kết này là từ đâu.)
ToolmakerSteve

Câu trả lời:


50

Xin lưu ý: đối với người dùng Bootstrap 4+, vui lòng xem xét giải pháp của Christophe (flexbox được giới thiệu Bootstrap 4, cung cấp giải pháp chỉ CSS thanh lịch hơn). Phần sau sẽ hoạt động cho các phiên bản Bootstrap trước đó ...


Xem http://jsfiddle.net/jhfrench/bAHfj/ để biết giải pháp hoạt động.

//for each element that is classed as 'pull-down', set its margin-top to the difference between its own height and the height of its parent
$('.pull-down').each(function() {
  var $this = $(this);
  $this.css('margin-top', $this.parent().height() - $this.height())
});

Về mặt tích cực:

  • theo tinh thần của các lớp trợ giúp hiện có của Bootstrap , tôi đã đặt tên cho lớp đó pull-down.
  • chỉ phần tử đang bị "kéo xuống" mới cần được phân loại, vì vậy ...
  • ... nó có thể tái sử dụng cho các loại phần tử khác nhau (div, span, section, p, v.v.)
  • nó được hỗ trợ khá tốt (tất cả các trình duyệt chính đều hỗ trợ margin-top)

Bây giờ là tin xấu:

  • nó yêu cầu jQuery
  • nó không phải, như đã viết, phản hồi (xin lỗi)

3
để đáp ứng, có lẽ móc window.resize? stackoverflow.com/a/2969091/244811
Scott Weaver

22
Không sử dụng giải pháp jQuery cho thứ gì đó có thể là giải pháp CSS. Có nhiều lý do để tránh thao tác DOM cho các mục đích tạo kiểu.
Archonic

1
@Archonic: giải pháp chỉ CSS đó là gì? Tôi cũng thích nó hơn một giải pháp phụ thuộc vào JS. Chỉ cần ghi nhớ quy định OP của: "một giải pháp mà tôi không có để xác định chiều cao tuyệt đối của các div của tôi sẽ được ưa thích"
Jeromy Pháp

1
@cfx Đã đăng một giải pháp chỉ css với một fiddle không yêu cầu độ cao tuyệt đối.
Archonic

1
Mặt khác, giải pháp của tôi cho phép người dùng căn chỉnh các phần tử riêng lẻ (cho hành vi tương tự như Bootstrap's .pull-left.pull-right), mà không ảnh hưởng đến anh chị em. Điều đó có thể được thực hiện với giải pháp chỉ CSS không?
Jeromy French

68

Đây là giải pháp cập nhật cho Bootstrap 3 (mặc dù sẽ hoạt động với các phiên bản cũ hơn) chỉ sử dụng CSS / LESS:

http://jsfiddle.net/silb3r/0srp42pb/11/

Bạn đặt kích thước phông chữ thành 0 trên hàng (nếu không, bạn sẽ có khoảng trống khó chịu giữa các cột), sau đó xóa cột nổi, đặt hiển thị thành inline-block, đặt lại kích thước phông chữ của chúng và sau đó vertical-aligncó thể được đặt thành bất cứ thứ gì bạn cần.

Không cần jQuery.


Tôi muốn giữ nó ở mức trung bình. Tuy nhiên, trong jsfiddle của bạn khi tôi thử "vertical-allign: middle" thì nó không hoạt động. Có suy nghĩ gì không?
joy

Hãy thử đặt cả hai divthành vertical-align: middle;.
cfx

6
Đây là câu trả lời duy nhất có thể chấp nhận được! @ Lukas's sẽ bỏ qua chiều rộng trên các cột không lấp đầy một hàng. Và thao tác DOM để tạo kiểu ... SMH.
Archonic

CSS của bạn được .myrowcăn lề khỏi hàng (cụ thể là ) ... điều này không có nghĩa là bạn không thể có một cột được căn trên, một cột căn dưới và một cột thứ ba căn trên?
Jeromy French

Cảm ơn ! Hoạt động tốt với Bootstrap 4.
Elie Teyssedou

33

Bạn có thể sử dụng flex:

@media (min-width: 768px) {
  .row-fluid {
    display: flex;
    align-items: flex-end;
  }
}

Theo ý kiến ​​của tôi, việc sử dụng felx rất hay và đơn giản và tôi có thêm một lợi thế nữa là sử dụng "align-items: baseline", điều đó thật tuyệt vời với các phông chữ khác biệt trong các mục khác nhau để căn chỉnh.
Alessandro Dentella

Đề xuất tuyệt vời để sử dụng flex. Đơn giản, chuyển tiếp và sử dụng Bootstrap để giải quyết vấn đề Bootstrap.
CheddarMonkey

1
Câu trả lời tuyệt vời và hoạt động hoàn hảo với bootstrap mà không cần javascript / jquery.
Filth

1
Đúng, thêm nó vào một hàng bootstrap thông thường và bam, nó hoạt động. Xinh đẹp. Làm thế nào một giải pháp jquery, không phản hồi lại trở thành câu trả lời hàng đầu? Chúng ta sẽ không bao giờ biết.
Levi Fuller

Đoán @LeviFuller của tôi là vì giải pháp này chỉ hỗ trợ một breakpoint
clamchoda

27

Bạn cần thêm một số kiểu cho span6, smthg như thế:

.row-fluid .span6 {
  display: table-cell;
  vertical-align: bottom;
  float: none;
}

và đây là trò chơi của bạn: http://jsfiddle.net/sgB3T/


4
Tôi sẽ tạo một lớp css cụ thể thay vì đặt nó thành span6, nhưng chiến lược ô bảng hoạt động tốt! Tôi cũng phải đặt "display: table-row" thành div chứa để có độ rộng chính xác.
Meta-Knight

3
Đối với Bootstrap 3, tôi đã thêm quy tắc này: .row.align-bottom> [class ^ = col] {display: table-cell; vertical-align: dưới cùng; float: không có; } áp dụng align-bottom cho hàng & lt; div class = "row align-bottom" & gt;
Martin

@Martin, quy tắc của bạn hoạt động tốt khi bạn cũng đặt .align-bottom {display: table-row;}, tuy nhiên, căn chỉnh hàng bị tắt vì các hàng trong bảng không tôn trọng bootstrap margin-left và margin-right: -15px ...... suy nghĩ?
Alex White

@AlexWhite - Đặt padding-left: 0padding-right: 0trên tất cả các cols trong hàng đó.
AnalogWeapon

1
Điều này sẽ bỏ qua chiều rộng cột khi các cột không lấp đầy chiều rộng của hàng. Ví dụ khi sử dụng hiệu số.
Archonic

14

Đây cũng là một chỉ thị anglejs để triển khai chức năng này

    pullDown: function() {
      return {
        restrict: 'A',
        link: function ($scope, iElement, iAttrs) {
          var $parent = iElement.parent();
          var $parentHeight = $parent.height();
          var height = iElement.height();

          iElement.css('margin-top', $parentHeight - height);
        }
      };
    }

7

Chỉ cần đặt cha mẹ thành display:flex;và con thành margin-top:auto. Thao tác này sẽ đặt nội dung con ở dưới cùng của phần tử mẹ, giả sử phần tử mẹ có chiều cao lớn hơn phần tử con.

Không cần phải thử và tính giá trị margin-topkhi bạn có chiều cao trên phần tử mẹ hoặc một phần tử khác lớn hơn phần tử con mà bạn quan tâm trong phần tử mẹ của bạn.


Đây phải là câu trả lời được chấp nhận: nó ngắn gọn, đơn giản và hoạt động trên bất kỳ trình duyệt nào hỗ trợ flex. Hạn chế duy nhất là nó phá vỡ khả năng phản hồi.
tbm

4

Dựa trên các câu trả lời khác, đây là một phiên bản thậm chí còn đáp ứng tốt hơn. Tôi đã thực hiện các thay đổi từ phiên bản của Ivan để hỗ trợ các chế độ xem rộng <768px và để hỗ trợ tốt hơn việc thay đổi kích thước cửa sổ chậm.

!function ($) { //ensure $ always references jQuery
    $(function () { //when dom has finished loading
        //make top text appear aligned to bottom: http://stackoverflow.com/questions/13841387/how-do-i-bottom-align-grid-elements-in-bootstrap-fluid-layout
        function fixHeader() {
            //for each element that is classed as 'pull-down'
            //reset margin-top for all pull down items
            $('.pull-down').each(function () {
                $(this).css('margin-top', 0);
            });

            //set its margin-top to the difference between its own height and the height of its parent
            $('.pull-down').each(function () {
                if ($(window).innerWidth() >= 768) {
                    $(this).css('margin-top', $(this).parent().height() - $(this).height());
                }
            });
        }

        $(window).resize(function () {
            fixHeader();
        });

        fixHeader();
    });
}(window.jQuery);

cảm ơn vì sự tinh chỉnh này, tôi vừa sử dụng nó cho một dự án hiện tại và nó đang hoạt động tốt.
thứ hai

1
Tại sao lại đặt margin-topthành 0, sau đó đặt lại thành giá trị mới? Ngoài ra, tại sao những điều này trong hai each()"vòng lặp"?
Jeromy French

4

Điều này dựa trên giải pháp của cfx, nhưng thay vì đặt kích thước phông chữ thành 0 trong vùng chứa mẹ để loại bỏ khoảng cách giữa các cột được thêm vào do hiển thị: inline-block và phải đặt lại chúng, tôi chỉ cần thêm

.row.row-align-bottom > div {
    float: none;
    display: inline-block;
    vertical-align: bottom;
    margin-right: -0.25em;
}

vào cột div để bù.


0

Vâng, tôi không thích bất kỳ của những câu trả lời, giải pháp của tôi về cùng một vấn đề là để thêm video này: <div>&nbsp;</div>. Vì vậy, trong lược đồ của bạn, nó sẽ giống như thế này (ít nhiều), không cần thay đổi kiểu dáng trong trường hợp của tôi:

-row-fluid-------------------------------------
+-span6----------+ +----span6----------+
|                | | +---div---+       |
| content        | | | & nbsp; |       |
| that           | | +---------+       |
| is tall        | | +-----div--------+|   
|                | | |short content   ||
|                | | +----------------+|
+----------------+ +-------------------+
-----------------------------------------------

4
Làm thế nào để bạn biết số lượng &nbsp;cần thêm vào nếu độ dài của ô bên trái là không biết?
Gqqnbig

-2
.align-bottom {
    position: absolute;
    bottom: 10px;
    right: 10px;
}

1
bạn nên cố gắng thêm một số thông tin để trả lời của bạn giải thích lý do tại sao nó trả lời cho câu hỏi OP
MLavoie
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.