Cols, colgroups и псевдокласс css :hover

Я пытаюсь создать таблицу для отображения ИМТ человека.

В рамках этого я хотел бы, чтобы на :hover также были выделены <tr> и <col> (или <colgroup>), чтобы пересечение было более очевидным.

Поскольку в таблице будут представлены как метрические, так и имперские измерения, :hover не должен останавливаться на ячейке (с любого направления) и, по сути, был бы бонусом, если бы он простирался от одной оси до другой. Я также использую тип документа XHTML 1.1 Strict, если это имеет значение?

Итак... пример (настоящая таблица... больше), но это должно быть репрезентативно:

<script>

tr:hover {background-color: #ffa; }

colgroup:hover,
col:hover {background-color: #ffa; }

</script>

...

<table>
    <col class="weight"></col><colgroup span="3"><col class="bmi"></col></colgroup>

    <tr>
        <th></th>
        <th>50kg</th>
        <th>55kg</th>
        <th>60kg</th>
    </tr>

    <tr>
        <td>160cm</td>
        <td>20</td>
        <td>21</td>
        <td>23</td>
    </tr>

    <tr>
        <td>165cm</td>
        <td>18</td>
        <td>20</td>
        <td>22</td>
    </tr>

    <tr>
        <td>170cm</td>
        <td>17</td>
        <td>19</td>
        <td>21</td>
    </tr>

</table>

Я прошу невозможного, нужно ли мне идти в сторону JQuery?


person David says reinstate Monica    schedule 11.05.2009    source источник


Ответы (5)


Вот чистый метод CSS, не использующий Javascript.

Я использовал псевдоэлементы ::before и ::after для выделения строк и столбцов. z-index сохраняет подсветку ниже <tds> на случай, если вам нужно обработать события щелчка. position: absolute позволяет им покинуть пределы <td>. overflow: hidden на <table> скрывает переполнение подсветки.

В этом не было необходимости, но я также заставил его выбирать только строку или столбец, когда вы находитесь в заголовках. Об этом позаботятся классы .row и .col. Если вы хотите упростить, вы можете удалить их.

Это работает во всех современных браузерах (и изящно деградирует в старых браузерах, ничего не делая).

Демонстрация: http://jsfiddle.net/ThinkingStiff/rUhCa/

Выход:

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

CSS:

table {
    border-spacing: 0;
    border-collapse: collapse;
    overflow: hidden;
    z-index: 1;
}

td, th, .row, .col {
    cursor: pointer;
    padding: 10px;
    position: relative;
}

td:hover::before,
.row:hover::before { 
    background-color: #ffa;
    content: '\00a0';  
    height: 100%;
    left: -5000px;
    position: absolute;  
    top: 0;
    width: 10000px;   
    z-index: -1;        
}

td:hover::after,
.col:hover::after { 
    background-color: #ffa;
    content: '\00a0';  
    height: 10000px;    
    left: 0;
    position: absolute;  
    top: -5000px;
    width: 100%;
    z-index: -1;        
}

HTML:

<table>
    <tr>
        <th></th>
        <th class="col">50kg</th>
        <th class="col">55kg</th>
        <th class="col">60kg</th>
        <th class="col">65kg</th>
        <th class="col">70kg</th>
    </tr>
    <tr>
        <th class="row">160cm</th>
        <td>20</td><td>21</td><td>23</td><td>25</td><td>27</td>
    </tr>
    <tr>
        <th class="row">165cm</th>
        <td>18</td><td>20</td><td>22</td><td>24</td><td>26</td>
    </tr>
    <tr>
        <th class="row">170cm</th>
        <td>17</td><td>19</td><td>21</td><td>23</td><td>25</td>
    </tr>
    <tr>
        <th class="row">175cm</th>
        <td>16</td><td>18</td><td>20</td><td>22</td><td>24</td>
    </tr>
</table>
person ThinkingStiff    schedule 24.06.2012
comment
Могу ли я ответить +1 и согласием? Вчера вечером я поиграл с псевдоэлементами ::before и ::after (когда вспомнил вопрос), но вполне мог заставить их работать так, как я хотел. Спасибо! знак равно - person David says reinstate Monica; 24.06.2012
comment
Фикс для firefox больше не нужен. - person fernandopasik; 26.08.2014
comment
Возможно, вам будет интересно узнать, что есть статья о CSS-трюках. который ссылается на ваш ответ здесь. - person Danield; 01.02.2015
comment
Это прекрасно работает во всех браузерах, которые я тестировал (IE9, IE11, FF, Chrome) - исправление FF больше не требуется :-) - person Niko; 17.02.2015
comment
Вы должны убедиться, что overflow:visible установлен на td! - person OzBarry; 23.09.2015
comment
этот подход не работает, если ‹td› имеет цвет фона. Кто-нибудь знает, что делать в таком случае? - person ioncreature; 02.06.2016

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

person Kezzer    schedule 11.05.2009
comment
Однако было бы неплохо иметь возможность использовать CSS так, как он должен — в моем воображении — можно было бы использовать? =) Я проверю JQuery, спасибо за это! - person David says reinstate Monica; 11.05.2009

AFAIK CSS Hover на TR в любом случае не поддерживается в IE, поэтому в лучшем случае часть TR будет работать только в Firefox.

Никогда даже не видел, чтобы :hover работал над col/colgroup, так что не уверен, что это возможно...

Подумайте, что вы можете застрять с реализацией Javascript.

Вот пример здесь, который работает (строки и столбцы) в Firefox, но снова не работает в IE ... столбцы не работают.

person Eoin Campbell    schedule 11.05.2009
comment
Это определенно соответствует моему опыту, если не совсем тому чуду, на которое я надеялся... =) - person David says reinstate Monica; 11.05.2009
comment
Зависит от типа документа и версии. ‹!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional//EN w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd› в любом случае работает в IE7. - person Kezzer; 11.05.2009
comment
Состояние :hover будет работать не только в Firefox, но и во всех других основных браузерах, отличных от IE (Opera, Konqueror, Safari и др.). - person Nick Presta; 11.05.2009

Я наткнулся на этот изящный способ сделать это на css-tricks.com Я также подготовил скрипку, пока возился с ней, ничего особенного, но вы можете понять, что это тот же код, что и на этой странице css-trick.

// HTML

<table>
    <colgroup></colgroup>
    <colgroup></colgroup>
    <colgroup></colgroup>
    <colgroup></colgroup>
    <colgroup></colgroup>
    <thead>
        <tr>
            <th></th>
            <th></th>
            <th></th>
            <th></th>
            <th></th>
        </tr>
    </thead>
    <tbody>
            <tr>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
            </tr>
            <tr>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
            </tr>
            <tr>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
            </tr>
        </tbody>
</table>

//Js

$(function(){
    $("table").delegate('td','mouseover mouseleave', function(e) {
        if (e.type == 'mouseover') {
          $(this).parent().addClass("hover");
          $("colgroup").eq($(this).index()).addClass("hover");
        }
        else {
          $(this).parent().removeClass("hover");
          $("colgroup").eq($(this).index()).removeClass("hover");
        }
    });
})

Посмотрите скрипт здесь

person Egli Becerra    schedule 16.10.2014

Живой ответ (https://jsfiddle.net/craig1123/d7105gLf/)

Уже есть ответы CSS и JQuery; однако я написал простой ответ на чистом javascript.

Сначала я нахожу все теги col и td, получаю индекс столбца каждой ячейки, выполняя element.cellIndex, а затем добавляю класс CSS с фоном на mouseenter и удаляю его на mouseleave.

HTML

<table id='table'>
  <col />
  <col />
  <col />
  <col />
  <thead>
    <tr>
      <th>Name</th>
      <th>Age</th>
      <th>Birthdate</th>
      <th>Preferred Hat Style</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Abraham Lincoln</td>
      <td>204</td>
      <td>February 12</td>
      <td>Stovepipe</td>
    </tr>
    <tr>
      <td>Winston Churchill</td>
      <td>139</td>
      <td>November 30</td>
      <td>Homburg</td>
    </tr>
    <tr>
      <td>Rob Glazebrook</td>
      <td>32</td>
      <td>August 6</td>
      <td>Flat Cap</td>
    </tr>
  </tbody>
</table>

CSS

body {
  font: 16px/1.5 Helvetica, Arial, sans-serif;
}

table {
  width: 80%;
  margin: 20px auto;
  border-collapse: collapse;
}
table th {
  text-align: left;
}
table tr, table col {
  transition: all .3s;
}
table tbody tr:hover {
  background-color: rgba(0, 140, 203, 0.2);
}
table col.hover {
  background-color: rgba(0, 140, 203, 0.2);
}
tr, col {
  transition: all .3s;
}
tbody tr:hover {
  background-color: rgba(0,140,203,.2);
}
col.hover {
  background-color: rgba(0,140,203,.2);
}

JS

const col = table.getElementsByTagName('col');
const td = document.getElementsByTagName('td');

const columnEnter = (i) => col[i].classList.add('hover');
const columnLeave = (i) => col[i].classList.remove('hover');

for (const cell of td) {
    const index = cell.cellIndex;
    cell.addEventListener('mouseenter', columnEnter.bind(this, index));
    cell.addEventListener('mouseleave', columnLeave.bind(this, index));
}

Вот скрипка

person Craig1123    schedule 07.03.2017