Позиция: липкий не работает в объединенной ячейке

Я хочу исправить первый и второй столбцы таблицы слева, когда таблица прокручивается по горизонтали. Я использовал position:sticky для фиксации колонны, и она отлично работает с обычными колоннами. Однако я объединил ячейки в своей таблице, и sticky не работает должным образом в этих объединенных ячейках.

Вот ссылка на репродукцию.

Может ли кто-нибудь любезно поделиться своим мнением о причине этой проблемы и предложить потенциальные решения для ее решения? Спасибо.

HTML, как показано ниже:

<div class = "container">
    <table style = "table-layout: fixed">
        <colgroup>
            <col width = "80" />
            <col width = "160" />
            <col width = "80" />
            <col width = "80" />
        </colgroup>
        <thead>
            <tr>
                <th class = "sticky">Id</th>
                <th class = "sticky sticky-tow">Name</th>
                <th>Age</th>
                <th>Sex</th>
                <th>Address</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td colspan = "5" class = "sticky">SEX: Male</td>
            </tr>

            <tr>
                <td class = "sticky">1</td>
                <td class = "sticky sticky-tow">John Doe</td>
                <td>25</td>
                <td>male</td>
                <td>123 Main St, Springfield, IL</td>
            </tr>
            <tr>
                <td class = "sticky">2</td>
                <td class = "sticky sticky-tow">John Doe</td>
                <td>25</td>
                <td>male</td>
                <td>123 Main St, Springfield, IL</td>
            </tr>
            <tr>
                <td class = "sticky">3</td>
                <td class = "sticky sticky-tow">John Doe</td>
                <td>25</td>
                <td>male</td>
                <td>123 Main St, Springfield, IL</td>
            </tr>

                        <tr>
                <td colspan = "5" class = "sticky">SEX: Female</td>
            </tr>

            <tr>
                <td class = "sticky">4</td>
                <td class = "sticky sticky-tow">John Doe</td>
                <td>25</td>
                <td>male</td>
                <td>123 Main St, Springfield, IL</td>
            </tr>
            <tr>
                <td class = "sticky">5</td>
                <td class = "sticky sticky-tow">John Doe</td>
                <td>25</td>
                <td>male</td>
                <td>123 Main St, Springfield, IL</td>
            </tr>
        </tbody>
    </table>
</div>

CSS, как показано ниже:

.container {
    margin: 0 auto;
    margin-top: 100px;
    width: 500px;
    overflow: auto;
    background-color: #fff;
}

table {
    width: 800px;
    border-collapse: collapse;
    border-spacing: 0;
    text-align: left;

    td,
    th {
        border-bottom: 1px solid #000;
        padding: 8px 12px 8px 16px;
    }

    .sticky {
        position: sticky;
        left: 0;
        z-index: 1;
        background-color: #fff;
    }

    .sticky-tow {
        left: 80px;
    }

    .sticky-tow::after {
        position: absolute;
        top: 0;
        right: 0;
        bottom: -1px;
        width: 15px;
        content: '';
        pointer-events: none;
        background-image: linear-gradient(
            to right,
            rgba(0, 0, 0, 0.08) 0%,
            rgba(0, 0, 0, 0) 100%
        );
    }
}

Я пытаюсь изменить colpan = "5" на colspan = "1" в объединенной ячейке, и sticky снова работает правильно.

Я ожидаю, что sticky будет нормально работать с объединенными ячейками.

Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
1
0
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Функция липкости хорошо работает даже с объединенными ячейками. Однако если строка имеет colspan, равный 5, она занимает всю ширину, что не позволяет прикреплённому поведению работать должным образом.

Чтобы решить эту проблему, вы можете уменьшить значение colspan до 2, совместив его с другими столбцами, и добавить пустой <td colspan = "3"></td>. Такой подход позволит липкому поведению работать должным образом, сохраняя при этом правильный макет.

Рабочий скриншот

body {
  background: #6e28d9;
  height: 100vh;
}

.container {
    margin: 0 auto;
    margin-top: 100px;
    width: 500px;
    overflow: auto;
    background-color: #fff;
}

table {
    width: 800px;
    border-collapse: collapse;
    border-spacing: 0;
    text-align: left;

    td,
    th {
        border-bottom: 1px solid #000;
        padding: 8px 12px 8px 16px;
    }

    .sticky {
        position: sticky;
        left: 0;
        z-index: 1;
        background-color: #fff;
    }

    .sticky-tow {
        left: 80px;
    }

    .sticky-tow::after {
        position: absolute;
        top: 0;
        right: 0;
        bottom: -1px;
        width: 15px;
        content: '';
        pointer-events: none;
        background-image: linear-gradient(
            to right,
            rgba(0, 0, 0, 0.08) 0%,
            rgba(0, 0, 0, 0) 100%
        );
    }
}
<!DOCTYPE html>
<html lang = "en">
  <head>
    <meta charset = "UTF-8" />
    <meta name = "viewport" content = "width=device-width, initial-scale=1.0" />
    <link rel = "stylesheet" href = "src/style.css" />
  </head>
  <body>
    <div class = "container">
      <table style = "table-layout: fixed">
        <colgroup>
          <col width = "80" />
          <col width = "160" />
          <col width = "80" />
          <col width = "80" />
        </colgroup>
        <thead>
          <tr>
            <th class = "sticky">Id</th>
            <th class = "sticky sticky-tow">Name</th>
            <th>Age</th>
            <th>Sex</th>
            <th>Address</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td colspan = "2" class = "sticky">SEX: Male</td>
            <td colspan = "3"></td>
          </tr>

          <tr>
            <td class = "sticky">1</td>
            <td class = "sticky sticky-tow">John Doe</td>
            <td>25</td>
            <td>male</td>
            <td>123 Main St, Springfield, IL</td>
          </tr>
          <tr>
            <td class = "sticky">2</td>
            <td class = "sticky sticky-tow">John Doe</td>
            <td>25</td>
            <td>male</td>
            <td>123 Main St, Springfield, IL</td>
          </tr>
          <tr>
            <td class = "sticky">3</td>
            <td class = "sticky sticky-tow">John Doe</td>
            <td>25</td>
            <td>male</td>
            <td>123 Main St, Springfield, IL</td>
          </tr>

          <tr>
            <td colspan = "2" class = "sticky">SEX: Female</td>
            <td colspan = "3"></td>
          </tr>

          <tr>
            <td class = "sticky">4</td>
            <td class = "sticky sticky-tow">John Doe</td>
            <td>25</td>
            <td>male</td>
            <td>123 Main St, Springfield, IL</td>
          </tr>
          <tr>
            <td class = "sticky">5</td>
            <td class = "sticky sticky-tow">John Doe</td>
            <td>25</td>
            <td>male</td>
            <td>123 Main St, Springfield, IL</td>
          </tr>
        </tbody>
      </table>
    </div>
  </body>
</html>

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

luichooy 14.08.2024 11:30

Я изменил пример кода в ссылке на воспроизведение, принимая во внимание ответ @Deepesh Jain, чтобы липкая ячейка слияния работала так, как ожидалось. Если у кого-то возникла такая же проблема, как у меня, вы можете просмотреть комментарии в разделе CSS примера кода и изменить ширину области прокрутки, чтобы увидеть изменение закрепленной ячейки.

luichooy 14.08.2024 11:58

Другие вопросы по теме