🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaScript

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

CSS

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

Q&A

解決済

1回答

827閲覧

JavaScript+CSSアニメーション

teratailll

総合スコア2

JavaScript

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

CSS

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

0グッド

0クリップ

投稿2021/01/27 14:00

CSSアニメーションで、下記のようなソースがあります
これをJavaScriptで制御したいです
制御する動作は次へボタンを押すとテキストが切り替わる、というものです
nth-childの動的操作はJavaScriptで可能でしょうか?
JQueryの利用は考えていません

<style> .container{ width:100%; height: 100%; } .texts p{ color: black; font-size: 50px; opacity:0; } .texts p:nth-child(1) { animation: text-anim 5s 0s;} .texts p:nth-child(2) { animation: text-anim 5s 5s;} .texts p:nth-child(3) { animation: text-anim 5s 10s;} .texts p:nth-child(4) { animation: text-anim 5s 15s;} .texts p:nth-child(5) { animation: text-anim 5s 20s;} .texts p:nth-child(6) { animation: text-anim 5s 25s;} .texts p:nth-child(7) { animation: text-anim 5s 30s;} .texts p:nth-child(8) { animation: text-anim 5s 35s;} .texts p:nth-child(9) { animation: text-anim 5s 40s;} .texts p:nth-child(10) { animation: text-anim 5s 45s;} .texts p:nth-child(11) { animation: text-anim 5s 50s;} .texts p:nth-child(12) { animation: text-anim 5s 55s;} .texts p:nth-child(13) { animation: text-anim 5s 60s;} @keyframes text-anim { 0%, 100% {opacity: 0;} 20%, 80% {opacity: 1;} } </style> <input type="button" value="次へ"> <div class="container"> <div class="texts"> <p>吾輩は猫である 名前はまだ無い</p> <p>どこで生れたか とんと見当がつかぬ</p> <p>何でも薄暗いじめじめした所で ニャーニャー泣いていた事だけは記憶している</p> <p>吾輩はここで始めて 人間というものを見た</p> <p>しかもあとで聞くとそれは</p> <p>書生という人間中で一番 獰悪な種族であったそうだ</p> <p>この書生というのは時々我々を 捕て煮て食うという話である</p> <p>しかしその当時は何という考もなかったから</p> <p>別段恐しいとも思わなかった</p> <p>ただ彼の掌に載せられて スーと持ち上げられた時何だか</p> <p>フワフワした感じが あったばかりである</p> <p>掌の上で少し落ちついて 書生の顔を見たのが</p> <p>いわゆる人間というものの 見始めであろう</p> </div> </div>

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

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

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

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

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

guest

回答1

0

ベストアンサー

ボタンにidを追加。

html

1<input type="button" value="次へ" id="next-btn">

css

1.container{ 2 width:100%; 3 height: 100%; 4 position: relative; 5} 6 7.texts p{ 8 color: black; 9 font-size: 50px; 10 opacity:0; 11 position: absolute; 12} 13 14.texts > p.show { animation: text-anim 5s;} 15 16@keyframes text-anim { 17 0%, 100% {opacity: 0;} 18 20%, 80% {opacity: 1;} 19}

js

1let i = -1; 2let targets = document.querySelectorAll('.texts > p'); 3 4document.getElementById("btn").onclick = function() { 5 if(i >= targets.length - 1){ 6 alert('終わり'); 7 }else{ 8 if(i > -1){ targets[i].classList.remove("show")} 9 i++; 10 targets[i].classList.add("show") 11 } 12}

追記

コメントで、下記の仕様が追加されましたので書き換えました。

  • 「前へ」、「次へ」ボタン
  • 次へを押して終わりなら、最初に戻す。
  • 前へを押して終わりなら、最後に戻す。

js

1let i = -1; 2let targets = document.querySelectorAll('.texts > p'); 3 4document.getElementById("back-btn").onclick = function() { 5 i <= 0 ? i=targets.length - 1 : i--; 6 setShow(i); 7} 8document.getElementById("next-btn").onclick = function() { 9 i >= targets.length - 1 ? i=0 : i++; 10 setShow(i); 11} 12function setShow(i) { 13 let el = document.querySelector('p.show'); 14 if(el){el.classList.remove("show")}; 15 targets[i].classList.add("show"); 16}

投稿2021/01/27 15:46

編集2021/01/28 01:31
hatena19

総合スコア34073

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

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

teratailll

2021/01/27 16:22

document.getElementById("btn") ↓ document.getElementById("next-btn") にしたら動きました! 戻るも付けることは可能でしょうか?
miyabi_takatsuk

2021/01/27 17:42

横槍失礼します。 応用でできるはずなので、 自身でやってみてはいかがでしょうか。
teratailll

2021/01/27 23:37

前へ、次へを付けました <style> .container{ width:100%; height: 100%; position: relative; color: white; } .texts p{ color: white; font-size: 50px; opacity:0; position: absolute; } .texts > p.show { animation: text-anim 5s;} @keyframes text-anim { 0%, 100% {opacity: 0;} 20%, 80% {opacity: 1;} } </style> <input type="button" value="前へ" id="back-btn"> <input type="button" value="次へ" id="next-btn"> <div class="container"> <div class="texts"> <p>吾輩は猫である 名前はまだ無い</p> <p>どこで生れたか とんと見当がつかぬ</p> <p>何でも薄暗いじめじめした所で ニャーニャー泣いていた事だけは記憶している</p> </div> </div> <script> let i = -1; let targets = document.querySelectorAll('.texts > p'); document.getElementById("back-btn").onclick = function() { if(i >= 0){ i=targets.length-1; }else{ if(i > 0){ targets[i].classList.remove("show")} i--; targets[i].classList.add("show") } } document.getElementById("next-btn").onclick = function() { if(i >= targets.length - 1){ i=0; }else{ if(i > -1){ targets[i].classList.remove("show")} i++; targets[i].classList.add("show") } } </script> もし、次へを押して終わりなら、最初に戻す。 もし、前へを押して終わりなら、最後に戻す。 という処理がしたいのですが、動きません 何か間違いありますでしょうか?
hatena19

2021/01/28 01:34

そのような仕様になると、現状のコードでは条件判断が面倒そうなので、一から書き直しました。 回答に追記しましたので参考にしてください。
teratailll

2021/01/28 01:43

すごすぎです forと書かずi >= targets.length - 1 ? i=0 : i++;でなぜ動くのかも全く理解できませんが 色んな書き方があるんですね、、、 ありがとうございます
teratailll

2021/01/28 01:50

forを使ってるわけではないんですね。。。 ベストアンサーにさせていただきます
teratailll

2021/01/28 01:56

ちなみになぜ、これではなぜ動かなかったんでしょうか? 次へも前へもその終わりを迎えたら0に戻すのと最後に戻す処理であってませんか? <style> .container{ width:100%; height: 100%; position: relative; color: white; } .texts p{ color: white; font-size: 50px; opacity:0; position: absolute; } .texts > p.show { animation: text-anim 5s;} @keyframes text-anim { 0%, 100% {opacity: 0;} 20%, 80% {opacity: 1;} } </style> <input type="button" value="前へ" id="back-btn"> <input type="button" value="次へ" id="next-btn"> <div class="container"> <div class="texts"> <p>吾輩は猫である 名前はまだ無い</p> <p>どこで生れたか とんと見当がつかぬ</p> <p>何でも薄暗いじめじめした所で ニャーニャー泣いていた事だけは記憶している</p> </div> </div> <script> let i = -1; let targets = document.querySelectorAll('.texts > p'); document.getElementById("back-btn").onclick = function() { if(i >= 0){ i=targets.length-1; }else{ if(i > 0){ targets[i].classList.remove("show")} i--; targets[i].classList.add("show") } } document.getElementById("next-btn").onclick = function() { if(i >= targets.length - 1){ i=0; }else{ if(i > -1){ targets[i].classList.remove("show")} i++; targets[i].classList.add("show") } } </script>
hatena19

2021/01/28 02:48 編集

i >= targets.length - 1 ? i=0 : i++; に関しては「js 三項演算子」「js if ショートハンド」あたりをキーワードに検索すると解説が見つかります。if文が1行で書ける便利なものです。 コードが想定通りに動かない原因を特定する作業をデバッグといいますが、ここはご自身でデバッグ作業をして原因を特定することをお勧めします。その方が確実にスキルアップになります。 やり方が分からなければ「js デバッグ」で検索してみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問