詳細や情報をクリックすることで表示する、いわゆる、スポイラー又はアコーディオンと呼ばれるものをCSSのみで実装します。inputとlabelを使い、displayで切り替えを行います。JavaScriptを用いないためAMPサイトでも利用できます。
クリックするとボックスを表示
[~表示]をクリックすることで、隠れたinputにチェックが入り、それがトリガーとなってチェックされたinputの弟であるdivのCSSが適用され、隠れていたボックスが表示されます。<div>について表示と非表示を切り替える仕組みです。<div>の中身は自由に設計できます。
以下はクリックするとソースコードが記述された<div>が表示されます。
public class MainActivity extends AppCompatActivity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }
スタイルシートで記述
<div id="more-box"> <input id="toggle" class="input-go" type="checkbox" /> <div class="more-open" style="margin: 0px;"><label for="toggle">ソースコードを表示</label></div> <div class="more-close" style="margin: 0px;"><label for="toggle">ソースコードを閉じる</label></div> <div class="more-contents" style="margin: 0px;"> /* more-contens内に表示させたい内容を記述 */ <pre class="brush: java; gutter: false; first-line: 1">public class MainActivity extends AppCompatActivity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } } </pre> </div> </div>
#more-box label{ cursor: pointer; } #more-box input{ display: none; } #more-box input ~ div.more-open { display: inline; } #more-box input ~ div.more-contents { display: none; } #more-box input ~ div.more-close { display: none; } #more-box input:checked ~ div.more-open{ display: none; } #more-box input:checked ~ div.more-contents{ display: inline; } #more-box input:checked ~ div.more-close{ display: inline; }
解説
<label>をクリックすることで見えない状態(display:none;)のinputのチェックを入れる。すると、input:checkedになる。input:checkedの弟のなかで、span.more-openが実行される。+を使用する方法があるが、直近の弟のみが実行されるため、Wordpressなどでは機能しないことがある。そのため、~を使用して弟についてクラスで限定する方法をとっています。
処理の流れ
<label>をクリック→ <input>がチェックされる → チェックされた<input>の弟の<div>に適用
※inputはdisplay:none;ですから、inputは常時表示されない
階層が異なる場合
ここに引用文章がのることになるわけであるが、ほんとうにのるのであろうか
チェックボックスの階層深度と、対象divの深度が異なる場合(a1とb3)は、兄弟関係になるまでさかのぼればよい。
div | 深度1 | 深度2 | 深度3 |
show-box | a1 | ||
b1 | b2 | b3 ここの表示を切り替えたい |
この場合は深度1までさかのぼって兄弟関係を記述すればよい
<div id="show-box"> <input id="toggle-show" class="a1" checked="checked" type="checkbox" /><label for="toggle-show"><span class="show">説明文の表示</span></label> <div class="b1"> <div class="b2"> <blockquote class="b3"> <p>ここに引用文章がのることになるわけであるが、ほんとうにのるのであろうか</p> </blockquote> </div> </div> </div>
#show-box .a1 ~ .b1 .b2 .b3 { display: none; } #show-box .a1:checked ~ .b1 .b2 .b3{ display: block; }
#show-boxは明示的な記述であり、記述しなくても動作する。
使用したCSSの概要
display

display ボックスの表示方法 コピペで使えるHTML+CSS
要素をどのように配置するか、displayを使って決定します。blockやinline、inline-block、そしてflex、そして表示をしないnone、具体的な事例をあげてdisplayによってどのように要素が配置されるかを例示します。
cursor
~セレクタ

CSSの各種セレクタ CSS コピペで使えるHTML+CSS
クラスセレクター、IDセレクターのほか、>や+、~を使った間接、子孫、弟セレクターの使用方法の解説です。~を使って弟を限定する方法についても解説。
文章の続きを読む

続きを読む・閉じるアコーディオンをCSSのみで実装 コピペで使えるHTML+CSS AMP対応
[文章の続きを読む]、いわゆるスポイラー又はアコーディオンと呼ばれるものをCSSのみで実装します。inputとlabel、~セレクタを組み合わせる手法を取ります。JavaScriptを使用しない安全で安定的な方法です。
アニメーションを伴うボックスの表示非表示

CSSのみでクリックによりボックスが開くアニメーション コピペで使えるHTML+CSS
JavaScriptを用いず、CSSのみでアコーディオンアニメーションdivボックスを実現します。ページを読み込んだ際に開いた状態とならないよう、ラジオボタンとチェックボックスの2つをフラグとして利用します。CSSのみで実現できる限界点の一つ。