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

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

ただいまの
回答率

88.92%

:checkedプロパティが効かない|HTMLとCSSのみでタブを作成する

受付中

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 1,858

piyos

score 4

前提・実現したいこと

CSSとHTMLのみ(スクリプトなし)でレスポンシブのタブを作成しています。

完成イメージ

PCでは左図のように2カラムで表示し、タブレット以下は右図のようにタブをスケールダウンに変更してコンテンツを表示します。

▼以下、やりたいことです。

  1. タブメニューをクリックすると右に該当のコンテンツが表示される。
  2. タブレット以下スケールダウンメニューでは、タブメニューをクリックしたと同時にメニューが自動でクローズされる。

発生している問題・エラーメッセージ

inputとcheckedプロパティを用いて、コンテンツを表示させたいのですが、checkedプロパティが効いていないのか、タブをクリックしてもコンテンツが表示されません。

下記のCSSでコンテンツを非表示にしており、

  max-height: 0;
  opacity: 0;

タブ選択時に上記のCSSを解除する方法で表示させています。

  max-height: initial;
  opacity: 1;


カラム分けをせずに、タブを上部に(タブを横並びに)コンテンツを下部に持っていくと成功するのですが、カラム分けをしてタブとコンテンツを左右に並べるとどうも上手くいきません。
max-height: 0; opacity: 0;を削除すると、タブとコンテンツがきちんと2カラムで並んでいるのが確認できるため、やはりcheckedが機能していないように思います。

また、スケールダウンメニューではメニューをクリックしたとき自動でクローズさせる方法がわからないでおります。

該当のソースコード

          <div class="gdlr-core-pbf-column gdlr-core-column-20 gdlr-core-column-first">
            <!-- TAB CONTROLLERS -->
            <input id="panel-1-ctrl"
                   class="panel-radios" type="radio" name="tab-radios" checked>
            <input id="panel-2-ctrl"
                   class="panel-radios" type="radio" name="tab-radios">
            <input id="panel-3-ctrl"
                   class="panel-radios" type="radio" name="tab-radios">    
            <input id="nav-ctrl"
                   class="panel-radios" type="checkbox" name="nav-checkbox">
            <!-- TABS LIST -->
            <ul id="tabs-list">
                <!-- MENU TOGGLE -->
                <label id="open-nav-label" for="nav-ctrl"></label>
                <li id="li-for-panel-1">
                  <label class="panel-label"
                         for="panel-1-ctrl">タブ1</label>
                </li><!--INLINE-BLOCK FIX
             --><li id="li-for-panel-2">
                  <label class="panel-label"
                         for="panel-2-ctrl">タブ2</label>
                </li><!--INLINE-BLOCK FIX
             --><li id="li-for-panel-3">
                  <label class="panel-label"
                         for="panel-3-ctrl">タブ3</label>
                </li>
                <label id="close-nav-label" for="nav-ctrl">Close</label>
            </ul>   
          </div>
          <div class="gdlr-core-pbf-column gdlr-core-column-40">
            <!-- THE PANELS -->
            <article id="panels">
              <div class="container">
                <section id="panel-1">
                  <main>
                    <p>コンテンツ 1</p>
                  </main>
                </section>
                <section id="panel-2">
                  <main>
                    <p>コンテンツ 2</p>
                  </main>
                </section>
                <section id="panel-3">
                  <main>
                    <p>コンテンツ 3</p>
                  </main>
                </section>
              </div>
            </article>
          </div>
/*
カラム
※WPのテーマを使用のためクラス名がこのようになっています
*/

.gdlr-core-column-first {
    clear: left;
}
.gdlr-core-column-20 {
    float: left;
    width: 33.3333%;
}
.gdlr-core-column-40 {
    float: left;
    width: 66.6666%;
}
.gdlr-core-pbf-column {
    position: relative;
}

/*
タブ
*/
ul#tabs-list {
  list-style: none;
  text-align: center;
  margin: 0;
  padding: 0;
}

label.panel-label {
  -webkit-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  user-select: none;
  display: block;
  width: 100%;
  color: #8d8d8d;
  font-size: 10px;
  font-weight: 500;
  text-transform: uppercase;
  letter-spacing: 0.5px;
  cursor: pointer;
  border-color: #fff;
  border-right-width: 2px;
  border-right-style: solid;
  transition: border-color 300ms, color 300ms;
  -webkit-transition: border-color 300ms, color 300ms;
  -moz-transition: border-color 300ms, color 300ms;
  -o-transition: border-color 300ms, color 300ms;
}
label.panel-label:hover {
  color: #d9d408;
}

/*
コンテンツエリア
*/

#panels {
  background-color: white;
}
#panels .container {
  margin: 0 auto;
}
#panels section header label.panel-label {
  padding: 12px 24px;
  -webkit-box-sizing: border-box;
  -moz-box-sizing: border-box;
  box-sizing: border-box;
}
#panels section main {
  -webkit-box-sizing: border-box;
  -moz-box-sizing: border-box;
  box-sizing: border-box;
  max-height: 0;
  opacity: 0;
  -webkit-transition: opacity 600ms;
  transition: opacity 600ms;
  overflow-y: hidden;
}

/*
タブcheckedでコンテンツを表示
*/

#panel-1-ctrl:checked ~ #panels #panel-1 main {
  max-height: initial;
  opacity: 1;
  box-sizing: border-box;
}

#panel-2-ctrl:checked ~ #panels #panel-2 main {
  max-height: initial;
  opacity: 1;
  box-sizing: border-box;
}

#panel-3-ctrl:checked ~ #panels #panel-3 main {
  max-height: initial;
  opacity: 1;
  box-sizing: border-box;
}


/*
タブレット以下
*/

@media all and (max-width: 767px) {

 .gdlr-core-column-20, .gdlr-core-column-40, {
    width: 100%;
  }

  ul#tabs-list {
    height: 30vw;
  }

  #nav-ctrl:checked ~ #tabs-list #li-for-panel-1 {
    max-height: 46px;
    opacity: 1;
  }

  #nav-ctrl:checked ~ #tabs-list #li-for-panel-2 {
    max-height: 46px;
    opacity: 1;
  }

  #nav-ctrl:checked ~ #tabs-list #li-for-panel-3 {
    max-height: 46px;
    opacity: 1;
  }

#open-nav-label {
    display: block;
    position: absolute;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    cursor: pointer;
  }

  #nav-ctrl:checked ~ #tabs-list #open-nav-label {
    display: none;
  }

  #close-nav-label {
    display: block;
    max-height: 0;
    overflow-y: hidden;
    background-color: #444444;
    color: #ecf0f1;
    padding: 0px;
    -webkit-transition: max-height 200ms;
    transition: max-height 200ms;
    cursor: pointer;
    text-transform: uppercase;
    font-size: 12px;
    line-height: 22px;
    letter-spacing: 1px;
  }

  #nav-ctrl:checked ~ #tabs-list #close-nav-label {
    max-height: 36px;
    opacity: 1;
    padding: 12px 24px;
  }

  #tabs-list {
    position: relative;
  }
  #tabs-list label.panel-label {
    padding: 12px 0;
  }
  #tabs-list #li-for-panel-1 {
    background-color: #fff;
    max-height: 0;
    overflow-y: hidden;
    -webkit-transition: max-height 200ms;
    transition: max-height 200ms;
  }
  #tabs-list #li-for-panel-2 {
    max-height: 0;
    overflow-y: hidden;
    -webkit-transition: max-height 200ms;
    transition: max-height 200ms;
  }
  #tabs-list #li-for-panel-3 {
    max-height: 0;
    overflow-y: hidden;
    -webkit-transition: max-height 200ms;
    transition: max-height 200ms;
  }
  #tabs-list #li-for-panel-4 {
    max-height: 0;
    overflow-y: hidden;
    -webkit-transition: max-height 200ms;
    transition: max-height 200ms;
  }
  #tabs-list #li-for-panel-5 {
    max-height: 0;
    overflow-y: hidden;
    -webkit-transition: max-height 200ms;
    transition: max-height 200ms;
  }
 #panel-1-ctrl:checked ~ #tabs-list #li-for-panel-1 {
    max-height: 46px;
    opacity: 1;
  }
  #panel-1-ctrl:checked ~ #tabs-list #li-for-panel-1 label.panel-label {
    background-color: white;
    color: #d9d408;
    background-color: #d9d408;
    color: white;
  }

  #panel-2-ctrl:checked ~ #tabs-list #li-for-panel-2 {
    max-height: 46px;
    opacity: 1;
  }
  #panel-2-ctrl:checked ~ #tabs-list #li-for-panel-2 label.panel-label {
    background-color: white;
    color: #d9d408;
    background-color: #d9d408;
    color: white;
  }

  #panel-3-ctrl:checked ~ #tabs-list #li-for-panel-3 {
    max-height: 46px;
    opacity: 1;
  }
  #panel-3-ctrl:checked ~ #tabs-list #li-for-panel-3 label.panel-label {
    background-color: white;
    color: #d9d408;
    background-color: #d9d408;
    color: white;
  }

#panels .container {
    width: 100%;
    margin: 0 auto;
  }
#panels section header {
    display: block;
  }
}

/*
タブ デフォルト
*/
ul#tabs-list {
  text-align: center;
  max-width: 12em
}
ul#tabs-list li {
  display: block;
  text-align: left;
  font-size: 0.875em;
  width: 100%;
  margin-bottom: 0;
  -webkit-transition-property: border-right;
  transition-property: border-right;
  -webkit-transition-duration: 200ms;
  transition-duration: 200ms;
}
ul#tabs-list li:hover {
  color: #d9d408;
  border-color: #d9d408;
}
ul#tabs-list li:hover:last-of-type {
  border-right: 2px solid #d9d408;
}
      ul#tabs-list li label.panel-label {
        border-top: 0px solid #d9d408;
        padding: 10px 0;
      }
      ul#tabs-list li label.panel-label:hover {
        color: #d9d408;
        border-color: #d9d408;
      }

      #open-nav-label,
      #close-nav-label {
        display: none;
      }

      #nav-ctrl {
        display: none;
      }
    }

@media all and (min-width: 900px) {
      main {
        width: 80%;
        margin: 0 auto;
      }
  }

試したこと

先述の通り、カラム分けをせずに、タブを上部に(タブを横並びに)コンテンツを下部に持っていくと成功します。タブを縦並びにしたい理由としては、メニューの数が多い(14コ)ことにあります。
※記述が長くなるため上記のソースコードは3つまでにしています。

やはりスクリプトなしでタブを作成することは不可能なのでしょうか。

何卒ご教授いただけますと幸いです。
どうぞよろしくお願いいたします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • think49

    2019/09/01 21:23

    カラム分けする/しないの差が不明なので、両者のHTML/CSSを書いてください。
    この手の検証は「最小限のソース」で行うと切り分けになるので、可能な限り、ソースを切り詰める事をお勧めします。本番適用はテストが成功した後になります。

    キャンセル

回答 3

+2

無効なセレクタ

#panel-1-ctrl:checked ~ #panels #panel-1 main {
  max-height: initial;
  opacity: 1;
  box-sizing: border-box;
}

#panel-1-ctrl と #panels は「兄弟関係」ではない為、このセレクタは無効です。
正しくセレクタを指定する為には、#panel-1-ctrl の親要素を経由する必要があります。

:has()

Selectors Level 4 の :has() を利用する事で、親要素を経由する事が可能です。
(※ただし、2019-09-01現在は実装がありません)

.gdlr-core-pbf-column:has(>#panel-1-ctrl:checked) + .gdlr-core-pbf-column>.panels #panel-1>main {
  max-height: initial;
  opacity: 1;
  box-sizing: border-box;
}

結論: CSSで実現可能ですが、実装がありません。

Re: piyos さん

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/09/01 21:57

    イメージ画像を見る限りではチェックボックスが非表示なので、display:none; で非表示にすれば、input[type=radio] をCSS適用可能な場所に配置できる気がしないでもありません。

    キャンセル

0

やはりスクリプトなしでタブを作成することは不可能なのでしょうか。

不可能ではありませんが、CSSのセレクタに限界がある以上、相当に制約がかかります。JavaScriptで実装したほうが楽です。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

やはりスクリプトなしでタブを作成することは不可能なのでしょうか。

そもそもスクリプトなしでサイトを作る方が難しいのではないでしょうか?(ものにもよります)
どちらにしてもJavaScriptを利用した方が楽and拡張性が高いと思います。

JavaScriptを無効化している人にはGoogle検索のように機能を簡略化したものを提供化するか使えないようにして良いのではないでしょうか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

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