Dopasowywanie kolumny tabeli Bootstrap do zawartości

85

Używam Bootstrap i rysuję tabelę. Kolumna znajdująca się najbardziej po prawej stronie ma przycisk i chcę, aby opadał do minimalnego rozmiaru potrzebnego do dopasowania do tego przycisku.

<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
<table class="table table-responsive">
        <tbody>
            <tr>
                <th>Name</th>
                <th>Payment Method</th>
                <th></th>
            </tr>
            <tr>
                <td>Bart Foo</td>
                <td>Visa</td>
                <td><a role="button" class="btn btn-default btn-xs" href="/Payments/View/NnrN_8tMB0CkVXt06nkrYg">View</a></td>
            </tr>
        </tbody>
    </table>

To renderuje się tak:

Przykład tabeli

Po podświetleniu firebug szerokość kolumny wyszła tak szeroka:

Szerokość kolumny

Ta kolumna skaluje się wraz ze stroną, podczas gdy strona znajduje się w większych dynamicznych trybach szerokości. Mam pewne wyobrażenie, jak bym to naprawić w czystym CSS, ale większość z tych podejść prawdopodobnie spowoduje problemy z wersjami witryny o małej szerokości.

Jak sprawić, by ta kolumna była rozwijana do szerokości jej zawartości?

(Jak zawsze - istniejące klasy bootstrap> czysty CSS> JavaScript)

Octopoid
źródło
Po opublikowaniu tego, właśnie pomyślałem - jeśli tylko wyrównuję tę kolumnę, myślę, że to mniej więcej to samo - jeśli inne kolumny mają w sobie wystarczającą ilość danych, aby potrzebować miejsca, i tak ją odzyskają. EDYCJA: Doh - to nie działa, gdy mam więcej niż jedną kolumnę, którą muszę obniżyć do minimalnego rozmiaru.
Octopoid
6
To prawda w przypadku układu, ale tabele są absolutnie dobre w przypadku danych tabelarycznych.
Octopoid
2
Zamiast tabel należy używać elementów div. Następnie możesz przypisać wartości procentowe dla ich szerokości, aby dopasować je do szerokości strony.
kw.
6
Tabel nie należy używać jako struktury . Możesz używać tabel do danych, które zwykle są umieszczane w tabelach. Octopoid nie używa tagu tabeli do struktury, jest on używany do wyświetlania danych. Jest to poprawne użycie tagu tabeli.
gewh

Odpowiedzi:

158

Utwórz klasę, która będzie dopasowywać szerokość komórek tabeli do zawartości

.table td.fit, 
.table th.fit {
    white-space: nowrap;
    width: 1%;
}
tmg
źródło
7
Gah - umieściłbym to w tdregule, a następnie zastosowałem to do th- to działa doskonale, dzięki. :) (Mam nadzieję, że nie masz nic przeciwko, dodałem również tę regułę do twojej odpowiedzi)
Octopoid
22

Testowane na Bootstrap 4.5 i 5.0

Żadne z rozwiązań nie działa dla mnie. PliktdOstatnia kolumna nadal zajmuje całą szerokość. Oto rozwiązanie działa.

Dodaj table-fitdo swojegotable

table.table-fit {
    width: auto !important;
    table-layout: auto !important;
}
table.table-fit thead th, table.table-fit tfoot th {
    width: auto !important;
}
table.table-fit tbody td, table.table-fit tfoot td {
    width: auto !important;
}

Oto jeden do sasszastosowań.

@mixin width {
    width: auto !important;
}

table {
    &.table-fit {
        @include width;
        table-layout: auto !important;
        thead th, tfoot th  {
            @include width;
        }
        tbody td, tfoot td {
            @include width;
        }
    }
}
Dexter
źródło
1
jest to jedyne rozwiązanie, które działa z bs4. Wielkie dzięki!
TheWiz
12

Trochę starego pytania, ale przyjechałem tutaj, szukając tego. Chciałem, żeby stół był jak najmniejszy i pasował do zawartości. Rozwiązaniem było po prostu ustawienie szerokości tabeli na dowolnie małą liczbę (na przykład 1 piksel). Stworzyłem nawet klasę CSS do obsługi tego:

.table-fit {
    width: 1px;
}

I używaj go w ten sposób:

<table class="table table-fit">

Przykład: JSFiddle

Pedro Walter
źródło
2
Pytanie dotyczy tylko niektórych kolumn tabeli, a nie wszystkich kolumn tabeli
GabiM
2
Tak, ale muszę znaleźć rozwiązanie mojego problemu, przybyłem tutaj. Wyjaśniłem to w mojej odpowiedzi.
Pedro Walter
2
To wciąż niewłaściwa i niepoprawna odpowiedź na to pytanie.
Maritim
8

Dodaj klasę natywną w-auto bootstrap 4 do elementu tabeli , a Twoja tabela dopasuje się do jej zawartości.

wprowadź opis obrazu tutaj

MERT DOĞAN
źródło
1
Ten działał dla mnie w Firefoksie i jest rzeczywistym rozwiązaniem Boostrap.
Paperduck
4

To rozwiązanie nie zawsze jest dobre. Ale mam tylko dwie kolumny i chcę, aby druga kolumna zajęła całe pozostałe miejsce. To zadziałało dla mnie

 <tr>
    <td class="text-nowrap">A</td>
    <td class="w-100">B</td>
 </tr>
Sameera K
źródło
1

W ten sposób możesz owinąć tabelę wokół znacznika DIV, ponieważ mi to też pomogło.

<div class="col-md-3">

<table>
</table>

</div>
Ahmad Habib
źródło
0

<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" />

<h5>Left</h5>
<table class="table table-responsive">
    <tbody>
        <tr>
            <th>Action</th>        
            <th>Name</th>
            <th>Payment Method</th>
        </tr>
        <tr>
            <td  style="width:1px; white-space:nowrap;">
                <a role="button" class="btn btn-default btn-xs" href="/Payments/View/NnrN_8tMB0CkVXt06nkrYg">View</a>
                <a role="button" class="btn btn-primary btn-xs" href="/Payments/View/NnrN_8tMB0CkVXt06nkrYg">Edit</a>
                <a role="button" class="btn btn-danger btn-xs" href="/Payments/View/NnrN_8tMB0CkVXt06nkrYg">Delete</a>                
            </td>        
            <td>Bart Foo</td>
            <td>Visa</td>
        </tr>
    </tbody>
</table>

<h5>Right</h5>

<table class="table table-responsive">
    <tbody>
        <tr>                    
            <th>Name</th>
            <th>Payment Method</th>
            <th>Action</th>            
        </tr>
        <tr>

            <td>Bart Foo</td>
            <td>Visa</td>
            <td  style="width:1px; white-space:nowrap;">
                <a role="button" class="btn btn-default btn-xs" href="/Payments/View/NnrN_8tMB0CkVXt06nkrYg">View</a>
                <a role="button" class="btn btn-primary btn-xs" href="/Payments/View/NnrN_8tMB0CkVXt06nkrYg">Edit</a>
                <a role="button" class="btn btn-danger btn-xs" href="/Payments/View/NnrN_8tMB0CkVXt06nkrYg">Delete</a>                
            </td>            
        </tr>
    </tbody>
</table>

antelove
źródło