質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

2回答

3841閲覧

CSSの「sticky」で行を固定したいけれども固定されない

YouS2017

総合スコア2

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

0クリップ

投稿2021/05/17 09:24

編集2021/05/17 12:48

PythonでFlaskを使ってシフト表を出力するアプリを作っています。
1ヶ月表示するので左端の名前部分と日付部分はスクロールしても固定したいと思い調べた結果
CSSにて「position: sticky;」を指定するというところは理解できました。
まず列の固定でtableの最初の項目に「fixedtable」というclassをつけて動くのを確認しました。
その後同じように行を固定しようと同じように「fixedcolumn」というclassをつけてみたところ全く動作せず詰まってしまいました。

以下の行動は試してみました。
・ググってみて「sticky」とは親要素内でしか動かないという仕組みの理解
・tbodyタグを作って「fixedcolumn」を入れて、thタグを指定してもダメ
・単独でthタグに「fixedcolumn」を入れるもダメ
・trタグに「fixedcolumn」を入れてthタグを指定するもダメ
・Bootstrapを導入しているためかと思い全てに!importantをつけてみたりもしましたが反応なし

一つのテーブルごとに1列目と2行目を固定したいというのが最終的な形となります。
不足情報などあれば追記します。
助言を頂ければと思います。
よろしくお願いします。

いただいたアドバイスを元に修正とテーブル部全体のコードも載せました。
現状やはり1行目と2行目の固定ができない状況です。

html

1 {% set n = namespace(store = '') %} 2 {% set m = namespace(shiftname = '') %} 3 {% set l = namespace(loopcnt = 1) %} 4 {% for post in posts %} 5 {% if n.store != post.store %} 6 {% if not loop.first %} 7 </tbody> 8 </table> 9 </div> 10 {% endif %} 11 <div class="table-responsive"> 12 <table class="table table-bordered border-primary"> 13 <thead class="fixedcolumn"> 14 <tr> 15 {% for store in poststore %} 16 {% if store.store_name == post.store %} 17 <th class="fixedtable" style="width: 150px;"><a href="/store?store_no={{ post.store }}">{{ store.store_name }}</a></th> 18 <th colspan={{ day_count }} style="text-align: left;">{{ store.shift_time }}</th> 19 {% endif %} 20 {% endfor %} 21 </tr> 22 <tr> 23 <th class="fixedtable">氏名</th> 24 {% for i in range(1,day_count+1) %} 25 <th style="font-size: 0.75rem;">{{ i }}日</th> 26 {% endfor %} 27 </tr> 28 </thead> 29 <tbody> 30 {% endif %} 31 {% if m.shiftname != post.name %} 32 <tr> 33 <td class="fixedtable"><a href="/name?staff_name={{post.name}}">{{ post.name }}</a></td> 34 <td>{{ post.shift }}</td> 35 {% set l.loopcnt = l.loopcnt + 1 %} 36 {% else %} 37 {% if l.loopcnt == day_count %} 38 <td>{{ post.shift }}</td> 39 </tr> 40 {% set l.loopcnt = 1 %} 41 {% else %} 42 <td>{{ post.shift }}</td> 43 {% set l.loopcnt = l.loopcnt + 1 %} 44 {% endif %} 45 {% endif %} 46 {% set m.shiftname = post.name %} 47 {% set n.store = post.store %} 48 {% endfor %} 49 </table> 50 </div>

CSS

1thead tr{ 2 height: 60px; 3} 4 5.fixedcolumn tr:first-child th { 6 position: -webkit-sticky; 7 position: sticky; 8 top: 0; 9 background-color: #202020 !important; 10 color: white !important; 11} 12 13.fixedcolumn tr:nth-child(2) th { 14 position: -webkit-sticky; 15 position: sticky; 16 top: 60px; 17 background-color: #202020 !important; 18 color: white !important; 19} 20 21.fixedcolumn tr:first-child th:first-child { 22 z-index: 1; 23} 24 25.fixedcolumn tr:nth-child(2) th:first-child{ 26 z-index: 1; 27} 28 29.fixedtable { 30 position: -webkit-sticky; 31 position: sticky; 32 left: 0; 33 background-color: #202020 !important; 34 color: white !important; 35}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

tableの列固定方法は「css table 列固定」などのキーワードで検索するとすぐ出てきます。
googleで検索すると以下のページがtopにでてきました。

[CSS] table の列固定に position: sticky を使用して背景色を指定すると、枠線が消えてしまう

この記事通り実装すれば1列目は固定できます。まずは1列目が固定できるようになってください。

2列目も固定するには、

  • 2列目のtd,thに指定する left の値に1列目のwidthを加算する必要がある
  • そのためには1列目のwidthを固定値で設定する

必要があるでしょう。

css

1/* table要素に追加するプロパティ */ 2table{ 3 /* セル幅を固定するため、table-layoutをfixedに設定する */ 4 table-layout: fixed; 5 /* table要素自体の幅も具体的に設定しないとセル幅の指定ができない */ 6 width: 900px; 7} 8/* td, thに追加するプロパティ */ 9td, th{ 10 /* セル幅を固定する */ 11 width: 150px; 12} 13/* 1列目要素の固定 */ 14.table-fixed th:first-child, .table-fixed td:first-child { 15 position: sticky; 16 /* leftを指定しないと左に固定できない */ 17 left: 0; 18} 19/* 2列目要素の固定 */ 20.table-fixed th:nth-child(2), .table-fixed td:nth-child(2) { 21 position: sticky; 22 /* 2列目のleftは1列目のwidth分加算して指定する */ 23 left: 150px; 24} 25

htmlデータは上記のページをそのまま拝借しました。

html

1<div class="table-parent"> 2 <table class="table-sample table-fixed"> 3 <thead> 4 <tr><th>名前</th><th>番号</th><th>データ1</th><th>データ2</th><th>データ2</th><th>データ4</th></tr> 5 </thead> 6 <tbody> 7 <tr><td>富山 一郎</td><td>A01234567</td><td>1234567890</td><td>1234567890</td><td>1234567890</td><td>1234567890</td></tr> 8 <tr><td>石川 花子</td><td>ZX0000000</td><td>1234567890</td><td>1234567890</td><td>1234567890</td><td>1234567890</td></tr> 9 <tr><td>福井 タカシ</td><td>QQQ9999999</td><td>1234567890</td><td>1234567890</td><td>1234567890</td><td>1234567890</td></tr> 10 </tbody> 11 </table> 12</div>

codepenにも同様のデモを作ったので参考になれば。

https://codepen.io/haruyan-hopemucci/pen/poeEoOB

追記

1列目と「2行目」の複合固定が希望だったのですね。読み違えていました。
行側の固定も、列側と同じようにtd要素、th要素に対して position: sticky をつけ、適切にtop値を設定すれば複数行の固定も可能です。(2行目のtopは1行目のheightを加算していきます)
また、行側のヘッダと列側のヘッダが交差する場合どちらを上にするかは、z-indexを細かく設定して決めましょう。

コードが長くなったのでcodepenのデモで確認してください。同じpenに再実装しています。
https://codepen.io/haruyan-hopemucci/pen/poeEoOB
デモでは2行2列分の複合固定となっております。

投稿2021/05/17 11:33

編集2021/05/17 13:28
hope_mucci

総合スコア4447

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YouS2017

2021/05/17 12:24

二重固定のご教示ありがとうございます。行固定の際の参考にさせて頂きます! ただすみません、今回列の固定はできていたんですが、行の固定ができず苦戦しております。 また表記の仕方も悪かったと思いますが1列目と2「行目」を最終的に固定させたいというのが今回の質問でした。 作っていただいたコードを見てテーブルをdivでくくってみたりもしましたがやはり行は固定できません。 列とは違う形で固定となるのでしょうか? さまざまなページの情報を見て設定もしてみましたがうまくいきません。 色の指定は成功しているのでCSSが反映できていないわけではないと思うのですが…
hope_mucci

2021/05/17 13:30

コメントを受けて複数の行と列を固定できるよう回答を修正しました。 修正中にBAが決まってしまいましたが、コードは参考になると思います。ご確認いただければ。
YouS2017

2021/05/17 14:04

追記でのフォローありがとうございます! 細かなサポートページまで修正を頂き勉強になります。 デモページを見て細かな調整をしていければと思います。 根本を理解していないところがあったので精進していきます。
guest

0

ベストアンサー

提示されたコードを見ると、1行目を固定したいのかなぁと思いました。勘違いだったらスルーしてください。

もし1行目を固定したいのであれば、fixedcolumnの方のセレクタを

css

1.fixedcolumn tr:first-child th {

のように変えれば、1行目(tr)の全thposition:stickyが適用されると思います。

また、この場合、htmlの、「氏名」と「○日」を出力しているtrを1行目に持ってくるのが自然な気がします(現状、最終行に来てます)。

イメージ説明

で、1行目と1列目を固定することになるので、水平方向と垂直方向にスクロールしたとき、「氏名」が隠れないようにするため、下記の3行を追記しましょう。

css

1.fixedcolumn tr:first-child th:first-child { 2 z-index: 1; 3}

イメージ説明

投稿2021/05/17 12:15

gpsoft

総合スコア1323

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YouS2017

2021/05/17 12:56

コードの反映先の考え方勉強になりました、ありがとうございます! それと列側を固定して日付が下に回るのもやりたかったことだったので助かります! ただやはり上2行が固定できないようです… 一応1行目が店舗名とシフト情報、2行目が日付を表示するテーブルヘッダーとして作っています。 DBから引っ張ってきたデータをforとifで店舗ごとにテーブルを分ける関係で複雑な形になってしまっていますが、コードもテーブル全体のものを載せてみました。 上2行を固定したい(最悪日付行だけ残れば大丈夫)という状況です。 fixedcolumnをthead全体につけてもダメでした、何か根本的なところが間違っているのでしょうか?
YouS2017

2021/05/17 13:26

```HTML <div class="table-responsive"> <table class="table table-bordered border-primary"> <thead class="fixedcolumn"> ``` このタグの位置をtheadからdivに動かしたらいけました。 ```HTML <div class="fixedcolumn"> <table class="table table-bordered border-primary"> <thead> ``` こちらで思った通りの動作となりました。 結果として最後の一押しは自分でしたがご助言頂いた2名の方のコードも理解が進み非常に助かりました。 ベストアンサーは仕組みの部分まで教えて頂いたgpsoftさんにさせて頂きました。 今までとにかく手探りで作業していたので知識の補完を今後は進めていくようにしていきます。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問