テーブルでセル全体をリンクする方法(上下中央揃えやセルの高さの変化にも対応版)
テーブルのセル内にテキストリンクを設置したときに、リンクテキストだけでなくセル全体がクリックできるようにしたいことってありますよね。
セル全体をクリック範囲にする方法は検索すると山ほど出てくるのですが、僕の検索の仕方が悪いのか
- セルの高さに合わせて調整が必要
- 上下中央揃えのことを考えていない
というように汎用性がイマイチな方法ばかりでした。「もうちょっと何とかならんのか?」と考えたのでその方法をご紹介します。
やりたいこと
リンクを設置したtd
にclass="cell-class"
を指定するだけで高さが変わっても上下中央+セル全体がリンクになります。
テキストだけがリンク! | セル全体がリンクだぞ! |
改行を入れて2行分 の高さになったセル |
上下中央+セル全体がリンク |
改行を入れて 3行文になっても 自動的に対応 |
上下中央+セル全体がリンク |
HTMLとCSSのソース
<table> <tbody> <tr> <td> <a href="https://alive-website.com/notebook">テキストだけがリンク!</a> </td> <td class="cell-link"> <a href="https://alive-website.com/notebook">セル全体がリンクだぞ!</a> </td> </tr> <tr> <td> 改行を入れて2行分 の高さになったセル </td> <td class="cell-link"> <a href="https://alive-website.com/notebook">上下中央+セル全体がリンク</a> </td> </tr> <tr> <td> 改行を入れて 3行文になっても 自動的に対応 </td> <td class="cell-link"> <a href="https://alive-website.com/notebook">上下中央+セル全体がリンク</a> </td> </tr> </tbody> </table>
.cell-link { padding: 0; height: 0; } .cell-link a{ height: 100%; width: 100%; padding: 2px 5px; display: flex; align-items: center; justify-content:center; }
CSSの解説
まず、.cell-link の方から説明していきます。これはth
やtd
といったセル要素に適用されます。
多くのテーマやテンプレートではth
やtd
タグには余白が設定されているケースが多いのでそれを0にします。そうしないとクリック範囲がセル内一杯に広がりません。最初からpaddingがないテーマでは不要です。
2行目のheight:0;
がこの記事の超重要ポイントです。
セル範囲を広げるにはa
タグにdisplay:block
やdisplay:flex
を指定しますが、なぜかtd
やth
タグの高さを数値指定しないとa
タグの高さがセル内一杯に広がりません。さらに100%とかはダメでpxを使った具体的な数値で指定する必要があります。
th
やtd
タグに高さを指定しない場合、a
タグのline-heightやpaddingを調整して高さをセルに合わせれば対応できまが、それを毎回やるのは面倒くさいですよね。
一方で、セルの高さを毎回数値設定するのも面倒くさいです。
幸いなことに、
- セルの高さにどんな数であれ数値さえ指定しておけばa要素はセル内一杯に広がる
- セルの高さは内容によって強制的に広がる
という仕様のようなので、セルの高さに任意の数値を設定しておけばOKとなります。
できるだけ汎用性を高くすることを考えると、セル内にどんなに小さなものが来ても対応できるように0としました。
次にa
タグのスタイルです。
ネットで調べるとdisplay:block
としている記事が非常に多いのですがこれだと上下中央揃えが効きません。paddingやline-heightで調整できないこともないですが汎用性がなく面倒くさいです。
この解決方法は簡単でa
タグをflexboxにするだけです。そうすると中のテキストは子要素になるのでalign-items:center
が効きます。
さらに、これだけだと高さがテキストの高さになってしまうので、上下一杯に広がるようにheight:100%
を指定します。
あとは余白を適当に設定すれば完成。
これで、どんなサイズにも対応できるセル一杯のリンクエリアになります。
簡単にできてユーザービリティも高いので是非使ってみてください。
htmlは初心者クラスで申し訳ないですが、
今回セル全体をリンクする方法をそっくり活用させていただきました。
解説通りセル全体をリンクでき大変嬉しいんですが、aタグで括った文字がどうやっても左寄せになり中央寄せできません。
仕方なく、•cell-link a{}に記載のpaddingを微調整して擬似中央寄せしました。
何か良い方法はないものでしょうか。
お時間があればご助言頂きたく。
宜しくお願いします。
>ひろさん
そういえば左右中央寄せは考えてなかったですね。
aタグに下記を追加すれば対応できます。
width:100%;
justify-content:center;
ご参考まで。
返信が遅れましてすみません。
頂いた内容でhtmlを作ってみたところ期待どうりの表示が出来、やった!となり直ぐにお返事するところだったのですが、
実はGASの中でhtmlメールを作ってこの中にこの機能付きのテーブルを埋め込んでみるという試みだったんですが、
そうした場合、何故か期待したalign-itemsとjustify-contentが機能せずaタグで囲った文字がセルの左上寄せで表示されてしまい途方に暮れたところでした。
その後、幾つか記事を漁っていたところ、aの子セレクタとして
.xxxx a p{margin:auto;}が必要?との記事をどこかで見かけ、疑心暗鬼でトライしたところ明確な理由は分かりませんが、ご教授頂いたalign-itemsとjustify-contentが機能して上下左右中心寄せが出来るようになりました。
改めて御礼申し上げます!
ただ、この理由ってお分かりになりますでしょうか?
私には何おことやらというレベルなのです。
もし推測レベルで結構なのですが、原因らしいものがありましたら、コメント頂きたく、よろしくおねがいします。
>ひろさん
とりあえず解決したようでよかったです。
htmlメールはCSSへの対応具合が見る環境によってまちまちなので何とも言えないですね・・・。
状況からするとデフォルトでaの子要素(p限定?)にmarginの数値(0)が割り当てられていたのかもしれないですね。
あくまで推測ですがご参考まで。