peamon.net

クリックで展開・表示されるコンテンツをHTMLとCSSだけで作成したい

"HTML CSS クリック 展開"

普通免許のコンテンツの中にいやらしい問題という、自分がいやらしいなこれは、と思った問題を主観で集めたページがあります。

クリックで展開・表示されるコンテンツをHTMLとCSSだけで作成したいの画像

改善前はこんな感じのページだったんですが、始めは答えを隠しておき、問題をクリックすれば答えが見られるように改善したい。

どんなワードで検索すればいいのか分からなかったので、見つけるのに苦労するかな、と思いきや、"HTML CSS クリック 展開"で検索すると、答えらしきものが1ページ目にいきなり登場。

参考にしたサイト・ページ

主にこの2ページを参考に挑戦します。

"label" "input" "checked" "visibility"

読んでいるだけでは分からんので、1回試してみるのが早いっすね。

サンプル1

HTMLのソース

<label for="mondai_sanple1">これは問題です。</label>
<input type="checkbox" id="mondai_sanple1">

CSSはなし。

"for"と"id"で紐づければ、チェックボックスだけではなく、"これは問題です。"をクリックしてもチェックされる。

紐づけなければ"これは問題です。"をクリックしてもチェックされない。

サンプル2

これは答えです。

HTMLのソース

<label for="mondai_sanple2" class="sotomi">これは問題です。</label>
<input type="checkbox" id="mondai_sanple2" class="mondai_check">
<div class="nakami">
    <p>これは答えです。</p>
</div>

CSSのソース

.nakami  {
    visibility: hidden;
}

.mondai_check:checked + .nakami  {
    visibility: visible;
}

ラベル(外見)…sotomi

input(チェックボックス)…mondai_check

クリックされると表示される中身…nakami

というクラス名を指定。

普段のnakamiはhiddenだけど、mondai_check(input)がchecked(チェックされた状態)になると、mondai_checkに隣接("+"は隣接セレクタ)しているnakamiがvisibleになるよ。

ということらしい。なんとなくだけど手の内に入ったような…。

サンプル3

Q.これは答えです。

HTMLのソース

<label for="mondai_sanple3" class="sotomi">A.これは問題です。</label>
<input type="checkbox" id="mondai_sanple3" class="mondai_check">
<div class="nakami">
    <p>Q.これは答えです。</p>
</div>

CSSのソース

.sotomi  {
    margin-left: 16px;
}

.mondai_check  {
    display: none;
}
            
.nakami  {
    visibility: hidden;
    height: 0;
}

.mondai_check:checked + .nakami  {
    visibility: visible;
    height: auto;
}

sotomiのmargin…sotomiとnakamiの左端を揃えるために微調整をしているだけ。

mondai_checkのdisplay…不要なinputのチェックボックスを消す。

height…折りたたむために指定。普段は0で、クリックするとauto。

あとは細かいデザインを指定して完成のはず。

サンプル4(とりあえず完成)

Q.これは答えです。

Q.これは答えです。

HTMLのソース

<label for="mondai_sanple4" class="sotomi">A.これは問題です。</label>
<input type="checkbox" id="mondai_sanple4" class="mondai_check">
<div class="nakami">
    <p>Q.これは答えです。</p>
</div>

CSSのソース

.sotomi  {
    margin-left: 6px;
    padding: 10px;
    background-color: #ededed;
    display: block;
    font-weight: bold;
    border: solid 1px black;
}

.sotomi:hover  {
    background: #ffffff;
}
    
.mondai_check  {
    display: none;
}

.nakami  {
    visibility: hidden;
    height: 0;
}
    
.mondai_check:checked + .nakami  {
    visibility: visible;
    height: auto;
}

sotomiのdisplay: block;…labelはインライン要素のため、ブロック要素にチェンジ。

sotomi:hover…オンマウス時の変化を指定。スマホでは効かない。

あとはサンプル3と同じ。

ここまで理解するだけでも結構時間がかかっています。疲れたー。

opacityの有無

参考にした2つのページにはopacityが使用されているんだけど必要なんだろうか?

別になくても困らない感じなんだけど…。まぁ、細かいことは気にしないでおこう。もう疲れたし完成で。

後日談:detailsとsummary

しばらくしてから、簡単に開閉式のコンテンツが作成できるdetailsとsummaryというタグを知りました。

サンプル

A.これは問題です。

Q.これは答えです。

HTMLのソース

<details>
    <summary>A.これは問題です。</summary>
    <p>Q.これは答えです。</p>
</details>

CSSのソース

details  {
    margin-left: 15px;
}

summary  {
    padding: 10px;
    background-color: #ededed;
    font-weight: bold;
    border: solid 1px black;
}

details p  {
    margin-left: 26px;
}

他にも矢印が消せたり、オープン時のCSSが指定できたりするみたいなんで、詳細は上記のリンクへどうぞ。

まぁ、どう考えても、こっちのほうがシンプルで早いっすよねぇ。

せっかくうまくいったのに、なんなんだろうこの徒労感は…。