Липкая колонка создает контекст штабелирования

#css #z-index #sticky

Вопрос:

У меня есть таблица с липким столбцом. Когда я просматриваю эту таблицу в 3D-средстве просмотра, я вижу, что каждый столбец имеет более высокий z-индекс, чем предыдущий столбец. Поэтому, когда я хочу использовать выпадающий список в этом столбце, он всегда закрывается столбцом в следующей строке.

 td {
  white-space: nowrap;
}

.fixed-column {
  position: fixed;
  right: 0;
  background-color: white;
  padding: .5rem;
}

.dropdown-menu {
  position: fixed;
  right: 0;
  background: #0080ff;
} 
 <table>
  <thead>
    <tr>
      <th>Col 1</th>
      <th>Col 2</th>
      <th>Col 3</th>
      <th>Col 4</th>
      <th>Col 5</th>
      <th>Col 6</th>
      <th>Col 7</th>
      <th>Col 8</th>
      <th>Col 9</th>
      <th class="fixed-column">Col 10</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Cell 1 content with a lot of text ...</td>
      <td>Cell 2 content with a lot of text ...</td>
      <td>Cell 3 content with a lot of text ...</td>
      <td>Cell 4 content with a lot of text ...</td>
      <td>Cell 5 content with a lot of text ...</td>
      <td>Cell 6 content with a lot of text ...</td>
      <td>Cell 7 content with a lot of text ...</td>
      <td>Cell 8 content with a lot of text ...</td>
      <td>Cell 9 content with a lot of text ...</td>
      <td class="fixed-column">
        <button type="button">Menu</button>
        <div class="dropdown-menu">
          <ul>
            <li>Option 1</li>
            <li>Option 2</li>
            <li>Option 3</li>
            <li>Option 4</li>
            <li>Option 5</li>
            <li>Option 6</li>
          </ul>
        </div>
      </td>
    </tr>
    <!-- ... -->
  </tbody>
</table> 

Вот plnkr с примером: http://plnkr.co/plunk/CqqeSWIQrSsSVJB3

Здесь вы можете увидеть скриншот программы просмотра 3d: введите описание изображения здесь

Есть ли какой-либо способ запретить браузеру складывать все эти липкие ячейки по оси z, чтобы выпадающее меню (синий div-контейнер) отображалось поверх всех этих ячеек?

Комментарии:

1. итак, чего вы действительно хотите и как вы хотите, чтобы выглядела ваша страница ….пожалуйста, будьте конкретны

2. Я хочу, чтобы выпадающее меню было поверх всех этих липких ячеек

3. Пожалуйста, обновите свой вопрос, чтобы четко продемонстрировать «» Итак, когда я хочу использовать раскрывающийся список в этом столбце » Какой раскрывающийся список, я не вижу раскрывающегося списка/элемента выбора? Какой столбец конкретно, тот, который у вас есть как «липкий?> (похоже, что это должно быть НЕ в столбце таблицы, а в отдельном элементе, установленном на вашей странице за пределами таблицы. Вы имеете в виду, что когда вы добавляете больше строк, проблема существует/проявляется здесь? ЕСЛИ в этом суть проблемы, вам нужно больше строк, чтобы более четко проиллюстрировать это нежелательное поведение в вашем вопросе.

4. Ладно, я просто упростил это в качестве примера. В каждой строке таблицы должно быть меню для различных действий в этой строке (показать более подробную информацию, отредактировать, удалить и так далее). Мое выпадающее меню-это не элемент выбора, это веб-компонент, который в своей простейшей форме имеет кнопку и div-контейнер. Div-контейнер динамически позиционируется с положением: фиксировано. Я воспроизвел поведение с элементом с именем класса «.выпадающее меню». Проблема в том, что div-контейнер не полностью виден, потому что липкий td-элемент следующей строки находится поверх него и закрывает раскрывающийся элемент.

Ответ №1:

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

 td {
  white-space: nowrap;
}

.fixed-column {
  position: fixed;
  right: 0;
  background-color: white;
  padding: .5rem;
}

.dropdown-menu {
  position: fixed;
  right: 0;
  background: #0080ff;
}

.withmenu {
  z-index: 1;
} 
 <table>
  <thead>
    <tr>
      <th>Col 1</th>
      <th>Col 2</th>
      <th>Col 3</th>
      <th>Col 4</th>
      <th>Col 5</th>
      <th>Col 6</th>
      <th>Col 7</th>
      <th>Col 8</th>
      <th>Col 9</th>
      <th class="fixed-column">Col 10</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Cell 1 content with a lot of text ...</td>
      <td>Cell 2 content with a lot of text ...</td>
      <td>Cell 3 content with a lot of text ...</td>
      <td>Cell 4 content with a lot of text ...</td>
      <td>Cell 5 content with a lot of text ...</td>
      <td>Cell 6 content with a lot of text ...</td>
      <td>Cell 7 content with a lot of text ...</td>
      <td>Cell 8 content with a lot of text ...</td>
      <td>Cell 9 content with a lot of text ...</td>
      <td class="fixed-column withmenu">
        <button type="button">Menu</button>
        <div class="dropdown-menu">
          <ul>
            <li>Option 1</li>
            <li>Option 2</li>
            <li>Option 3</li>
            <li>Option 4</li>
            <li>Option 5</li>
            <li>Option 6</li>
          </ul>
        </div>
      </td>
    </tr>
    <tr>
      <td>Cell 1 content with a lot of text ...</td>
      <td>Cell 2 content with a lot of text ...</td>
      <td>Cell 3 content with a lot of text ...</td>
      <td>Cell 4 content with a lot of text ...</td>
      <td>Cell 5 content with a lot of text ...</td>
      <td>Cell 6 content with a lot of text ...</td>
      <td>Cell 7 content with a lot of text ...</td>
      <td>Cell 8 content with a lot of text ...</td>
      <td>Cell 9 content with a lot of text ...</td>
      <td class="fixed-column">
        <button type="button">Menu</button>
      </td>
    </tr>
    <tr>
      <td>Cell 1 content with a lot of text ...</td>
      <td>Cell 2 content with a lot of text ...</td>
      <td>Cell 3 content with a lot of text ...</td>
      <td>Cell 4 content with a lot of text ...</td>
      <td>Cell 5 content with a lot of text ...</td>
      <td>Cell 6 content with a lot of text ...</td>
      <td>Cell 7 content with a lot of text ...</td>
      <td>Cell 8 content with a lot of text ...</td>
      <td>Cell 9 content with a lot of text ...</td>
      <td class="fixed-column">
        <button type="button">Menu</button>
      </td>
    </tr>
    <tr>
      <td>Cell 1 content with a lot of text ...</td>
      <td>Cell 2 content with a lot of text ...</td>
      <td>Cell 3 content with a lot of text ...</td>
      <td>Cell 4 content with a lot of text ...</td>
      <td>Cell 5 content with a lot of text ...</td>
      <td>Cell 6 content with a lot of text ...</td>
      <td>Cell 7 content with a lot of text ...</td>
      <td>Cell 8 content with a lot of text ...</td>
      <td>Cell 9 content with a lot of text ...</td>
      <td class="fixed-column">
        <button type="button">Menu</button>
      </td>
    </tr>
    <tr>
      <td>Cell 1 content with a lot of text ...</td>
      <td>Cell 2 content with a lot of text ...</td>
      <td>Cell 3 content with a lot of text ...</td>
      <td>Cell 4 content with a lot of text ...</td>
      <td>Cell 5 content with a lot of text ...</td>
      <td>Cell 6 content with a lot of text ...</td>
      <td>Cell 7 content with a lot of text ...</td>
      <td>Cell 8 content with a lot of text ...</td>
      <td>Cell 9 content with a lot of text ...</td>
      <td class="fixed-column">
        <button type="button">Menu</button>
      </td>
    </tr>
    <tr>
      <td>Cell 1 content with a lot of text ...</td>
      <td>Cell 2 content with a lot of text ...</td>
      <td>Cell 3 content with a lot of text ...</td>
      <td>Cell 4 content with a lot of text ...</td>
      <td>Cell 5 content with a lot of text ...</td>
      <td>Cell 6 content with a lot of text ...</td>
      <td>Cell 7 content with a lot of text ...</td>
      <td>Cell 8 content with a lot of text ...</td>
      <td>Cell 9 content with a lot of text ...</td>
      <td class="fixed-column">
        <button type="button">Menu</button>
      </td>
    </tr>
    <tr>
      <td>Cell 1 content with a lot of text ...</td>
      <td>Cell 2 content with a lot of text ...</td>
      <td>Cell 3 content with a lot of text ...</td>
      <td>Cell 4 content with a lot of text ...</td>
      <td>Cell 5 content with a lot of text ...</td>
      <td>Cell 6 content with a lot of text ...</td>
      <td>Cell 7 content with a lot of text ...</td>
      <td>Cell 8 content with a lot of text ...</td>
      <td>Cell 9 content with a lot of text ...</td>
      <td class="fixed-column">
        <button type="button">Menu</button>
      </td>
    </tr>
    <tr>
      <td>Cell 1 content with a lot of text ...</td>
      <td>Cell 2 content with a lot of text ...</td>
      <td>Cell 3 content with a lot of text ...</td>
      <td>Cell 4 content with a lot of text ...</td>
      <td>Cell 5 content with a lot of text ...</td>
      <td>Cell 6 content with a lot of text ...</td>
      <td>Cell 7 content with a lot of text ...</td>
      <td>Cell 8 content with a lot of text ...</td>
      <td>Cell 9 content with a lot of text ...</td>
      <td class="fixed-column">
        <button type="button">Menu</button>
      </td>
    </tr>
  </tbody>
</table> 

Другим решением было бы вынуть меню из <td> и присвоить ему z-индекс, но тогда для этого потребуется динамическое позиционирование… Так что лучшего решения не найти.