帳票システムなどを作る時に、HTMLでは必ず使用するTableタグ。
position:sticky機能が使える様になってから、ヘッダや見出しのスクロール固定ができるようになり、非常に便利に使っています。
でも、Tableのセルにborderがセットされていると、色々な不具合が生じるため、自分がやっているその回避方法について解説したいと思います。
borderが隠れる症状
普通にセルにborderを書いた状態でのtableの状態がコチラ。
ヘッダ部分のborderラインがスクロールすると、消えてしまうのがわかります。
Amazon売れ筋ランキング 2025年1月 : 周辺機器
※値段は、2025/1/8時点の表示です。
ざっくりとcssを抜き出すとこんな感じ。
.wrap{
overflow:scroll;
width:100%;
height:300px;
position:relative;
}
.wrap table{
border-collapse:collapse;
}
.wrap table tr:nth-of-type(1){
position:sticky;
top:0;
left:0;
}
いろんなサイトに、"border-collapse:collapse;" コイツが原因と書かれているので、
"border-collapse:separate;" に変更してみる。
Amazon売れ筋ランキング 2025年1月 : ノートパソコン
※値段は、2025/1/8時点の表示です。
ID |
Image |
Price |
Name |
URL |
1 |
|
¥12,800 |
NEC等 ノートPC VK23/ 12.5型/ 第6世代 i3-6100U /Win11 Pro/MS Office H&B 2019 /wajunのWIFI/Bluetooth/4GB/128GB SSD |
https://amzn.to/4fSEK9g |
2 |
|
¥16,907 |
超軽量Panasonic Let's note CF-SZ6■第7世代 Intel Core i5-7200U@2.5GHz/メモリ8GB/ |
https://amzn.to/4j9SpeX |
3 |
|
¥14,800 |
2-in-1 ノートパソコン IdeaPad D330 Windows11Pro 10.1型 office2019付き HD IPS液晶/Intel Celeron/メモリ:4GB/eMMC:64GB/Webカメラ搭載/Type-C USB3.1/日本語 キーボード搭載 |
https://amzn.to/3WbLTe1 |
4 |
|
¥16,800 |
富士通 15.6インチ ノートパソコン A577/ Win11 Pro/MS Office H&B 2019 /Core i3 7130U/WIFI/HDMI / 8GB/256GB SSD/テンキー |
https://amzn.to/3BOXzMR |
5 |
|
¥99,800 |
ASUS ノートパソコン Vivobook 15 15.6インチ Ryzen 7 7730U メモリ16GB SSD1TB WPS Office搭載 Windows11 バッテリー駆動12.9時間 重量1.7kg インカメラ搭載 クワイエットブルー M1502YA-BQ183W |
https://amzn.to/424NiGR |
.wrap table{
border-collapse:separate;
border-spacing:0;
}
.wrap table th,
.wrap table td{
border:1px solid black;
}
この状態だと、セルが隣り合っている箇所がborderが 1px + 1px = 2px になってしまいます。
対応仮説
borderを表示する箇所を特定(上と左だけ)に限定して、最下段のみ下、一番右のセルのみ右、にborderを表示すると、いい感じになるはずです。
Amazon売れ筋ランキング 2025年1月 : 家電&カメラ
※値段は、2025/1/8時点の表示です。
.wrap table tr:nth-of-type(1){
position:sticky;
top:0;
left:0;
}
.wrap table{
border-collapse:separate;
border-spacing:0;
}
.wrap table th,
.wrap table td{
border-color:black;
border-style : solid;
border-top-width:black;
border-left-width:black;
border-bottom-width:0px;
border-right-width:0px;
}
.wrap table tr:last-child{
border-bottom-width:1px;
}
.wrap table td:last-child{
border-right-width:1px;
}
この状態だと、stickyの下部のborderラインが消えてしまいますね。
もうちょっと改良してみましょう。
最終対応方法
Amazon売れ筋ランキング 2025年1月 : DIY・工具・ガーデン
※値段は、2025/1/8時点の表示です。
ID |
Image |
Price |
Name |
URL |
1 |
|
¥4,980 |
SwitchBot スイッチボット スイッチ ボタンに適用 指ロボット スマートスイッチ スマートホーム ワイヤレス タイマー |
https://amzn.to/4fUkyUp |
2 |
|
¥1,562 |
椅子脚カバー カルガルー 椅子の足カバー 椅子脚キャップ 椅子の脚 カバー 家具スライダー 丸形 長方形 正方形 滑りやすく 取れない フッ素 カンガルー マルチサイズ フリーサイズ 日本製 木製脚 8個入 シェリー Shelly |
https://amzn.to/4fWG8rK |
3 |
|
¥1,980 |
SwitchBot スマートプラグ プラグミニ スマートコンセント スイッチボット 消費電力モニター タイマー コンセント 節電·省エネ 直差し 遠隔操作 音声コントロール Bluetooth&Wi-Fi両方対応 |
https://amzn.to/40aLedZ |
4 |
|
¥571 |
東洋アルミ(Toyo Aluminium) 換気扇 フィルター 整流板 貼るだけ 切り取りミシン目付き 約64cm×91cm 1枚入 フィルたん S3074 |
https://amzn.to/4j6PLqf |
5 |
|
¥1,340 |
コジット ダンボールのストック ゴミ出し これ一つで解決 持ち運びできる段ボールストッカー |
https://amzn.to/4gLEXwe |
.wrap table tr:nth-of-type(1){
position:sticky;
top:0;
left:0;
}
.wrap table{
border-collapse:separate;
border-spacing:0;
}
.wrap table th,
.wrap table td{
border-color:black;
border-style : solid;
border-top-width:black;
border-left-width:black;
border-bottom-width:0px;
border-right-width:0px;
}
.wrap table tr:first-child th{
border-bottom-width:1px;
}
.wrap table tr:first-child + * td{
border-top-width:0px;
}
.wrap table tr:last-child{
border-bottom-width:1px;
}
.wrap table td:last-child{
border-right-width:1px;
}
縦横対応
最後に、トップメニューだけじゃなく、サイドのナンバリングに関しても、sticky対応してみたいと思います。
Amazon売れ筋ランキング 2025年1月 : スポーツ&アウトドア
※値段は、2025/1/8時点の表示です。
.wrap table tr:nth-of-type(1){
position:sticky;
top:0;
left:0;
z-index:3;
}
.wrap table tr > *:first-child{
position:sticky;
left:0;
z-index:2;
}
.wrap table{
border-collapse:separate;
border-spacing:0;
}
.wrap table th,
.wrap table td{
border-color:black;
border-style : solid;
border-top-width:black;
border-left-width:black;
border-bottom-width:0px;
border-right-width:0px;
}
.wrap table tr:first-child th{
border-bottom-width:1px;
}
.wrap table tr:first-child + * th,
.wrap table tr:first-child + * td{
border-top-width:0px;
}
.wrap table tr > *:first-child{
border-right-width:1px;
}
.wrap table tr > *:first-child + *{
border-left-width:0px;
}
.wrap table tr:last-child{
border-bottom-width:1px;
}
.wrap table td:last-child{
border-right-width:1px;
}
非常に長いコードになってしまいましたが、この書き方をコピペするのではなく、table内のセルのどの部分のborderを表示して、どこを非表示にするかをイメージできれば、それに適した書き方をするのがいいと思います。
あとがき
今回のsticky対応のborder表示をcssで行った場合、tableのリスト項目をjavascriptで絞り込みする様なシステムにおいて、思った様にborderの表示ができない場合があります。
classやattributeなどを駆使して、cssのselectorをうまく使いこなす必要があるので、この辺はコーダースキルが求められる点だと思います。
これが理解できない人は、今一度cssについて基礎学習をしてみることをオススメします。
意外とcssって奥深いんですよね。
0 件のコメント:
コメントを投稿