Wie richte ich Gitterelemente im Bootstrap-Fluid-Layout von unten aus?

123

Ich habe ein flüssiges Layout mit dem Bootstrap von Twitter, wobei ich eine Zeile mit zwei Spalten habe. Die erste Spalte enthält viel Inhalt, den ich normalerweise ausfüllen möchte. Die zweite Spalte enthält nur eine Schaltfläche und Text, den ich unten relativ zur Zelle in der ersten Spalte ausrichten möchte.

Folgendes habe ich:

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

Folgendes möchte ich:

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

Ich habe Lösungen gesehen, die die erste Spanne zu einer absoluten Höhe machen und die zweite Spanne relativ dazu positionieren, aber eine Lösung, bei der ich die absolute Höhe meiner Divs nicht angeben musste, wäre vorzuziehen. Ich bin auch offen für ein völliges Umdenken, wie man den gleichen Effekt erzielt. Ich bin nicht mit dieser Verwendung des Gerüsts verheiratet, es schien mir nur am sinnvollsten zu sein.

Dieses Layout als Geige:

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

Ryan
quelle
Könnten Sie Ihrer .rightspan nicht einen Rand von etwa 200px hinzufügen?
Richlewis
Verknüpfung zu CSS nur Antwort auf diese Frage: stackoverflow.com/a/14223553/259725
Adam
bootply.com/125740# (Entschuldigung, ich habe vergessen, von welcher Antwort auf welche SO-Frage dieser Link stammt.)
ToolmakerSteve

Antworten:

50

Bitte beachten Sie: Für Benutzer von Bootstrap 4+ sollten Sie die Lösung von Christophe in Betracht ziehen (Bootstrap 4 führte die Flexbox ein, die eine elegantere Nur-CSS-Lösung bietet). Das Folgende funktioniert für frühere Versionen von Bootstrap ...


Eine funktionierende Lösung finden Sie unter 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())
});

Auf der positiven Seite:

  • Im Geiste der vorhandenen Hilfsklassen von Bootstrap habe ich die Klasse benannt pull-down.
  • Nur das Element, das "heruntergezogen" wird, muss klassifiziert werden, also ...
  • ... es kann für verschiedene Elementtypen wiederverwendet werden (div, span, section, p usw.)
  • es wird ziemlich gut unterstützt (alle gängigen Browser unterstützen margin-top)

Nun die schlechte Nachricht:

  • es erfordert jQuery
  • es ist nicht, wie geschrieben, ansprechbar (sorry)
Jeromy Französisch
quelle
3
für die Reaktionsfähigkeit vielleicht das window.resize haken? stackoverflow.com/a/2969091/244811
Scott Weaver
22
Verwenden Sie keine jQuery-Lösung für etwas, das eine CSS-Lösung sein könnte. Es gibt viele Gründe, DOM-Manipulationen für Stylingzwecke zu vermeiden.
Archonic
1
@Archonic: Was ist diese reine CSS-Lösung? Ich würde es auch einer JS-abhängigen Lösung vorziehen. Denken Sie nur an die Bestimmung von OP: "Eine Lösung, bei der ich nicht die absolute Höhe meiner Divs angeben musste, wäre vorzuziehen"
Jeromy French
1
@cfx Hat eine reine CSS-Lösung mit einer Geige gepostet, die keine absoluten Höhen erfordert.
Archonic
1
Auf der anderen Seite ermöglicht meine Lösung dem Benutzer, einzelne Elemente nach unten auszurichten (was ein ähnliches Verhalten wie bei Bootstrap .pull-leftund aufweist .pull-right), ohne die Geschwister zu beeinträchtigen. Kann das mit einer Nur-CSS-Lösung gemacht werden?
Jeromy French
68

Dies ist eine aktualisierte Lösung für Bootstrap 3 (sollte jedoch für ältere Versionen funktionieren), die nur CSS / LESS verwendet:

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

Sie setzen die Schriftgröße in der Zeile auf 0 (andernfalls entsteht ein lästiger Abstand zwischen den Spalten), entfernen dann die Spalten-Floats, setzen die Anzeige auf inline-block, setzen ihre Schriftgröße neu und vertical-alignkönnen dann auf eingestellt werden Alles was du brauchst.

Keine jQuery erforderlich.

cfx
quelle
Ich möchte es in der Mitte halten. In Ihrer jsfiddle hat es jedoch nicht funktioniert, als ich "vertikale Zuordnung: Mitte" ausprobiert habe. Irgendwelche Gedanken?
Freude
Versuchen Sie, beide divs auf zu setzen vertical-align: middle;.
cfx
6
Dies ist die einzig akzeptable Antwort! @ Lukas ignoriert Breiten in Spalten, die keine Zeile füllen. Und DOM-Manipulation für das Styling ... SMH.
Archonic
Ihr CSS ist (speziell .myrow) von der Zeile getrennt. Bedeutet dies nicht, dass Sie nicht eine Spalte oben, eine Spalte unten und eine dritte Spalte oben ausgerichtet haben können?
Jeromy French
Vielen Dank ! Funktioniert gut mit Bootstrap 4.
Elie Teyssedou
33

Sie können flex verwenden:

@media (min-width: 768px) {
  .row-fluid {
    display: flex;
    align-items: flex-end;
  }
}
Christophe
quelle
Die Verwendung von felx ist meiner Meinung nach sehr nett und unkompliziert, und ich hatte einen weiteren Vorteil bei der Verwendung von "Align-Items: Baseline", der mit unterschiedlichen Schriftarten in den verschiedenen auszurichtenden Elementen großartig war.
Alessandro Dentella
Hervorragender Vorschlag zur Verwendung von Flex. Einfach, direkt vorwärts und verwendet Bootstrap, um ein Bootstrap-Problem zu lösen.
CheddarMonkey
1
Geniale Antwort und funktioniert perfekt mit Bootstrap, ohne dass Javascript / JQuery benötigt wird.
Filth
1
Ja, füge dies zu einer regulären Bootstrap-Zeile hinzu und bam, es funktioniert. Wunderschönen. Wie wurde eine nicht reagierende jquery-Lösung zur Top-Antwort? Wir werden es nie erfahren.
Levi Fuller
@ LeviFuller Meine Vermutung ist, dass diese Lösung nur einen Haltepunkt unterstützt
Clamchoda
27

Sie müssen einen Stil hinzufügen für span6Folgendes:

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

und das ist deine Geige: http://jsfiddle.net/sgB3T/

Lukas
quelle
4
Ich würde eine bestimmte CSS-Klasse erstellen, anstatt sie auf span6 zu setzen, aber die Tabellenzellenstrategie funktioniert gut! Ich musste auch "display: table-row" auf das enthaltende div setzen, um die richtigen Breiten zu haben.
Meta-Knight
3
Für Bootstrap 3 habe ich diese Regel hinzugefügt: .row.align-bottom> [class ^ = col] {display: table-cell; vertikal ausrichten: unten; float: keine; } wende align-bottom auf die Zeile an & lt; div class = "row align-bottom" & gt;
Martin
@Martin, Ihre Regel funktioniert einwandfrei, wenn Sie auch .align-bottom {display: table-row;} festlegen. Die Zeilenausrichtung ist jedoch deaktiviert, da Tabellenzeilen den Bootstrap-Rand links und rechts: -15px nicht berücksichtigen ......Gedanken?
Alex White
@AlexWhite - setzen padding-left: 0und padding-right: 0auf allen Spalten in dieser Zeile.
AnalogWeapon
1
Dadurch werden Spaltenbreiten ignoriert, wenn Spalten nicht die Breite einer Zeile ausfüllen. Zum Beispiel bei der Verwendung von Offsets.
Archonic
14

Hier ist auch eine AngularJS-Direktive zum Implementieren dieser Funktionalität

    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);
        }
      };
    }
Ilya Schukin
quelle
7

Stellen Sie einfach die Eltern auf display:flex;und das Kind auf ein margin-top:auto. Dadurch wird der untergeordnete Inhalt am unteren Rand des übergeordneten Elements platziert, vorausgesetzt, das übergeordnete Element hat eine größere Höhe als das untergeordnete Element.

Es ist nicht erforderlich, einen Wert zu berechnen, margin-topwenn Ihr übergeordnetes Element eine Höhe oder ein anderes Element aufweist, das größer ist als das untergeordnete interessierende Element in Ihrem übergeordneten Element.

Sissypants
quelle
Dies sollte die akzeptierte Antwort sein: Es ist kurz, einfach und funktioniert in jedem Browser, der Flex unterstützt. Der einzige Nachteil ist, dass die Reaktionsfähigkeit beeinträchtigt wird.
TBB
4

Basierend auf den anderen Antworten ist hier eine noch reaktionsschnellere Version. Ich habe Änderungen an Iwans Version vorgenommen, um Ansichtsfenster mit einer Breite von <768 Pixel und eine bessere Unterstützung für langsame Fenstergrößenänderungen zu unterstützen.

!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);
bbodenmiller
quelle
Vielen Dank für diese Verfeinerung, ich habe es gerade für ein aktuelles Projekt genommen und es funktioniert gut.
Freitag,
1
Warum margin-topauf 0 setzen und dann wieder auf den neuen Wert setzen? Warum machen diese Dinge auch in zwei each()"Schleifen"?
Jeromy French
4

Dies basiert auf der Lösung von cfx, aber anstatt die Schriftgröße im übergeordneten Container auf Null zu setzen, um die Zwischenspalten zu entfernen, die aufgrund der Anzeige hinzugefügt wurden: Inline-Block und sie zurücksetzen zu müssen, habe ich einfach hinzugefügt

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

zu der Spalte divs zu kompensieren.

Kirtländer
quelle
0

Nun, ich mochte keine dieser Antworten, meine Lösung des gleichen Problems bestand darin, Folgendes hinzuzufügen : <div>&nbsp;</div>. In Ihrem Schema würde es also so aussehen (mehr oder weniger), dass in meinem Fall keine Stiländerungen erforderlich waren:

-row-fluid-------------------------------------
+-span6----------+ +----span6----------+
|                | | +---div---+       |
| content        | | | & nbsp; |       |
| that           | | +---------+       |
| is tall        | | +-----div--------+|   
|                | | |short content   ||
|                | | +----------------+|
+----------------+ +-------------------+
-----------------------------------------------
jan b
quelle
4
Woher wissen Sie, wie viele &nbsp;hinzugefügt werden müssen, wenn die Länge der linken Zelle unbekannt ist?
Gqqnbig
-2
.align-bottom {
    position: absolute;
    bottom: 10px;
    right: 10px;
}
Douglas Ribeiro
quelle
1
Sie sollten versuchen, Ihrer Antwort einige Informationen hinzuzufügen, die erklären, warum sie die OP-Frage beantwortet
MLavoie