
かつてはJavaScriptを利用していたものの、今ではCSSのみで実装できる10の小技
https://www.webcreatorbox.com/tech/js-to-css
この記事の中のスライドパネルをカスタマイズしたいと思っています。
<div class="box">
<div class="left">
<label for="check2">NO</label>
<input id="check2" type="checkbox">
<div class="panel2">
<p>ちがうよ</p>
</div>
</div>
<div class="right">
<label for="check3">YES</label>
<input id="check3" type="checkbox">
<div class="panel3">
<p>そうだね</p>
</div>
</div>
</div>
.box {
display: flex;
}
ほかのCSSは基本的に参考サイトと同じです。(check*の部分は変えました)
フレックスボックスで横並びにして、クリックすることでパネルを開くことはできます。
やりたいことは、「NO」あるいは「YES」をクリックすることで片方のボタンを非表示にしたいのです。これが、CSSだけで実現できるのでしょうか。あるいは、他の方法があれば教えてください。
No.2ベストアンサー
- 回答日時:
No1です
補足でご説明のような内容だと状態を保持する必要がありそうですが、No1で示した:targetを利用する方法では状態を保持できません。targetが外れれば元の表示に戻ってしまいます。
これに関しては、ご提示の参考サイトのチェックボックス利用の仕組みでも同じです。
再度クリックすると元の状態に戻ってしまうことをご確認ください。
無理やりやるなら、ラジオボタンにして他方を消すことで状態を維持することはできますが、誤操作でクリックした場合でも訂正はできないということになります。
CSSでユーザのアクションに対応できる仕組みは限られている上に、セレクタで指定できる内容は子孫要素か兄弟要素で祖先には遡れないという限界があるかと思います。
なぜ、CSSのみなのかがわかりませんが、素直にスクリプトを利用なさった方が良いのではないでしょうか?
無理やりということで以下のようなものを試みてみましたが、CSSのための文書構造みたいになってしまい本末転倒の感があります。
以下、CSSはかなり適当ですが・・・
<!DOCTYPE HTML>
<html lang="ja">
<head><title>Sample</title>
<style type="text/css">
.top, .Q { width:600px; overflow:hidden; }
.Q {
margin-left:-600px; opacity:0;
padding-top:10px;
transition: opacity 1s 0.3s;
}
.top p:first-child {
width:75%; min-height:50px;
float:left;
margin:0 30px 0 0;
border:1px solid #DDD;
}
.top input { display:none; }
.top .lbl {
display: block; float:right;
width:50px; height:50px;
margin-right:5px;
}
.top label {
display:inline-block;
width:100%; height:100%;
text-align:center; line-height:50px;
border-radius: 4px;
color: #FFF; background: #0BD;
transition: 0.5s;
}
.top input:checked + .lbl label { transform: scale(0, 0) rotate(360deg); }
.top input:checked ~ div.Q { margin-left:0; opacity:1; }
</style>
</head>
<body>
<div class="top">
<p>質問その1</p>
<input type="radio" name="Q1" id="Q1n" />
<span class="lbl"><label for="Q1y">NO</label></span>
<input type="radio" name="Q1" id="Q1y" />
<span class="lbl"><label for="Q1n">YES</label></span>
<div class="Q">
<p>質問その2</p>
<input type="radio" name="Q2" id="Q2n" />
<span class="lbl"><label for="Q2y">NO</label></span>
<input type="radio" name="Q2" id="Q2y" />
<span class="lbl"><label for="Q2n">YES</label></span>
<div class="Q">その次</div>
</div>
</div>
</body>
</html>
回答ありがとうございます。
動作としては思った通りのものになっています。ただ、YES、NOで質問を出し分ける方法がわたしには思いつかないので、これをもとにカスタマイズは断念します。
質問にも書いてありますが、CSSにこだわっているわけではありません。(たまたまCSSで作られているコードがあったのでその応用はできないかと……) jQueryとか使えればいいのでしょうが……。
No.1
- 回答日時:
こんにちは
>「NO」あるいは「YES」をクリックすることで片方のボタンを非表示にしたいのです。
え~っと。YESをクリックしてNOを消すと、NOはずっと消えたままになっちゃうので、クリックした方のボタンを消すということで良いのでしょうか?
(自分自身が非表示になる)
参考に挙げられたサイトのように隣接セレクタを利用するというよりは、自分自身(または親要素)を操作することになってしまうので、別の方法で実現してみました。
(リンクの:targetを利用した方法です)
「そうだね」「ちがうよ」の文字部分も非表示の対象なのかよくわかりませんでしたが、HTML5ではリンク要素でもブロック要素を包含できるようになったので、そこまでも含むものとして包含させてあります。
互いに相手をtargetにすれば相手側が非表示になりますが、今回は、上記のように自分を消すものと解釈しましたので、自分自身がtargetになるように設定しています。
非表示の方法は、ひとまずopacity:0にしているだけなので、見えなくなってはいますが要素は存在する状態です。それなので、クリックもできるはずです。
(完全に非表示になさりたい場合は、この辺りを調整してください)
以下、テスト例です。
<!DOCTYPE HTML>
<html lang="ja">
<head><title>Sample</title>
<style type="text/css">
.box { display: flex; }
.label {
display: inline-block;
padding: 10px 20px;
border-radius: 4px;
background: #0bd;
color: #FFF;
}
.label:hover { background: #0090aa; }
/** 今回の仕組みのCSS **/
.box a { display:block; transition:0.5s; }
.box a:target { opacity:0; }
</style>
</head>
<body>
<div class="box">
<div class="left">
<a href="#check2" id="check2">
<span class="label">NO</span>
<div class="panel2">
<p>ちがうよ</p>
</div>
</a>
</div>
<div class="right">
<a href="#check3" id="check3">
<span class="label">YES</span>
<div class="panel3">
<p>そうだね</p>
</div>
</a>
</div>
</div>
</body>
</html>
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
liリストタグの背景色に色がつ...
-
cssでIEとFIREFOX(とchrome)の...
-
idの中のid指定
-
htmlの文字が縦書きになる
-
1から100までの自然数のうち、2...
-
1時間30分を簡単に表したいで...
-
画像タグについて
-
GoogleのトップページをCSSで書...
-
マージソートの計算量について-...
-
既婚男女の方、結婚前と結婚後...
-
input type="hidden"で取得した...
-
配列の要素をまとめて比較したい
-
インラインフレームのページ内...
-
HTML属性での「""」 「''」違い
-
テンソル解析(絶対微分学)は...
-
見た目と声さえ良ければ、他の...
-
html divボックスの入れ子で中...
-
HRタグ 枠線を透明にするには?
-
CSS Validation Serviceでの検...
-
CSSで改行後の行間調整
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
htmlのid属性って必要なの?
-
個別にリンクの色を変える方法
-
idの中のid指定
-
liリストタグの背景色に色がつ...
-
サイトにjQueryが使用されてい...
-
HTML要素のid/class名の長さに...
-
CSSのクラス名・ID名の指定でワ...
-
a要素の色を複数使い分ける方法
-
FC2掲示板をトピック一覧表示型...
-
スタイルシートについて
-
brにクラスをつけてcssでdispla...
-
CSSに同じclass名がいっぱい‥。...
-
webデザイン 疑問点
-
親エレメントに含まれる子エレ...
-
CSS 記事内link色変更方法
-
CSS内で使われる山括弧の意味が...
-
cssでIEとFIREFOX(とchrome)の...
-
css:positionの挙動について
-
スタイルシートのドットが#に...
-
dreamweaverのコード画面で波線。
おすすめ情報
回答ありがとうございます。
>YESをクリックしてNOを消すと、NOはずっと消えたままになっちゃう
消えて欲しいのです。
用途としては、チャート表で利用しようと思っています。YES、NOに答えていくと結果が出るみたいなものです。全体図を載せるのではなく、質問がありそれに対してYES、NOを選択すると次の質問とYES、NOの選択肢が出てくる(これが繰り返される)イメージです。選択した質問と選択肢が残って結果が最後に表示されるイメージです。