¿Cómo alineo los elementos de la cuadrícula en el diseño de fluido de arranque?

123

Tengo un diseño fluido usando el bootstrap de Twitter, en el que tengo una fila con dos columnas. La primera columna tiene mucho contenido, que quiero llenar normalmente. La segunda columna solo tiene un botón y algo de texto, que quiero alinear en relación con la celda de la primera columna.

Esto es lo que tengo:

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

Esto es lo que quiero:

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

He visto soluciones que hacen que el primer tramo tenga una altura absoluta, y coloque el segundo tramo en relación con él, pero sería preferible una solución donde no tuviera que especificar la altura absoluta de mis divisiones. También estoy abierto a un replanteamiento completo de cómo lograr el mismo efecto. No estoy casado con este uso de los andamios, simplemente parecía tener más sentido para mí.

Este diseño como violín:

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

Ryan
fuente
¿no podría agregar un margen superior de alrededor de 200 px a su .rightspan?
Richlewis
Acceso directo a CSS solo responde a esta pregunta: stackoverflow.com/a/14223553/259725
Adam
bootply.com/125740# (Lo siento, olvidé de qué respuesta a qué pregunta SO proviene este enlace)
ToolmakerSteve

Respuestas:

50

Tenga en cuenta que: para los usuarios de Bootstrap 4+, considere la solución de Christophe (Bootstrap 4 introdujo flexbox, que proporciona una solución de CSS más elegante). Lo siguiente funcionará para versiones anteriores de Bootstrap ...


Ver http://jsfiddle.net/jhfrench/bAHfj/ para una solución de trabajo.

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

En el lado positivo:

  • En el espíritu de las clases de ayuda existentes de Bootstrap , llamé a la clase pull-down.
  • solo el elemento que se "derriba" necesita ser clasificado, así que ...
  • ... es reutilizable para diferentes tipos de elementos (div, span, section, p, etc.)
  • está bastante bien soportado (todos los principales navegadores son compatibles con margin-top)

Ahora las malas noticias:

  • requiere jQuery
  • no es, como está escrito, responde (lo siento)
Jeromy francés
fuente
3
para la capacidad de respuesta, quizás enganche la ventana. stackoverflow.com/a/2969091/244811
Scott Weaver
22
No use una solución jQuery para algo que podría ser una solución CSS. Hay muchas razones para evitar la manipulación del DOM con fines de estilo.
Archonic
1
@Archonic: ¿cuál es esa solución solo CSS? También lo preferiría a una solución dependiente de JS. Solo tenga en cuenta la estipulación de OP: "sería preferible una solución en la que no tuviera que especificar la altura absoluta de mis divs"
Jeromy French
1
@cfx publicó una solución css only con un violín que no requiere alturas absolutas.
Archonic
1
Por otro lado, mi solución permite al usuario alinear elementos individuales (dando un comportamiento similar al de Bootstrap .pull-lefty .pull-right), sin afectar a los hermanos. ¿Se puede hacer eso con una solución solo CSS?
Jeromy French
68

Esta es una solución actualizada para Bootstrap 3 (aunque debería funcionar para versiones anteriores) que usa solo CSS / LESS:

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

Establece el tamaño de fuente en 0 en la fila (de lo contrario, terminará con un espacio molesto entre columnas), luego elimina los flotadores de columna, establece la visualización en inline-block, restablece su tamaño de fuente y luego vertical-alignse puede configurar en Cualquier cosa que necesites.

No se requiere jQuery.

cfx
fuente
Quiero mantenerlo en el medio. Sin embargo, en su jsfiddle cuando probé "vertical-allign: middle", no funcionó. ¿Alguna idea?
alegría
Intente configurar ambos divs en vertical-align: middle;.
cfx
66
¡Esta es la única respuesta aceptable! @ Lukas ignorará los anchos en las columnas que no llenen una fila. Y la manipulación DOM para el estilo ... SMH.
Archonic
Su CSS está fuera de la fila (específicamente .myrow) ... ¿no significa esto que no puede tener una columna alineada en la parte superior, una columna en la parte inferior y una tercera columna en la parte superior?
Jeromy French
Gracias ! Funciona bien con Bootstrap 4.
Elie Teyssedou
33

Puedes usar flex:

@media (min-width: 768px) {
  .row-fluid {
    display: flex;
    align-items: flex-end;
  }
}
Christophe
fuente
Usar felx es muy agradable y directo en mi opinión y tuve una ventaja más usando "align-items: baseline" que fue genial con diferentes fuentes en los diferentes elementos para alinear.
Alessandro Dentella
Excelente sugerencia para usar flex. Simple, directo y utiliza Bootstrap para resolver un problema de Bootstrap.
CheddarMonkey
1
Respuesta brillante y funciona perfectamente con bootstrap sin necesidad de javascript / jquery.
Suciedad el
1
Sí, agregue esto a una fila de bootstrap normal y bam, funciona. Hermoso. ¿Cómo una solución jquery que no responde se convirtió en la respuesta principal? Nunca sabremos.
Levi Fuller
@LeviFuller Creo que esta solución solo admite un punto de interrupción
clamchoda
27

Necesitas agregar un estilo para span6, smthg así:

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

y este es tu violín: http://jsfiddle.net/sgB3T/

Lukas
fuente
44
¡Crearía una clase css específica en lugar de establecerla en span6, pero la estrategia de celda de tabla funciona bien! También tuve que establecer "display: table-row" en el div que contiene para tener los anchos correctos.
Meta-Knight
3
Para Bootstrap 3 agregué esta regla: .row.align-bottom> [class ^ = col] {display: table-cell; alineación vertical: abajo; flotador: ninguno; } aplique align-bottom a la fila & lt; div class = "row align-bottom" & gt;
Martin
@Martin, su regla funciona bien cuando también establece .align-bottom {display: table-row;}, sin embargo, la alineación de la fila está desactivada porque las filas de la tabla no respetan el bootstrap margen-izquierda y margen-derecha: -15px ...... pensamientos?
Alex White
@AlexWhite: pon padding-left: 0y activa padding-right: 0todos los cols en esa fila.
AnalogWeapon
1
Esto ignorará los anchos de columna cuando las columnas no llenen el ancho de una fila. Cuando se usan compensaciones, por ejemplo.
Archonic
14

Aquí también hay una directiva angularjs para implementar esta funcionalidad

    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
fuente
7

Simplemente configure el padre display:flex;y el hijo a margin-top:auto. Esto colocará el contenido secundario en la parte inferior del elemento primario, suponiendo que el elemento primario tenga una altura mayor que el elemento secundario.

No es necesario intentar calcular un valor para margin-topcuando tiene una altura en su elemento primario u otro elemento mayor que su elemento secundario de interés dentro de su elemento primario.

mariquitas
fuente
Esta debería ser la respuesta aceptada: es corta, simple y funciona en cualquier navegador que admita flex. El único inconveniente es que rompe la capacidad de respuesta.
tbm
4

Basado en las otras respuestas aquí hay una versión aún más receptiva. Realicé cambios en la versión de Ivan para admitir ventanas gráficas de <768 píxeles de ancho y para admitir mejor el cambio de tamaño de la ventana lenta.

!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
fuente
gracias por este refinamiento, lo acabo de tomar para un proyecto actual y está funcionando bien.
sifriday
1
¿Por qué establecer margin-topen 0, luego configurarlo nuevamente al nuevo valor? Además, ¿por qué estas cosas en dos each()"bucles"?
Jeromy French
4

Esto se basa en la solución de cfx, pero en lugar de establecer el tamaño de fuente en cero en el contenedor principal para eliminar los espacios entre columnas agregados debido a la pantalla: bloque en línea y tener que restablecerlos, simplemente agregué

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

a la columna divs para compensar.

Kirtlander
fuente
0

Bueno, no me gustaba ninguna de esas respuestas, mi solución del mismo problema era que añadir lo siguiente: <div>&nbsp;</div>. Entonces, en su esquema se vería así (más o menos), en mi caso no fueron necesarios cambios de estilo:

-row-fluid-------------------------------------
+-span6----------+ +----span6----------+
|                | | +---div---+       |
| content        | | | & nbsp; |       |
| that           | | +---------+       |
| is tall        | | +-----div--------+|   
|                | | |short content   ||
|                | | +----------------+|
+----------------+ +-------------------+
-----------------------------------------------
ene b
fuente
44
¿Cómo sabes el número de &nbsp;agregar si la longitud de la celda izquierda es desconocida?
Gqqnbig
-2
.align-bottom {
    position: absolute;
    bottom: 10px;
    right: 10px;
}
Douglas Ribeiro
fuente
1
debe intentar agregar información a su respuesta que explique por qué responde la pregunta de OP
MLavoie