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

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

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

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

CSS

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

Q&A

解決済

2回答

903閲覧

JavaScriptで、CSSのプロパティ値を変更したいのですが、2度めの変更(元の値に戻す)ができません。

kujiradesign

総合スコア1

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

CSS

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

0グッド

0クリップ

投稿2021/09/17 02:30

前提・実現したいこと

作りたいのは、
少しだけ顔を出してるナビ(↓のソースコードJsのnav)をクリックすると全体が現れて(left = '0')、
ナビ上のボタン(SNB)をクリックするとナビが閉じる(もとの少しだけ顔出し状態に戻る(left = '-130px')というものです。

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

CSSのプロパティ値の書き換えで、最初の書き換えはできて、
ナビは現れるのですが、
それをさらに書き換えてもとの値に戻すのが効きません。
ブラウザのconsoleの表示では-130に戻っていることになっているのですが、
実際のWebページの表示では戻りません。

初心者なんでできっとヘンなところでつまづいてるんやと思います。よろしくお願いします。

該当のソースコード

HTML

<nav class="nav"> <div class="SNBtn"><div></div><div></div></div> <ul> ・・(省略)・・ </ul> </nav>

CSS
.SNBtn {
position: relative; width: 11px; ・・(省略)・・ }
.nav { position: fixed; top: 0; left: -130px; ・・(省略)・・ }

Js(html body内、上記</nav>のあとに書いてます)

<script> const nav = document.querySelector('.nav'); const SNB = document.querySelector('.SNBtn'); nav.addEventListener('click', () => { nav.style.left = '0'; }); SNB.addEventListener('click', () => { nav.style.left = '-130px'; console.log(nav.style.left); }); </script>

試したこと

プロパティをbackGroundColorとか他のに換えて試してみましたが、やはり2度めの書き換えが反映されないようです。
ローカル環境があかんのかなと思て、テストサーバにあげてみましたが、それでも(やっぱり)表示されません。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

クラスの付替えでやってみてはどうでしょうか?

javascript

1<style> 2.SNBtn:not(.active){ 3left:-130px; 4} 5.SNBtn { 6position: absolute; 7width:150px; 8background-Color:red; 9left:0; 10} 11.nav { 12position: fixed; 13top: 0; 14left:0; 15} 16</style> 17<script> 18const nav = document.querySelector('.nav'); 19nav.addEventListener('click',()=>{ 20 document.querySelector('.SNBtn').classList.toggle('active'); 21}); 22</script> 23<nav class="nav"> 24<div class="SNBtn">test</div> 25</nav>

投稿2021/09/17 02:48

yambejp

総合スコア115012

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

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

kujiradesign

2021/09/17 03:51

回答ありがとうございました。 先の方の提案で無事解決しました。 とりいそぎお礼まで。
guest

0

ベストアンサー

SNBtn 要素は nav 要素の子孫なので、SNBtn 要素をクリックすると、

  1. SNBtn 要素の click イベントリスナ
  2. nav 要素の click イベントリスナ

の順番で両方が呼ばれます。よって、SNBtn のイベントリスナでスタイルを書き換えても即座に nav のイベントリスナによって上書きされているのでしょう。

  • SNBtn 要素のイベントリスナで event.stopPropagation() する
  • nav 要素のイベントリスナで event.target.closest('.SNBtn') が真だったらスタイルを変更しない

のどちらかで期待する動作になると思います。

投稿2021/09/17 02:37

int32_t

総合スコア21012

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

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

kujiradesign

2021/09/17 03:48

助かりました。event.stopPropagation()で、すんなり解決しました。 バブリングとかキャプチャリングってことじたい知りませんでした。おかげさまでまた一つ賢くなった気がします。 propagation...プロパガンダのもとになったことばですね。覚えやすいというか・・。 また何かありましたら、よろしくお願いします。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問