Centrar un botón verticalmente en la celda de la tabla, usando Twitter Bootstrap

90

Estoy usando Twitter Bootstrap e intento centrar un botón dentro de una celda de la tabla. Realmente solo lo necesito centrado verticalmente.

<table class="table table-bordered table-condensed">
  <tbody>
    <tr>
      <td><a href="#" class="btn btn-primary"><i class="icon-check icon-white"></i></a></td>
      <td><a href="#">Todo Item One</a><br /><span class="label label-success">One thing</span></td>
    </tr>
  </tbody>
</table>

Consulte mi JSFiddle para conocer el problema. He probado varios trucos para centrar la mesa que conozco, pero ninguno parece funcionar correctamente. ¿Algunas ideas? Gracias por adelantado.

ACTUALIZACIÓN: Sí, lo he intentado vertical-align:middle;y funciona si está en línea, pero no si está en una clase que tdtiene. Se actualizó JSFiddle para reflejar esto.

Actualización final: soy un idiota y no verifiqué si estaba siendo sobrescrito por bootstrap.css

Tim Habersack
fuente

Respuestas:

157

PARA BOOTSTRAP 3.X:

Bootstrap ahora tiene el siguiente estilo para las celdas de la tabla:

.table tbody > tr > td{
    vertical-align: top;
}

El camino a seguir es agregar su propia clase, agregando más especificidad al selector anterior:

.table tbody > tr > td.vert-aligned {
    vertical-align: middle;
}

Y luego agrega la clase a tu tds:

<tr>
    <td class="vert-aligned"></td>
    ...
</tr>

PARA BOOTSTRAP 2.X

No hay forma de hacer esto con Bootstrap.

Cuando se usa en las celdas de la tabla, la alineación vertical hace lo que la mayoría de la gente espera, que es imitar el atributo valign (antiguo, obsoleto). En un navegador moderno que cumple con los estándares, los siguientes tres fragmentos de código hacen lo mismo:

<td valign="middle"> <!-- but you shouldn't ever use valign --> </td>
<td style="vertical-align:middle"> ... </td>
<div style="display:table-cell; vertical-align:middle"> ... </div>

Revisar su violín actualizado

Más lejos

Además, no puede hacer referencia a la tdclase que usa .vertporque Bootstrap ya tiene esta clase:

.table td {
   padding: 8px;
   line-height: 20px;
   text-align: left;
   vertical-align: top; // The problem!
   border-top: 1px solid #dddddd;
}

Y está sobrecargando la vertical-align: middleclase in '.vert', por lo que debe definir esta clase como td.vert.

Tom Sarduy
fuente
Gracias por vincular a un jsfiddle actualizado. No sabía al hacer una declaración de clase en css, y es específica de la tabla, debe anteponer el elemento de la tabla antes del nombre de la clase. En su ejemplo, 'td.vcenter' funciona, pero si lo cambia a solo '.vcenter' no funciona.
Tim Habersack
Gracias =) ¡Ayuda de Grt sin usar CSS en línea para solucionarlo!
sk8terboi87 ツ
"vert-align" nunca se documentó y no aparece en el maestro Bootstrap actual. Al responder a estas preguntas, céntrese en el comportamiento documentado.
Dr. Jan-Philip Gehrcke
@ Jan-PhilipGehrcke: No estoy seguro de qué quiere decir, pero no estoy diciendo que vert-alignsea ​​parte de Bootstrap, estoy hablando de agregar una clase NUEVA en el archivo css principal
Tom Sarduy
Lo siento, realmente debería haber leído tu respuesta con más cuidado antes de hacer una declaración tan contundente.
Dr. Jan-Philip Gehrcke
43

Una pequeña actualización para Bootstrap 3.

Bootstrap ahora tiene el siguiente estilo para las celdas de la tabla:

.table tbody>tr>td
{
    vertical-align: top;
}

El camino a seguir es agregar su propia clase, con el mismo selector:

.table tbody>tr>td.vert-align
{
    vertical-align: middle;
}

Y luego agrégalo a tu tds

<td class="vert-align"></td>
Gabriel G. Roy
fuente
1
¿Está oficialmente documentado el cambio?
usuario
14

agregue esto a su css

.table-vcenter td {
   vertical-align: middle!important;
}

luego agregue a la clase a su mesa:

        <table class="table table-hover table-striped table-vcenter">
Andrés
fuente
3
Me gusta este porque solo necesita agregar la clase en 1 lugar, en lugar de agregarla en cada td.
Hugo Sousa
2

Para solucionar esto, puse esta clase en la página web

<style>                        
    td.vcenter {
        vertical-align: middle !important;
        text-align: center !important;
    }
</style>

y esto en mi TemplateField

<asp:TemplateField ItemStyle-CssClass="vcenter">

ya que la clase CSS apunta directamente al elemento td (tabledata) y tiene la instrucción! important al final de cada configuración. Sobrepasará la configuración de clases CSS de bootsraps.

Espero eso ayude

Deviney
fuente
1

Agregar vertical-align: middle;al tdelemento que contiene el botón

<td style="vertical-align:middle;">  <--add this to center vertically
  <a href="#" class="btn btn-primary">
    <i class="icon-check icon-white"></i>
  </a>
</td>
Cuarenta y dos
fuente
1
Aquí está lo extraño. Si lo hago en línea, funciona. Si creo una clase y tengo la alineación vertical en eso, no funciona. Actualicé el jsfiddle para reflejar esto.
Tim Habersack
2
Mirándolo en el depurador, veo que la clase 'vert' está siendo anulada por bootstraps css. El estilo en línea tiene prioridad sobre css, por eso funciona.
Cuarenta y dos
@TimHabersack: He agregado una clase y está funcionando, solo úsala en su td.vertlugar .vert;)
Tom Sarduy
0

Entonces, ¿por qué td está configurado por defecto en vertical-align: top ;? Realmente no lo sé todavía. No me atrevería a tocarlo. En su lugar, agregue esto a su hoja de estilo. Altera los botones de las tablas.

table .btn{
  vertical-align: top;
}
Jens Alenius
fuente