0
1

More than 3 years have passed since last update.

HTML+CSSだけで表示・非表示(タブ切り替えなど)

Last updated at Posted at 2021-03-28

JSを使うより軽量なため、シンプルなタブ切り替えなら、HTMLとCSSだけで実装したい。

ラジオボタンで表示・非表示

  • HTMLの構成は、① ラジオボタン + ② ラベル(タブ) + ③ 表示させたい内容部分 の3セット。
  • ラジオボタンは1つのみ選択可能なので、他のタブクリックで表示を切り替えたい時に使う。
No. 動作の流れ
1 ラベルをクリックしたら、ラジオボタンがchecked状態になる
2 checked状態のラジオボタンの次の次の要素を表示にする
3 他のラベルをクリックしたら、そのラジオボタンにchecked状態が移る
4 内容要素を一旦全部非表示にする
5 改めて、checked状態のラジオボタンの次の次の要素を表示にする

※ ラベルのfor属性に、ラジオボタンのid名を指定することで、ラベルクリックで所望のラジオボタンがchecked状態になる。

例1)inputの直後に表示内容を置く

表示したい内容をinputの直後に置く場合(HTML)
<div class="area">
    <input type="radio" name="tab_name" id="tab1" checked>
    <label class="tab_class" for="tab1">タブ1</label>
    <div class="content_class">コンテンツ1</div>

    <input type="radio" name="tab_name" id="tab2" >
    <label class="tab_class" for="tab2">タブ2</label>
    <div class="content_class">コンテンツ2</div>

    <input type="radio" name="tab_name" id="tab3" >
    <label class="tab_class" for="tab3">タブ3</label>
    <div class="content_class">コンテンツ3</div>
</div>
css
.area {
  width: 500px;
  margin: auto;
  flex-wrap: wrap;
  display: flex;
}
.tab_class {
  width: calc(100%/3);
  height: 50px;
  line-height: 50px;
  text-align: center;
  display: block;
  float: left;
  order: -1;
}
input[name="tab_name"] {
  display: none;
}
input:checked + .tab_class {
  color: blue;
}
.content_class {
  display: none;
  width: 100%;
}
input:checked + .tab_class + .content_class {
  display: block;
}

例2)inputの直後に表示内容を置かない

表示したい内容をinputの直後に置かない場合(HTML)
<div class="area">
  <input id="tab1" type="radio" name="tab_name" checked>
  <label class="tab_class" for="tab1">タブ1</label>

  <input id="tab2" type="radio" name="tab_name">
  <label class="tab_class" for="tab2">タブ2</label>

  <input id="tab3" type="radio" name="tab_name">
  <label class="tab_class" for="tab3">タブ3</label>

  <div class="content_class" id="content1_class">コンテンツ1</div>
  <div class="content_class" id="content2_class">コンテンツ2</div>
  <div class="content_class" id="content3_class">コンテンツ3</div>
</div>
css
/* 全体 */
.area {
    width: 1000px;
}
/* タブ */
.tab_class {
    width: calc(100%/3);
    height: 50px;
    line-height: 50px;
    text-align: center;
    display: block;
    float: left;
    text-align: center;
    transition: all 0.2s ease;
}
.tab_class:hover {
    opacity: 0.75;
}
/* ラジオボタンを非表示に */
input[name="tab_name"] {
    display: none;
}
/* 内容部分 */
.content_class {
    display: none;
    clear: both;     /* floatを解除 */
    overflow: hidden;
}

/* 選択されたタブ */
.area input:checked + .tab_class {
    color: gray;
}
/* 選択されたタブの内容のみを表示 */
#tab1:checked ~ #content1_class,
#tab2:checked ~ #content2_class,
#tab3:checked ~ #content3_class {
    display: block;
}

チェックボックスで表示・非表示

  • ① チェックボックス + ② ラベル(タブ) + ③ 表示させたい内容部分 の3セット。
  • チェックボックスは複数選択可能なので、タブクリックで表示 ⇄ 非表示させたい時に使う。
    • 例)アコーディオンメニュー

例1)

HTML
<div class="area">
    <label for="label1">タブ1</label>
    <input type="checkbox" id="label1"/>
    <div class="content_class">コンテンツ1</div>

    <label for="label2">タブ2</label>
    <input type="checkbox" id="label2"/>
    <div class="content_class">コンテンツ2</div>

    <label for="label3">タブ3</label>
    <input type="checkbox" id="label3"/>
    <div class="content_class">コンテンツ3</div>
</div>
css
/* ラベルにアイコン追加 */
.area label:before {
    display: inline-block;
    content: '\f078';
    transition: 0.2s;
}
/* ボタンホバー */
.area label:hover {
    background: gray;
}
/* チェックボックスは非表示に */
.area input {
    display: none;
}
/* 中身を非表示に */
.area .content_class {
    overflow: hidden;
    opacity: 0;
    transition: 0.8s;
}

/* クリックで内容部分を表示 */
.area input:checked ~ .content_class {
    height: auto;
    opacity: 1;
}
/* アイコンを切り替えとか */
.area input:checked ~ label:before {
    content: '\f00d';            /* 別のアイコンに変更 */
    transform: rotate(360deg);   /* 1回転 */
}

例2)

blade
<div>
    <div>
        <p>タイトル1</p>
        <div>{{ Form::label('label1', '▼ 詳細', ['class'=>'tab_class']) }}</div>
    </div>
    {{ Form::checkbox('tab_name', $array, null, ['id'=>'label1']) }}
    <div class="content_class">コンテンツ1</div>
</div>

<div>
    <div>
        <p>タイトル2</p>
        <div>{{ Form::label('label2', '▼ 詳細', ['class'=>'tab_class']) }}</div>
    </div>
    {{ Form::checkbox('tab_name', $array, null, ['id'=>'label2']) }}
    <div class="content_class">コンテンツ2</div>
</div>
内容部分の表示/非表示
input[name="tab_name"], .content_class {
    display: none;
}
input[name="tab_name"]:checked + .content_class {
    display: block;
}
.tab_class:hover {
    color: black;
}
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1