Сделать ссылку в ячейке таблицы заполнять всю высоту строки

У меня есть таблица данных, и каждая ячейка является ссылкой. Я хочу, чтобы пользователь мог щелкнуть в любом месте ячейки таблицы и заставить их следовать по ссылке. Иногда ячейки таблицы имеют более одной строки, но не всегда. Я использую td a {display: block}, чтобы получить ссылку на большую часть ячейки. Когда есть одна ячейка в строке, которая представляет собой две строки, а остальные - только одна строка, одни вкладыши не заполняют все вертикальное пространство строки таблицы. Вот пример HTML, и вы можете увидеть его в действии здесь http://www.jsfiddle.net/RXHuE/:

<head>
<style type="text/css">
  td {width: 200px}
  td a {display: block; height:100%; width:100%;}
  td a:hover {background-color: yellow;}
</style>
<title></title>
</head>
<body>
<table>
  <tbody>
    <tr>
      <td>
        <a href="#" onclick="location.href='http://www.google.com/'; return false;">Cell 1<br>
        second line</a>
      </td>
      <td>
        <a href="#" onclick="location.href='http://www.google.com/'; return false;">Cell 2</a>
      </td>
      <td>
        <a href="#" onclick="location.href='http://www.google.com/'; return false;">Cell 3</a>
      </td>
      <td>
        <a href="#" onclick="location.href='http://www.google.com/'; return false;">Cell 4</a>
      </td>
    </tr>
  </tbody>
</table>
</body>

Ответ 1

Вам нужно небольшое изменение в CSS. Создание td height:100%; работает для IE 8 и FF 3.6, но оно не работает для Chrome.

td {
  width: 200px;
  border: solid 1px green;
  height: 100%
}
td a {
  display: block;
  height:100%;
  width:100%;
}

Но создание height в 50px работает для Chrome в дополнение к IE и FF

td {
  width: 200px;
  border: solid 1px green;
  height: 50px
}
td a {
  display: block;
  height:100%;
  width:100%;
}

Edit:

Вы сами дали решение в другом посте; который должен использовать display: inline-block;. Это работает в сочетании с моим решением для Chrome, FF3.6, IE8

td {
  width: 200px;
  border: solid 1px green;
  height: 100%}
td a {
  display: inline-block;
  height:100%;
  width:100%;
}

Обновление

Следующий код работает для меня в IE8, FF3.6 и chrome.

CSS

td {
  width: 200px;
  border: solid 1px green;
  height: 100%;
}
td a {
  display: inline-block;
  height:100%;
  width:100%;
}
td a:hover {
  background-color: yellow;
}

HTML

<table>
  <tbody>
    <tr>
      <td>
        <a href="http://www.google.com/">Cell 1<br>
        second line</a>
      </td>
      <td>
        <a href="http://www.google.com/">Cell 2</a>
      </td>
      <td>
        <a href="http://www.google.com/">Cell 3</a>
      </td>
      <td>
        <a href="http://www.google.com/">Cell 4</a>
      </td>
    </tr>
  </tbody>
</table>

В примере представлен здесь

Ответ 2

Задайте произвольно большой отрицательный запас и равное дополнение к элементу блока и переполнение, скрытое от родителя.

td {
    overflow: hidden;
}
td a {
    display: block;
    margin: -10em;
    padding: 10em;
}

http://jsfiddle.net/RXHuE/213/

Ответ 3

После взлома работ [Протестировано в Chrome/Firefox/Safari] Имейте то же самое дополнение для td и элементов привязки. А для якоря также есть маржа, которая равна -ve значения заполнения.

HTML

<table>
    <tr>
        <td><a>Hello</a></td>
    </tr>
</table>

CSS

td {                          
    background-color: yellow;                                                                              
    padding: 10px;                                                                                                            
}  
a {
    cursor:pointer;
    display:block;
    padding: 10px;
    margin: -10px;
}

Рабочий скрипт: http://jsfiddle.net/JasYz/

Ответ 4

Немного поздно вечеринке, но там есть хорошее решение, которое я только что обнаружил.

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

Измените ячейку таблицы (<td>), чтобы она была position: relative;, и создайте псевдо-элемент ::before или ::after в теге <a> и установите его на position: absolute;, а также используйте top: 0; left: 0; right: 0; bottom: 0;.

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

Например

HTML:

<table>
  <tr>
    <td>
      <a>I'm centralised</a>
    </td>
    <td>
      <a>I'm 100% width</a>
    </td>
    <td>
      <a>AND I'm 100% height</a>
    </td>
    <td>
      <a>WITHOUT extra markup</a>
    </td>
    <td>
      <a>OR JavaScript!</a>
    </td>
  </tr>
</table>

CSS

table {
  border-collapse: collapse;
  table-layout: fixed;
}
td {
  position: relative;
  width: 150px;
  border: 2px solid red;
}
td a {
  padding: 0.5em 1em;
}
td a::after {
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
}

Надеюсь, это поможет!

Ответ 5

Попробуйте display: block:

td a {display: block; height:100%;}

[EDIT] WTF... Я могу подтвердить, что это не работает в FF 4 и Chrome. Это работает:

td a {display: block;  height: 2.5em; border: 1px solid red;}

Это говорит о том, что height:100%; не определен в ячейке таблицы. Возможно, это связано с тем, что ячейка получает свой размер из контента (поэтому контент не может сказать "скажите мне ваш размер", потому что это приведет к циклу). Это даже не работает, если вы устанавливаете высоту для таких ячеек:

td {width: 200px; height: 3em; padding: 0px}

Снова код выше не будет выполнен. Поэтому мое предложение состоит в том, чтобы использовать определенную высоту для ссылок (вы можете опустить ширину, то есть 100% по умолчанию для элементов блока).

[EDIT2] Я просмотрел сто примеров в http://www.cssplay.co.uk/menus/, но ни один из них не смешивает однострочные и многострочные ячейки. Похоже, вы попали в мертвое место.

Ответ 6

Я отправлю тот же ответ здесь, как я сделал на мой собственный вопрос.

Вдохновленный Jannis M answer, я сделал следующее:

$(document).ready(function(){    
    $('table tr').each(function(){
        var $row = $(this);
        var height = $row.height();
        $row.find('a').css('height', height).append('&nbsp;');  
    });       
});

Я добавил &nbsp;, так как пустые ссылки (не содержащие текстовые узлы) не могут быть написаны (?).

См. мой обновленный fiddle.

Ответ 7

Вы можете использовать небольшой javascript.

  <td onclick="window.location='http://www.google.com/'">
    <a href="http://www.google.com/">Cell 3</a>
  </td>

Или вы можете создать элемент, который полностью заполняет ячейку (div, span, whatever) и обертывает вокруг вашего большого невидимого элемента.

  <td>
    <a href="http://www.google.com/">
      <div style="width:100%; height:100%;">Cell 1<br>
      second line
      </div>
    </a>
  </td>

Ответ 8

Проблема только в том, что использование display: block заставляет браузер игнорировать вертикальный align: center...

упс.

Я присягнул, чтобы он выглядел правильно для одной ячейки с высотой: 60 и шрифтом, который занимал 20 пикселей, добавляя br... Тогда я понял, что у меня есть некоторые элементы с текстом из 2 строк. Dang.

В итоге я использовал javascript. Javascript не дает приятного мышиного заостренного элемента clicker, но строка текста делает, поэтому он фактически вызовет визуальный ответ, а не где я хочу... Затем Javascript поймает все клики, которые "пропущены" 'фактический href.

Возможно, это не самое элегантное решение, но на данный момент оно достаточно хорошо работает.

Теперь, если бы я мог только выяснить, как это сделать правильно...

Любые идеи о том, как добавить значок мыши в ручную для области, охватываемой onclick? Прямо сейчас, щелчок на странице работает, но значок изменяется только тогда, когда он попадает в href, который влияет только на текст.

Ответ 9

Почему бы вам просто не избавиться от altogheter <a> и добавить onClick в <td> напрямую?

<head>
<style type="text/css">
td {
    text-align:center;
}
td:hover {
    cursor:pointer;
    color:#F00;
}
</style>
<title></title>
</head>
<body>
<table>
    <tbody>
        <tr>
            <td onclick="location.href='http://www.google.com/';">Cell 1<br />second line</td>
            <td onclick="location.href='http://www.google.com/';">Cell 2</a></td>
            <td onclick="location.href='http://www.google.com/';">Cell 3</td>
            <td onclick="location.href='www.google.com';">Cell 4</td>
        </tr>
    </tbody>
</table>

Таким образом вы вырезаете среднего человека.

PS: Я знаю, что это спросили и ответили много лет назад, но ни один из ответов выше не решил проблему в моем случае. Надеюсь, это поможет кому-то.

Ответ 10

Для меня единственным решением является замена <table> <tr> на <div> и стиль их использования с помощью display:table и display:table-row соответственно.

Затем вы можете заменить <td> на <a> и стилизовать его с помощью display:table-cell.

Работайте идеально даже при изменении высоты содержимого <td>.

так что оригинальный html без якорей:

<table>
  <tr>
    <td>content1<br>another_line</td>
    <td>content2</td>
  </tr>
</table>

теперь становится:

a:hover
{
  background-color:#ccc;
}
    <div style="display:table; width:100%">
      <div  style="display:table-row">
        <a href="#" style="display:table-cell; border:solid 1px #f00">content1<br>another_line</a>
        <a href="#" style="display:table-cell; border:solid 1px #f00">content2</a>
      </div>
    </div>