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

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

新規登録して質問してみよう
ただいま回答率
85.48%
jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

1回答

293閲覧

JQueryによる表示非表示に関して

penginer

総合スコア32

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

1クリップ

投稿2018/03/24 05:43

前提・実現したいこと

jQueryを用いて
「チェックボックスにチェックされたらdivで囲まれた部分を開く。また、チェックボックスはCSSを用いて隠し、
上にlabelタグを用いてその中の文字列と共に四角い枠にする」
というものを作ろうとしています。

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

Google Chromeの検証を見るとエラーは出ておらず、チェックボックス隠蔽とlabelタグの部分は問題ありませんが、
チェックをしてもdivで囲まれた部分が表示されません。
また、下記のコードでは全ての四角の枠が重なり合います。
尚、チェックをしたか否かはjQueryで確認し、Google Chromeの検証を用いてチェックをしたかは確認してあります。
また、CSSとJavascriptのソースはPHPファイルに埋め込んであります。

該当のソースコード

Js

1$(funtion(){ 2 var prop= $('.survey').prop('checked'); 3 $('.hidden_show').css('display', 'none'); 4 if(prop){ 5 $('.hidden_show').show(120); 6 } 7 8});

HTML

1 <p><label for="label1" class="survey_l">属性</label> 2 <input type="checkbox" id="label1" class="survey"></p> 3 <div class="hidden_show"> 4<!--非表示部分--> 5</div> 6<!--これと同じように続いていきますが 7今表示している部分においてdivタグとinputタグのクラスはこの後に続くものも一緒ですがidは全て異なります。 8また、divタグの中にはinputタグ、selectタグ、textareaタグ、spanタグ(クラスは無し。用いるのはすべて名前が異なるid属性)を用いています。 9尚、divタグの全てのクラスが同じなのはあくまでも便宜上の都合です。-->

CSS

1<style type="text/css"> 2.survey_l{ 3 padding: 15px; 4 font-weight: bold; 5 border: solid 2px black; 6 cursor :pointer; 7} 8 9/*チェックは見えなくする*/ 10 .survey { 11 display: none; 12} 13 14/*中身を非表示にしておく*/ 15 .hidden_show { 16 display: none; 17/* height: 0; 18 padding: 0; 19 overflow: hidden; 20 opacity: 0; 21 transition: 0.8s; */ 22}

試したこと

CSSの最後の部分のdisplay:none;を消してコメントアウトを解除すると四角の枠が重なりませんが状況は変わりませんでした。
また、Javascriptの変数propをチェックボックスのidにしましたがそれでも状況は変わりませんでした。

補足情報(FW/ツールのバージョンなど)

jQuery:3.2.0
jQueryはheadタグの中で既に読み込んでおり、パスも正しいです。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

あなたの意図している動きはこんな感じでしょうか?
(jQueryに依存しない形で作ってみました)

HTML

1<p class="controller hidecontents"> 2 <label>属性<input type="checkbox" autocomplete="off"/></label> 3</p> 4<div> 5contents<br/> 6contents<br/> 7contents<br/> 8contents<br/> 9contents<br/> 10contents 11</div>

CSS

1input[type="checkbox"]{ 2 display: none; 3} 4p.controller+div{ 5 transition: all 120ms ease-in-out; 6 overflow: hidden; 7 background-color: yellow; 8 line-height: 2ex; 9} 10p.controller.hidecontents+div{ 11 line-height: 0ex; 12 opacity: 0; 13}

JavaScript

1document.onchange = e => { 2 const target = e.target; 3 const p = target.closest("p.controller"); 4 if(!p){return;} 5 p.classList[target.checked ? "remove": "add"]("hidecontents"); 6}

http://jsdo.it/defghi1977/aY1x


もっとシンプルに出来るのではなかろうか?と試してみたもの.
input[type="checkbox"]だと, 選択状態と表示状態が重複するため, classList.toggleを使ってクラスの存在有無に状態を集約してみたもの.

3/30追記:
pointer-eventsを指定しないとクリックイベントが発生しにくいという問題が合ったのを修正しました.

CSS

1p.controller+div{ 2 transition: all 120ms ease-in-out; 3 line-height: 1em; 4 background-color: yellow; 5 pointer-events: unset; 6} 7p.controller.hidecontents+div{ 8 line-height: 0em; 9 opacity: 0; 10 pointer-events: none; 11}

HTML

1<p class="controller hidecontents" onclick="this.classList.toggle('hidecontents')"> 2 属性 3</p> 4<div> 5contents<br/> 6contents<br/> 7contents<br/> 8contents<br/> 9contents<br/> 10contents 11</div>

http://jsdo.it/defghi1977/cabg

投稿2018/03/24 07:22

編集2018/03/30 05:53
defghi1977

総合スコア4756

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

defghi1977

2018/03/24 09:02

うーん, jQuery使ってるんだからtoggleClass使えば無理にチェックボックス使わんでも良い気がしてきた
penginer

2018/03/30 05:42

返信が遅くなってしまい申し訳ありません。 結局checkboxだと扱いが面倒になったのでtoggleClassを用いて行っているのですが この場合どうするかご教授いただいてもよろしいでしょうか。
defghi1977

2018/03/30 05:55

> 結局checkboxだと扱いが面倒になったのでtoggleClassを用いて行っているのですが この場合どうするかご教授いただいてもよろしいでしょうか。 classList.toggleがjQueryのtoggleClassに相当するので, そう読み替えて下さい
penginer

2018/03/30 06:28

ありがとうございました。 最後に質問なのですが完成時にできる隙間はどう埋めればよろしいでしょうか?
penginer

2018/03/30 09:31

解決しました。 CSSのセレクタにbrを追加して hidecontentsにdisplay:none;を書いて解決しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問