Centralizar um botão verticalmente na célula da tabela, usando o Twitter Bootstrap

90

Estou usando o Twitter Bootstrap e tentando centralizar um botão em uma célula da tabela. Eu só preciso centralizá-lo 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>

Por favor, consulte meu JSFiddle para o problema. Eu tentei vários truques de centralização de mesa que conheço, mas nenhum parece funcionar corretamente. Alguma ideia? Desde já, obrigado.

ATUALIZAÇÃO: Sim, eu tentei vertical-align:middle;, e funciona se for embutido, mas não se estiver em uma classe que tdjá tenha. Atualizado o JSFiddle para refletir isso.

Atualização final: sou um idiota e não verifiquei se estava sendo substituído por bootstrap.css

Tim Habersack
fonte

Respostas:

157

PARA BOOTSTRAP 3.X:

O bootstrap agora tem o seguinte estilo para células de tabela:

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

O caminho a seguir é adicionar sua própria classe, adicionando mais especificidade ao seletor anterior:

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

Em seguida, adicione a classe ao seu tds:

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

PARA BOOTSTRAP 2.X

Não há como fazer isso com o Bootstrap.

Quando usado em células de tabela, o alinhamento vertical faz o que a maioria das pessoas espera, que é imitar o atributo valign (antigo, obsoleto). Em um navegador moderno e compatível com os padrões, os três snippets de código a seguir fazem a mesma coisa:

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

Verifique seu violino atualizado

Mais distante

Além disso, você não pode se referir à tdclasse usando .vertporque o Bootstrap já tem esta classe:

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

E está sobrecarregando a vertical-align: middleclasse in '.vert', então você deve definir essa classe como td.vert.

Tom Sarduy
fonte
Obrigado por criar um link para um jsfiddle atualizado. Eu não estava ciente ao fazer uma instrução de classe em css, e é específico da tabela, você tem que preceder o elemento da tabela antes do nome da classe. No seu exemplo, 'td.vcenter' funciona, mas se você alterá-lo apenas para '.vcenter', ele não funciona.
Tim Habersack
Obrigado =) Grt help sem usar css inline para consertar!
sk8terboi87 ツ
"vert-align" nunca foi documentado e não aparece no mestre do Bootstrap atual. Ao responder a essas perguntas, siga o comportamento documentado.
Dr. Jan-Philip Gehrcke
@ Jan-PhilipGehrcke: Não tenho certeza do que você quer dizer, mas não estou dizendo que vert-alignfaz parte do Bootstrap, estou falando sobre adicionar uma NOVA classe no arquivo css principal
Tom Sarduy
Desculpe, eu realmente deveria ter lido sua resposta com mais cuidado antes de fazer uma declaração tão forte.
Dr. Jan-Philip Gehrcke
43

Uma pequena atualização para o Bootstrap 3.

O bootstrap agora tem o seguinte estilo para células de tabela:

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

O jeito de fazer isso é adicionar uma classe sua, com o mesmo seletor:

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

E então adicione-o aos seus tds

<td class="vert-align"></td>
Gabriel G. Roy
fonte
1
A mudança está oficialmente documentada?
usuário
14

adicione isso ao seu css

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

em seguida, adicione à classe à sua mesa:

        <table class="table table-hover table-striped table-vcenter">
Andrew
fonte
3
Eu gosto deste porque você só precisa adicionar a classe em um lugar, em vez de adicioná-la em todos td.
Hugo Sousa
2

Para corrigir isso, coloquei essa aula na página da web

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

e isso no meu TemplateField

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

pois a classe CSS aponta diretamente para o elemento td (tabledata) e tem a instrução! important no final de cada configuração. Irá sobrepor as configurações de classes CSS das regras de inicialização.

Espero que ajude

Deviney
fonte
1

Adicione vertical-align: middle;ao tdelemento que contém o botão

<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>
Quarenta e dois
fonte
1
Aqui está o estranho. Se eu fizer inline, funciona. Se eu criar uma classe e tiver o alinhamento vertical nela, não funcionará. Eu atualizei o jsfiddle para refletir isso.
Tim Habersack
2
Olhando para ele no depurador, vejo que a classe 'vert' está sendo substituída por bootstraps css. O estilo embutido tem precedência sobre o css, por isso funciona.
Quarenta e Dois
@TimHabersack: Eu adicionei uma classe e está funcionando, basta usar em seu td.vertlugar .vert;)
Tom Sarduy
0

Então, por que o padrão td está definido como alinhamento vertical: top ;? Eu realmente não sei disso ainda. Eu não ousaria tocá-lo. Em vez disso, adicione isso à sua folha de estilo. Altera os botões nas tabelas.

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