ฉันจะจัดตำแหน่งองค์ประกอบกริดด้านล่างในเค้าโครงของไหล bootstrap ได้อย่างไร


123

ฉันมีเลย์เอาต์ที่ลื่นไหลโดยใช้ bootstrap ของ Twitter ซึ่งฉันมีแถวที่มีสองคอลัมน์ คอลัมน์แรกมีเนื้อหาจำนวนมากซึ่งฉันต้องการเติมเต็มช่วงปกติ คอลัมน์ที่สองมีปุ่มและข้อความบางส่วนซึ่งฉันต้องการจัดแนวด้านล่างให้สัมพันธ์กับเซลล์ในคอลัมน์แรก

นี่คือสิ่งที่ฉันมี:

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

นี่คือสิ่งที่ฉันต้องการ:

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

ฉันเคยเห็นคำตอบที่ทำให้ช่วงแรกมีความสูงสัมบูรณ์และวางตำแหน่งของช่วงที่สองเทียบกับมัน แต่วิธีแก้ปัญหาที่ฉันไม่ต้องระบุความสูงสัมบูรณ์ของ div ของฉันจะเป็นที่ต้องการ ฉันยังเปิดกว้างสำหรับการคิดใหม่ทั้งหมดเกี่ยวกับวิธีการบรรลุผลเช่นเดียวกัน ฉันไม่ได้แต่งงานกับการใช้นั่งร้านนี้ดูเหมือนว่าจะเข้าท่าที่สุดสำหรับฉัน

เค้าโครงนี้เป็นซอ:

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


คุณไม่สามารถเพิ่ม margin-top ประมาณ 200px ให้กับ .rightspan ของคุณได้หรือไม่?
Richlewis

ทางลัดไปยัง CSS เท่านั้นที่ตอบคำถามนี้: stackoverflow.com/a/14223553/259725
Adam

bootply.com/125740# (ขออภัยฉันลืมว่าคำตอบของคำถามนี้มาจากลิงก์ใด)
ToolmakerSteve

คำตอบ:


50

โปรดทราบ: สำหรับผู้ใช้ Bootstrap 4+ โปรดพิจารณาโซลูชันของ Christophe (Bootstrap 4 แนะนำ flexbox ซึ่งเป็นโซลูชัน CSS ที่สวยงามกว่าเท่านั้น) สิ่งต่อไปนี้จะใช้ได้กับ Bootstrap เวอร์ชันก่อนหน้า ...


โปรดดูhttp://jsfiddle.net/jhfrench/bAHfj/สำหรับวิธีแก้ปัญหา

//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())
});

ด้านบวก:

  • ในจิตวิญญาณของเงินทุนเรียนผู้ช่วยที่มีอยู่pull-downผมชื่อชั้นเรียน
  • เฉพาะองค์ประกอบที่ถูก "ดึงลง" เท่านั้นที่จะต้องได้รับการจัดประเภทดังนั้น ...
  • ... สามารถใช้ซ้ำได้สำหรับองค์ประกอบประเภทต่างๆ (div, span, section, p ฯลฯ )
  • ได้รับการสนับสนุนค่อนข้างดี (เบราว์เซอร์หลักทั้งหมดรองรับ margin-top)

ตอนนี้ข่าวร้าย:

  • ต้องใช้ jQuery
  • ไม่ใช่เป็นลายลักษณ์อักษรตอบสนอง (ขออภัย)

3
สำหรับการตอบสนองบางทีขอเกี่ยวกับ window.resize? stackoverflow.com/a/2969091/244811
Scott Weaver

22
อย่าใช้โซลูชัน jQuery สำหรับสิ่งที่อาจเป็นโซลูชัน CSS มีสาเหตุหลายประการที่จะหลีกเลี่ยงการปรับแต่ง DOM เพื่อวัตถุประสงค์ในการจัดแต่งทรงผม
Archonic

1
@Archonic: โซลูชันเฉพาะ CSS คืออะไร ฉันต้องการให้โซลูชันขึ้นอยู่กับ JS ด้วย โปรดทราบว่าข้อกำหนดของ OP: "ควรใช้วิธีแก้ปัญหาที่ฉันไม่ต้องระบุความสูงสัมบูรณ์ของ div ของฉัน"
Jeromy French

1
@cfx โพสต์วิธีแก้ปัญหาเฉพาะ css ด้วยซอที่ไม่ต้องการความสูงแน่นอน
Archonic

1
ในทางกลับกันโซลูชันของฉันอนุญาตให้ผู้ใช้จัดตำแหน่งองค์ประกอบแต่ละรายการด้านล่าง (ให้พฤติกรรมคล้ายกับ Bootstrap .pull-leftและ.pull-right) โดยไม่ส่งผลกระทบต่อพี่น้อง สามารถทำได้ด้วยโซลูชัน CSS เท่านั้นหรือไม่?
Jeromy French

68

นี่เป็นโซลูชันที่อัปเดตสำหรับ Bootstrap 3 (ควรใช้ได้กับเวอร์ชันเก่ากว่า) ที่ใช้ CSS / LESS เท่านั้น:

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

คุณตั้งค่าขนาดตัวอักษรเป็น 0 ในแถว (มิฉะนั้นคุณจะมีช่องว่างที่น่ารำคาญระหว่างคอลัมน์) จากนั้นลบคอลัมน์ลอยตั้งค่าการแสดงผลinline-blockตั้งค่าขนาดแบบอักษรใหม่จากนั้นvertical-alignสามารถตั้งค่าเป็น สิ่งที่คุณต้องการ

ไม่จำเป็นต้องใช้ jQuery


ฉันต้องการให้มันอยู่ตรงกลาง อย่างไรก็ตามใน jsfiddle ของคุณเมื่อฉันลอง "vertical-allign: middle" แล้วมันไม่ได้ผล ความคิดใด ๆ ?
joy

ลองตั้งค่าทั้งเพื่อdiv vertical-align: middle;
cfx

6
นี่เป็นคำตอบเดียวที่ยอมรับได้! @ Lukas จะละเว้นความกว้างของคอลัมน์ที่ไม่เติมแถว และการปรับแต่ง DOM สำหรับการจัดแต่งทรงผม ... SMH.
Archonic

CSS ของคุณถูกคีย์ออกจากแถว (โดยเฉพาะ.myrow) ... นี่ไม่ได้หมายความว่าคุณไม่สามารถจัดแนวบนสุดได้หนึ่งคอลัมน์, จัดชิดด้านล่างหนึ่งคอลัมน์และคอลัมน์ที่สามจัดชิดบนสุดใช่หรือไม่?
Jeromy French

ขอบคุณ! ใช้ได้ดีกับ Bootstrap 4
Elie Teyssedou

33

คุณสามารถใช้ flex:

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

การใช้ felx เป็นสิ่งที่ดีและตรงไปตรงมาในความคิดของฉันและฉันมีข้อได้เปรียบอีกอย่างหนึ่งในการใช้ "align-items: baseline" ซึ่งดีมากกับฟอนต์ที่แตกต่างกันในรายการต่างๆเพื่อจัดแนว
Alessandro Dentella

คำแนะนำที่ยอดเยี่ยมในการใช้ flex เรียบง่ายตรงไปข้างหน้าและใช้ Bootstrap เพื่อแก้ปัญหา Bootstrap
CheddarMonkey

1
คำตอบที่ยอดเยี่ยมและทำงานได้อย่างสมบูรณ์แบบกับ bootstrap โดยไม่จำเป็นต้องใช้ javascript / jquery
Filth

1
ใช่เพิ่มสิ่งนี้ลงในแถว bootstrap ปกติแล้วแบมก็ใช้ได้ สวย. โซลูชัน jquery ที่ไม่ตอบสนองกลายเป็นคำตอบอันดับต้น ๆ ได้อย่างไร เราจะไม่มีทางรู้
Levi Fuller

@LeviFuller ฉันเดาเพราะโซลูชันนี้รองรับเบรกพอยต์เดียวเท่านั้น
clamchoda

27

คุณต้องเพิ่มสไตล์สำหรับspan6smthg เช่นนั้น:

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

และนี่คือซอของคุณ: http://jsfiddle.net/sgB3T/


4
ฉันจะสร้างคลาส css เฉพาะแทนที่จะตั้งค่าเป็น span6 แต่กลยุทธ์เซลล์ตารางใช้ได้ดี! ฉันยังต้องตั้งค่า "display: table-row" เป็น div ที่มีเพื่อให้มีความกว้างที่ถูกต้อง
Meta-Knight

3
สำหรับ Bootstrap 3 ฉันได้เพิ่มกฎนี้: .row.align-bottom> [class ^ = col] {display: table-cell; แนวตั้ง: ด้านล่าง; ลอย: ไม่มี; } ใช้ align-bottom กับแถว & lt; div class = "row align-bottom" & gt;
Martin

@Martin กฎของคุณจะทำงานได้ดีเมื่อคุณตั้งค่า. align-bottom {display: table-row;} อย่างไรก็ตามการจัดแนวแถวปิดอยู่เนื่องจากแถวของตารางไม่เคารพขอบ bootstrap ซ้ายและขอบขวา: -15px ...... คิด?
Alex White

@AlexWhite - ใส่padding-left: 0และใส่padding-right: 0cols ทั้งหมดในแถวนั้น
AnalogWeapon

1
สิ่งนี้จะไม่สนใจความกว้างของคอลัมน์เมื่อคอลัมน์ไม่เต็มความกว้างของแถว เมื่อใช้ออฟเซ็ตเช่น
Archonic

14

นี่คือคำสั่ง angularjs เพื่อใช้ฟังก์ชันนี้

    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

เพียงแค่ตั้งผู้ปกครองไปและเด็กdisplay:flex; margin-top:autoสิ่งนี้จะวางเนื้อหาย่อยไว้ที่ด้านล่างขององค์ประกอบหลักโดยสมมติว่าองค์ประกอบหลักมีความสูงมากกว่าองค์ประกอบลูก

ไม่จำเป็นต้องลองคำนวณค่าmargin-topเมื่อคุณมีความสูงในองค์ประกอบหลักหรือองค์ประกอบอื่นที่มากกว่าองค์ประกอบที่ลูกสนใจภายในองค์ประกอบหลักของคุณ


นี่ควรเป็นคำตอบที่ได้รับการยอมรับมันสั้นง่ายและใช้งานได้กับเบราว์เซอร์ใด ๆ ที่รองรับ flex ข้อเสียเปรียบเพียงประการเดียวคือการทำลายการตอบสนอง
tbm

4

จากคำตอบอื่น ๆ ที่นี่เป็นเวอร์ชันที่ตอบสนองได้ดียิ่งขึ้น ฉันทำการเปลี่ยนแปลงจากเวอร์ชันของ Ivan เพื่อรองรับวิวพอร์ตที่กว้าง <768px และเพื่อให้รองรับการปรับขนาดหน้าต่างช้าได้ดีขึ้น

!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);

ขอบคุณสำหรับการปรับแต่งนี้ฉันเพิ่งใช้มันสำหรับโครงการปัจจุบันและทำงานได้ดี
sifriday

1
ทำไมถึงตั้งค่าmargin-topเป็น 0 แล้วตั้งอีกครั้งเป็นค่าใหม่ นอกจากนี้ทำไมสิ่งเหล่านี้จึงเป็นสองeach()"ลูป"
Jeromy French

4

สิ่งนี้ขึ้นอยู่กับโซลูชันของ cfx แต่แทนที่จะตั้งค่าขนาดตัวอักษรเป็นศูนย์ในคอนเทนเนอร์หลักเพื่อลบช่องว่างระหว่างคอลัมน์ที่เพิ่มเข้ามาเนื่องจากการแสดงผล: อินไลน์บล็อกและต้องรีเซ็ตใหม่ฉันก็เพิ่ม

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

ไปยังคอลัมน์ divs เพื่อชดเชย


0

ดีฉันไม่ชอบใด ๆ <div>&nbsp;</div>ของคำตอบเหล่านั้นวิธีการแก้ปัญหาของฉันปัญหาเดียวกันคือการเพิ่มนี้: ดังนั้นในรูปแบบของคุณมันจะมีลักษณะเช่นนี้ (ไม่มากก็น้อย) ในกรณีของฉันไม่จำเป็นต้องเปลี่ยนสไตล์:

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

4
คุณทราบจำนวนที่&nbsp;จะเพิ่มได้อย่างไรหากไม่ทราบความยาวของเซลล์ด้านซ้าย
Gqqnbig

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

1
คุณควรพยายามเพิ่มข้อมูลบางอย่างในคำตอบของคุณเพื่ออธิบายว่าเหตุใดจึงตอบคำถาม OP
MLavoie
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.