Таблица рядов Box-Shadow на Hover (Webkit) - PullRequest
15 голосов
/ 12 мая 2011

Возможно ли это?

Мой код работает на Firefox. Я также могу заставить webkit изменять другие свойства (например, цвет фона и т. Д.) При наведении, но тень от поля не действует:

tr:hover {
    -webkit-box-shadow: 0px 2px 4px #e06547;
    -moz-box-shadow: 0px 2px 4px #e06547;
    box-shadow: 0px 2px 4px #e06547;
    background-color: #d4d5d6;
}

Ответы [ 7 ]

22 голосов
/ 12 июня 2012

Как ответили здесь: https://stackoverflow.com/a/11002077/1106393 вместо стилизации tr вы должны стилизовать td -элемент в сочетании с псевдоклассами :first-child и :last-child.Предварительный tr:hover поможет вам:

tr:hover td {
    -moz-box-shadow: 0 4px 2px -3px rgba(0, 0, 0, 0.5) inset;
    -webkit-box-shadow: 0 4px 2px -3px rgba(0, 0, 0, 0.5) inset;
    box-shadow: 0 4px 2px -3px rgba(0, 0, 0, 0.5) inset;
}
tr:hover td:first-child {
    -moz-box-shadow: 4px 4px 2px -3px rgba(0, 0, 0, 0.5) inset;
    -webkit-box-shadow: 4px 4px 2px -3px rgba(0, 0, 0, 0.5) inset;
    box-shadow: 4px 4px 2px -3px rgba(0, 0, 0, 0.5) inset;
}
tr:hover td:last-child {
    -moz-box-shadow: 0 4px 2px -3px rgba(0, 0, 0, 0.5) inset;
    -webkit-box-shadow: 0 4px 2px -3px rgba(0, 0, 0, 0.5) inset;
    box-shadow: 0 4px 2px -3px rgba(0, 0, 0, 0.5) inset;
}

Демо 1 со вставкой: http://jsfiddle.net/Kk6Th/

Обновление:
Демо 2 без вставки (классическая тень): http://jsfiddle.net/2nw4t/1/
Демонстрация 3 без вставки ( свечение эффект): http://jsfiddle.net/2CSuM/

1 голос
/ 14 августа 2018

Недавно я столкнулся с этим постом, когда имел дело с подобной проблемой.Я думаю, что нашел другой подход, использующий свойства display: flex; вместе с position: relative; для вашего элемента tr в CSS с гораздо меньшей разметкой (немного стилей td и меньше стилей psuedo):

Setup tr как flexbox

tr {
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    position: relative;
    align-items: center; /* Vertically aligns td's inside the tr */        
}

Это устанавливает TR как flexbox, что позволяет ему воздействовать на z-index, не нарушая его положение в DOM.Все, что вам нужно, это настроить z-index псевдоэлемента tr:hover и добавить ваши background-color и box-shadow эффекты:

Настройка :hover Эффекты

tr:hover {
    z-index: 1 /* or higher if necessary */
    -webkit-box-shadow: 0px 2px 4px #e06547;
    -moz-box-shadow: 0px 2px 4px #e06547;
    box-shadow: 0px 2px 4px #e06547;
    background-color: #d4d5d6;
}

Возможно, вам придется настроить размер и положение элементов td внутри flexbox tr с помощью align-items, поскольку мы больше не используем свойство tr по умолчанию display: table-row.Вы бы центрировали свои элементы td по вертикали, используя свойство thr align-items: center; (см. Выше).Затем вы устанавливаете свою ширину td

td {
    width: 10em;
}

См. Рабочую скрипку здесь: https://jsfiddle.net/t68b9cwd/6/

Это решение является довольно универсальным, с современными браузерами, обрабатывающими это без префиксов, но они могут быть экземплярами со старымибраузеры, которые могут вам понадобиться для обходных путей (https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Flexible_Box_Layout/Backwards_Compatibility_of_Flexbox), и аналогично тому, как Google стилизует строки в Gmail.

1 голос
/ 27 декабря 2017

Используйте свойство transform scale (1,1) с box-shadow, это решит проблему.

tr:hover {
  transform: scale(1);
  -webkit-transform: scale(1);
  -moz-transform: scale(1);
  box-shadow: 0px 0px 5px rgba(0,0,0,0.3);
  -webkit-box-shadow: 0px 0px 5px rgba(0,0,0,0.3);
  -moz-box-shadow: 0px 0px 5px rgba(0,0,0,0.3);
}

Fiddle: https://jsfiddle.net/ampicx/5p91xr48/

Спасибо!!

1 голос
/ 22 апреля 2016

Я столкнулся с этой проблемой и нашел несколько обходных путей:

  1. Добавить тень на все td.
  2. Установить display: block на tr.
  3. Используйте правильно стилизованный td:first-child:before.
  4. Добавьте тень ко всем td и закройте части, которые нам не нужны.

Вы можете проверить их на этом jsFiddle: https://jsfiddle.net/maskl/cxscmvpr/3/

0 голосов
/ 03 октября 2014

Решение AvL очень хорошее, спасибо за совет. Хотя если вы, как и я, хотите, чтобы box-shadow (inset) в целом tr , а не только его сторона, этот код должен помочь вам:

tr:hover td {
    -webkit-box-shadow: 0 4px 2px -3px rgba(0, 0, 0, 0.5) inset, 0 -4px 2px -3px rgba(0, 0, 0, 0.5) inset;
}
tr:hover td:first-child {
    -webkit-box-shadow: 4px 4px 2px -3px rgba(0, 0, 0, 0.5) inset, 4px -4px 2px -3px rgba(0, 0, 0, 0.5) inset;
}
tr:hover td:last-child {
    -webkit-box-shadow: -4px 4px 2px -3px rgba(0, 0, 0, 0.5) inset, -4px -4px 2px -3px rgba(0, 0, 0, 0.5) inset;
}
0 голосов
/ 29 мая 2012

Это случилось со мной, и я наложил на него какой-то незначительный радиус границы, и он работает.

border-radius: 1px;

В зависимости от вида, который вы пытаетесь достичь, это может быть хак, который вы можете использовать.

0 голосов
/ 30 июня 2011

Добавьте это

tr {
    display: block;
}

По какой-то причине Webkit должен явно знать, что элемент является блочным элементом для отображения тени блока.

...