Разбить строку таблицы на несколько строк (адаптивный макет)

У меня есть веб-страница со списком предметов. В шаблоне по умолчанию для этого используется таблица, что я считаю очень подходящим. Однако в этой таблице есть один столбец, который содержит гораздо больше текста, чем другие:

введите описание изображения здесь

Хотя это работает на большом экране, читать на маленьком экране очень неприятно:

введите описание изображения здесь

Чтобы лучше использовать доступное пространство, я могу думать только о макете поддельной таблицы с использованием div. Я сделал прототип, используя макет сетки начальной загрузки, который выглядит как строка таблицы на больших экранах, но имеет другой макет на маленьких и очень маленьких экранах:

введите описание изображения здесь

Хотя это улучшает читаемость текста за счет использования полной ширины, я больше не могу использовать имеющиеся у меня утилиты для таблиц, и это незаметно нарушает работу пользователя. Например, я использую красивый скрипт, который позволяет выполнять сортировку на клиенте. Но это работает только на реальных таблицах. (Также есть небольшие несоответствия и визуальные различия между настоящими таблицами и поддельными таблицами)

Есть ли способ переформатировать строку таблицы в многострочный контейнер, подобный тому, который показан на последнем изображении?

К вашему сведению: я использую jquery 2.1.1, Bootstrap 3.2.0.1 в качестве GUI Framework и asp.net MVC на сервере.

Bootply здесь: http://www.bootply.com/pRehwTai4G

Изменить: в случае, если это не получилось достаточно ясным: я хочу сохранить теги <tr> и <td>, но стилизовать их так же, как div. Я не хочу заменять таблицу на div.


person DasKrümelmonster    schedule 20.08.2014    source источник
comment
если вы опубликуете сообщение о проблеме, у меня есть несколько идей; но ничего, что я могу сказать наверняка.   -  person Jordan.J.D    schedule 20.08.2014
comment
Как насчет этого: bootply.com/kA1JWPSFSz - вам нужно настроить CSS, но этот плагин сладкий   -  person Christina    schedule 21.08.2014


Ответы (3)


Вы можете взглянуть на таблицы с адаптивными данными. Если это не соответствует вашим потребностям, вы можете использовать JavaScript для воссоздания ваших табличных представлений как div. Это было бы проще всего, если бы вы могли получить данные таблицы в виде JSON, который можно было бы преобразовать либо в таблицы, либо в блоки div - в зависимости от разрешения. Если вы не можете использовать его как JSON, вы всегда можете использовать jQuery html () или text () для получения данных из ячеек таблицы и повторного рисования в div.

person Maciej Gurban    schedule 20.08.2014
comment
Просто примечание из более современных времен: я думаю, что этот ответ очень устарел со временем. Если вам нужны разные макеты на узких экранах, я бы сказал, что лучше делать их оба по отдельности и выбирать между ними на стороне клиента. Это работает даже с очень маленьким JS. Ответ, получивший наибольшее количество голосов, очень хорош из-за отсутствия JS, но переопределить tr кажется немного хакерским, и вы будете бороться с браузером, если хотите превратить строки таблицы в более удобные панели, чтобы иметь 1-n частей данных в строке ( как на последнем изображении в вопросе) - person DasKrümelmonster; 06.12.2020

Вы можете сделать это просто с помощью пары строк css ...

    @media all and (max-width:768px) {
        .calculator tr {    display: table;  width:100%;    }               
        .calculator td {    display: table-row; }           
    }

.calculator - это класс, используемый для таблицы:

<table class="calculator">

Я использую это, чтобы быстро изменить таблицу, которую я использую для входных данных калькулятора, для более разумного дизайна при просмотре с мобильного / настольного компьютера: живой пример здесь, хотя разница лучше всего видна на мобильном устройстве и настольном компьютере рядом друг с другом (не все мои мобильные скрипты доставляются в браузер настольного компьютера, поэтому общий дизайн может выглядеть странно, если вы просматриваете только через настольный браузер и сверните, но ячейки станут строками и т. д., чтобы проиллюстрировать).

Кроме того, вы можете добавить диапазон / метку и т. Д. В ячейку и сделать это

display:table-cell;

и сделайте таблицу блоком, если хотите, этот подход намного проще и устраняет необходимость использовать javascript.

person Pete - iCalculator    schedule 01.03.2017
comment
Лучший ответ здесь! - person Lev; 14.03.2017
comment
После попытки (и неудачи) решить проблему адаптивных таблиц с помощью bootstrap и flexbox, это решение спасло меня. - person raghav710; 18.04.2017
comment
Также заметил, что когда вы используете bootstrap, установка display: table-row приводит к уменьшению ‹td› масштабирования до размера содержимого. Если вы хотите отображать td полной ширины (например, строку): у меня работал блок - person raghav710; 18.04.2017
comment
Эффект начальной загрузки будет из-за настройки css, вы можете переопределить, применив дополнительный класс к таблице и настроив его таким образом, если это необходимо. - person Pete - iCalculator; 19.04.2017
comment
гениальное решение! - person Mohammad Mahroz; 30.03.2018

Если вы удалите тег thead из своей таблицы и свяжете th внутри tbody, вы можете использовать следующий jquery с кодом css для получения адаптивных таблиц:

HTML

<table class="table table-striped">
    <tbody>
        <tr>
            <th class="col-sm-1">Col 1
            </th>
            <th class="col-sm-2">Col 2
            </th>
            <th class="col-sm-6">Col 3
            </th>
            <th class="col-sm-1">Col 4
            </th>
            <th class="col-sm-1">Col 5
            </th>
            <th class="col-sm-1">Col 6
            </th>
        </tr>
        <tr>
            <td>ILK-AK Garching
            </td>
            <td>Einen guten Titel zu finden ist eigentlich eine Diskussion …
            </td>
            <td>Eine wunderbare Heiterkeit hat meine ganze Seele eingenommen, gleich den süßen Frühlingsmorgen, die ich mit ganzem Herzen genieße. Ich bin allein und…
            </td>
            <td>Niedrig
            </td>
            <td>
                <time datetime="2014-07-18T12:03:38.9570000">18.07.2014 12:03</time>
            </td>
            <td>
                <time datetime="2014-08-20T14:15:39.3830000">20.08.2014 14:15</time>
            </td>
        </tr>
        <tr>
            <td>ILK-AK Garching
            </td>
            <td>Zeta-Kafka ist, gleich einem Manifest, pompös und glorreich
            </td>
            <td>Jemand musste Josef K. verleumdet haben, denn ohne dass er etwas Böses getan hätte, wurde er eines Morgens verhaftet. »Wie ein Hund!« sagte er, es wa…
            </td>
            <td>Niedrig
            </td>
            <td>
                <time rel="timeago" datetime="2014-08-20T13:41:22.3500000">20.08.2014 13:41</time>
            </td>
            <td>
                <time rel="timeago" datetime="2014-08-20T14:16:39.8170000">20.08.2014 14:16</time>
            </td>
        </tr>
        <tr>
            <td>ILK-AK Garching
            </td>
            <td>Tests von mechanischen Apparaten sind grundsätzlich erwünsc…
            </td>
            <td>Er hörte leise Schritte hinter sich. Das bedeutete nichts Gutes. Wer würde ihm schon folgen, spät in der Nacht und dazu noch in dieser engen Gasse mi…
            </td>
            <td>Mittel
            </td>
            <td>
                <time datetime="2014-08-20T13:41:51.0870000">20.08.2014 13:41</time>
            </td>
            <td>
                <time datetime="2014-08-20T14:18:21.2200000">20.08.2014 14:18</time>
            </td>
        </tr>
    </tbody>
</table>

CSS

/* seo friendly tables */
 .div-table {
    display: table;
    /* Defines a Table */
    font-size: 14px;
    border-bottom: 1px solid #dddddd;
    color: #8d8d8d;
    margin: 0;
    width: 100%;
}
.table-container {
    display: table;
    width: 100%;
}
.table-head {
    display: table-header-group;
    /* Defines a table header group */
    font-weight: 600 !important;
    text-align: center;
    border: solid 1px #ddd;
    color: #333;
    background: rgb(242, 242, 242);
    font-size: inherit;
    vertical-align: middle;
}
.table-head .column {
    /* Column inside the table-head */
    background: #f2f2f2;
    color: #7d7d7d;
    border: solid 1px #ddd;
}
.table-row {
    display: table-row;
    /* Defines a table row */
    padding: 3px 6px;
    color: #333;
    border-collapse: collapse;
    text-align: center;
    vertical-align: middle;
}
.table-row .column:nth-child(1) {
    /* First column in a row */
    border-left: 1px solid #eeeeee;
}
.table-row:last-child .column {
    /* column in a last row */
    border-bottom: none;
}
.table-row:hover {
    background: #f9f9f9;
}
.column {
    display: table-cell;
    /* Defines a table cell */
    padding: 8px 3px;
    color: #333;
    border-bottom: 1px solid #eeeeee;
    border-right: 1px solid #eeeeee;
    vertical-align:middle;
}
/* Responsive table */
 @media all and (max-width:768px) {
    .div-table, .table-row, .column, .column:before {
        display: block;
        /* Converts a table, table row, table column and table column:before into a block element */
    }
    .div-table, .table-row .column:last-child {
        border-bottom: none;
    }
    .table-head {
        position: absolute;
        /* Hides table head but not using display none */
        top: -1000em;
        left: -1000em;
    }
    .table-row {
        border: 1px solid #eeeeee;
        margin: 20px 0;
    }
    .table-row .column {
        border-right:none;
        text-align: left;
    }
    .table-row .column:nth-child(1) {
        /* first column of the row */
        border-left: none;
        border-right: none;
    }
    .table-row .column:last-child {
        /* last column of the row */
        border-right: none;
    }
    .table-row:last-child .column, .column {
        /* Column in the last row and column */
        border-bottom: 1px solid #eeeeee;
    }
    .table-row:hover {
        background: #fff;
    }
    .column:before {
        /* prints the value of data-label attribute before the column data */
        font-weight: bold;
        padding-right: 20px;
        font-size: 12px;
        content:"" attr(data-label)"";
        /* call the attribute value of data-label and adds a string // */
    }
    .column:hover {
        background: #f9f9f9;
    }
}

Код jQuery

$(document).ready(function () {
    var gridClass = $('.table');
    // counts total number of td in a head so that we can can use it for label extraction
    var head_col_count = $(gridClass).find('tbody th').size();

    // loop which replaces td
    for (i = 0; i <= head_col_count; i++) {
        // head column label extraction
        var head_col_label = $(gridClass).find('tbody th:nth-child(' + i + ')').text();
        // replaces td with <div class="column" data-label="label">
        $(gridClass).find('tr td:nth-child(' + i + ')').replaceWith(function () {
            return $('<div class="column" data-label="' + head_col_label + '">').append($(this).contents());
        });
    }
    // replaces table with <div class="table">
    $(gridClass).replaceWith(function () {
        return $('<div class="div-table">').append($(this).contents());
    });

    // replaces thead with <div class="table-head">
    $('.div-table tbody tr:first-child').replaceWith(function () {
        return $('<div class="table-head">').append($(this).contents());
    });
    // replaces tbody with <div class="table-container">
    $('.div-table tbody').replaceWith(function () {
        return $('<div class="table-container">').append($(this).contents());
    });
    // replaces tr with <div class="table-row">
    $('.div-table tr').replaceWith(function () {
        return $('<div class="table-row">').append($(this).contents());
    });
    // replaces th with <div class="column">
    $('.div-table th').replaceWith(function () {
        return $('<div class="column">').append($(this).contents());
    });
});

Полноэкранную демонстрацию можно найти здесь. Jsfiddle.net отредактируйте ссылку.

Однако, если вы хотите использовать текущую разметку html, вам нужно немного изменить скрипт.

person Ravimallya    schedule 20.08.2014
comment
Хорошее решение этой OP. - person HPWD; 11.05.2017