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

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

ただいまの
回答率

88.77%

レスポンシブテーブル CSS

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 928

t_suzuki1009

score 17

前提・実現したいこと

HTML5 CSS3 にて、レスポンシブ対応のテーブルでの料金表です。

イメージ説明

このようなテーブルはCSSで可能でしょうか?
ネットでレスポンシブのテーブルCSSをいくつか調べましたが、480px以下の場合に組み替えるソースを発見することができませんでした。

お分かりの方がいらっしゃいましたら、htmlとcssを教えていただけないでしょうか?

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+2

回答というか、提案って感じになるかもしれませんが、
似たようなことはワンソースで可能です。

あと、X軸とY軸は逆の方が分かりやすいような気がします。
以下のソースは入れ替えちゃったものになります。

<body>
  <div class="container">
    <table>
      <thead>
        <tr>
          <th>&nbsp;</th>
          <th>30min</th>
          <th>45min</th>
          <th>60min</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <th>C1</th>
          <td data-label="30min">100</td>
          <td data-label="45min">200</td>
          <td data-label="60min">300</td>
        </tr>
        <tr>
          <th>C2</th>
          <td data-label="30min">200</td>
          <td data-label="45min">300</td>
          <td data-label="60min">400</td>
        </tr>
        <tr>
          <th>C3</th>
          <td data-label="30min">300</td>
          <td data-label="45min">400</td>
          <td data-label="60min">500</td>
        </tr>
      </tbody>
    </table>
  </div>
</body>
.container {
  margin:0 auto;
  width:80%;
}
table {
  width:100%;
}
table,td,th {
  border-collapse:collapse;
  border:1px solid #000;
}
td,th {
  padding:10px;
  font-size:100%;
  font-weight:normal;
}
thead th {
  background-color:#ff0;
  text-align:right;
}
tbody th {
  background-color:#fff2cd;
  text-align:left;
}
tbody td {
  text-align:right;
}
@media only screen and (max-width:480px) {
  table {
    border:none;
  }
  thead {
    display:none;
  }
  tbody th {
    display:block;
    background-color:#ff0;
    border-bottom:1px solid #000;
    text-align:center;
  }
  tbody td {
    position:relative;
    display:list-item;
    border-top:none;
    list-style-type:none;
  }
  tbody td::before {
    position:absolute;
    left:0;
    top:0;
    display:flex;
    align-items:center;
    box-sizing:border-box;
    padding-left:10px;
    border-right:1px solid #000;
    width:5em;
    height:100%;
    background-color:#fff2cd;
    text-align:left;
    content:attr(data-label);
  }
  tbody tr:not(:last-of-type) td:last-child {
    border-bottom:none;
  }
}


不明点あればご質問ください。

追記:

サンプル画像のように三項目の間にスペースを入れる場合。
tbody tr:not(:last-of-type) td:last-childtbody tr td:last-childに変更して、
中身をmargin-bottom:10px;などとしてください。

追記2:

HTMLは<thead><th>内と<tbody><th>内が変更点です。
CSSはtbody th{}内に以下の1行を追加。
tbody th::after{}はそのまま追加します。
要するにレイヤーで上書きって感じになります。
HTMLのソース上構造は間違っていないので、問題ないと思いますが、
やっちゃだめなことだとご存知の方はコメントください。

<body>
  <div class="container">
    <table>
      <thead>
        <tr>
          <th>&nbsp;</th>
          <th>C1</th>
          <th>C2</th>
          <th>C3</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <th data-label="C1">30min</th>
          <td data-label="30min">100</td>
          <td data-label="45min">200</td>
          <td data-label="60min">300</td>
        </tr>
        <tr>
          <th data-label="C2">45min</th>
          <td data-label="30min">200</td>
          <td data-label="45min">300</td>
          <td data-label="60min">400</td>
        </tr>
        <tr>
          <th data-label="C3">60min</th>
          <td data-label="30min">300</td>
          <td data-label="45min">400</td>
          <td data-label="60min">500</td>
        </tr>
      </tbody>
    </table>
  </div>
</body>
@media only screen and (max-width:480px) {
  tbody th {
    position:relative;
  }
  tbody th::after {
    z-index:10;
    position:absolute;
    left:0;
    top:0;
    display:flex;
    justify-content:center;
    align-items:center;
    background-color:#ff0;
    width:100%;
    height:100%;
    content:attr(data-label);
  }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/10 11:32

    お世話になっております。
    たくさんの方々にお知恵を頂き感謝しております。
    X軸、Y軸入れ替えない場合はどうなりますでしょうか?

    キャンセル

  • 2019/05/10 13:59

    見づらくて想定していませんでしたが、裏技的なものなら思いつきました。
    追記するので、少々お待ちください。

    キャンセル

  • 2019/05/12 09:40

    ありがとうございます。とても助かりました。わたしも見づらいとは思うのですが、要望がこの形なもので...。

    キャンセル

  • 2019/05/12 14:33

    解決したようで何よりです。
    クライアント様の言うことならしょうがないですね(笑)。

    キャンセル

+2

このようなテーブルはCSSで可能でしょうか?

CSSだけでやるとなると、「幅が広いときと狭い時の2種類のテーブルを用意しておいて、それをCSSで片方だけ表示するようにする」といった手段がいちばんシンプルになるかと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/07 16:15

    もう1つの考え方としては、「480pxの方のテーブルをHTMLでは作成しておいて、幅が広いときにはC2C3のテーブルで見出しを消してテーブル自体を並べる」という方法も思い浮かびましたが、うまくやらないとレイアウトが崩れそうです。

    キャンセル

  • 2019/05/07 16:59

    早速のご提案ありがとうございます。

    この場合、端末ごとに専用のページを個別構築し、スマホとPCのデバイスごと条件分岐するphpなり、htaccessなりJavaScriptなりで振り分けるということでしょうか?

    対象はワードプレスの固定ページなので、可能ならワンソースで実現したいと思うのですが、CSSにお詳しい方でもこの実現は難しいのでしょうか?

    キャンセル

  • 2019/05/07 17:03

    > この場合、端末ごとに専用のページを個別構築し、スマホとPCのデバイスごと条件分岐するphpなり、htaccessなりJavaScriptなりで振り分けるということでしょうか?

    いえ、1枚のHTMLに「481px以上」と「480px以下」の2つのパターンを書いておく、という方法です。あとはCSSで表示・非表示を切り替えるようにすれば、PHPやJavaScriptでの切り分けは不要です。

    キャンセル

  • 2019/05/07 17:15

    @media screen and (max-width: 480px){
    .tableclassSP { display: none;}
    }
    みたいな感じですか?

    キャンセル

0

もしくは下記のように480px(以下)のデザインをPCでは並べちゃうかですね、、
(レスポンシブの対応としてはdiplay:noneで切り替えるか、並べるかしかないと思います。)

480px以下の場合に組み替えるソース

これは「1セント高価の陰影」じゃないですけどユーザーには伝わりにくいと思います。
ユーザーから見て「見やすい」のが一番なので、適切な方法を選択するのが良いかと思いわれます。

参考まで。

<!DOCTYPE html>
<html lang="ja" dir="ltr">
<head>
  <meta charset="utf-8">
  <title></title>
</head>
<body>

  <style>

  .container{
    display: flex;
    flex-wrap: wrap;
  }

  .example{
    width: calc(100% / 3);
    padding:0;
  }

  .example table {
    border: 1px #000000 solid;
    width: 90%;
  }

  .example td {
    border: 1px #000000 solid;
  }

   @media screen and (max-width: 480px){

     .example{
       margin:10px 0;
       width: 100%;

     }
   }


</style>


<div class="container">

  <div class="example">

    <table>
      <tr>
        <td></td>
        <td>C1</td>
      </tr>
      <tr>
        <td>30 min</td>
        <td>100</td>
      </tr>
      <tr>
        <td>40 min</td>
        <td>200</td>
      </tr>
      <tr>
        <td>50 min</td>
        <td>300</td>
      </tr>
    </table>

  </div>

  <div class="example">

    <table>
      <tr>
        <td></td>
        <td>C2</td>
      </tr>
      <tr>
        <td>30 min</td>
        <td>100</td>
      </tr>
      <tr>
        <td>40 min</td>
        <td>200</td>
      </tr>
      <tr>
        <td>50 min</td>
        <td>300</td>
      </tr>
    </table>

  </div>

  <div class="example">

    <table>
      <tr>
        <td></td>
        <td>C3</td>
      </tr>
      <tr>
        <td>30 min</td>
        <td>100</td>
      </tr>
      <tr>
        <td>40 min</td>
        <td>200</td>
      </tr>
      <tr>
        <td>50 min</td>
        <td>300</td>
      </tr>
    </table>

  </div>


</body>
</html>

![イメージ説明
※SP
![イメージ説明
※PC

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

  <div class="container">
    <table id="c1">
      <thead>
        <tr>
          <td></td>
          <th>C1</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <th>30min</th>
          <td>100</td>
        </tr>
        <tr>
          <th>45min</th>
          <td>200</td>
        </tr>
        <tr>
          <th>60min</th>
          <td>300</td>
        </tr>
      </tbody>
    </table>
    <!-- 以下同様 -->
@media screen and (min-width:481px) {
  .container {
    display: flex;
  }

  table + table tr > :first-child {
    display: none;
  }
}


grid ならもっとまともに並べられますが非常に面倒

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.77%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る