Ajaxで外部html+javascriptを取得する度に、javascriptでの動作をリセット(初期化)する方法を探しています。
index.htmlの<nav>の<a>リンクをクリックしたときに<main>部分を、Ajaxで取得するように実装しています。
<a>リンク先htmlは、home,about,works,contactで、index.htmlを最初に開いた時は、<main>部分はhome.htmlを取得した状態で開かれるようにしています。
そのhome.htmlにて、javascriptでテキストの一部が繰り返し、一定のリズムで切り替わるテキストエフェクトを実装したい(codepenをマネしました)のですが、以下問題に当たってしまいました。
発生している問題
Ajaxでhome.htmlを取得する度に、home.htmlのjavascriptの値が増えてしまい、実装したいテキストエフェクトのリズムが乱れ、テキストが重なってしまいます。
index.htmlでhome.htmlを再度取得した時も、初期ページと同じように、テキストエフェクトを一定のリズムで切り替わるようにjavascriptを動かすにはどのようにすればよいかご教示頂きたく、
わかりづらく申し訳ないですが、お力添え頂けると幸甚です。
該当のソースコード
html
1 Index.html 2 3 <nav id="type5"> 4 <ul> 5 <li><a href="home/home.html">Home</a></li> 6 <li><a href="about/about.html">About</a></li> 7 <li><a href="works/works.html">works</a></li> 8 <li><a href="contact/contact.html">Contact</a></li> 9 </ul> 10 </nav> 11 <main> 12 <div class="pageDisplay"></div> 13 </main> 14 <script src="js/index.js" type="text/x-javascript"></script>
js
1index.js 2 3$(function(){ 4 //ページを表示させる箇所の設定 5 var $content = $('.pageDisplay'); 6 //ボタンをクリックした時の処理 7 $(document).on('click', '#type5 a',function(event) { 8 event.preventDefault(); 9 //.menu aのhrefにあるリンク先を保存 10 var link = $(this).attr("href"); 11 //リンク先が今と同じであれば遷移しない 12 if(link == lastpage){ 13 return false; 14 }else{ 15 $content.fadeOut(600, function() { 16 getPage(link); 17 }); 18 //今のリンク先を保存 19 lastpage = link; 20 } 21 22 }); 23 //初期設定 24 getPage("home/home.html"); 25 var lastpage = "home/home.html"; 26 27 //ページを取得してくる 28function getPage(elm){ 29 $.ajax({ 30 type: 'GET', 31 url: elm, 32 dataType: 'html', 33 }).done(function (data) { 34 $content.html(data).fadeIn(600); 35 }).fail(function (data){ 36 alert('問題がありました。'); 37 }); 38 } 39});
html
1home.html, home.js 2 3 <div class="rotating-text"> 4 <p>CSS Animation is</p> 5 <p> 6 <span class="word alizarin">awesome.</span> 7 <span class="word wisteria">beautiful.</span> 8 <span class="word peter-river">creative.</span> 9 <span class="word emerald">fabulous.</span> 10 <span class="word sun-flower">interesting.</span> 11 </p> 12</div> 13 <script> 14"use strict"; 15var words = document.querySelectorAll(".word"); 16words.forEach(function (word) { 17 var letters = word.textContent.split(""); 18 word.textContent = ""; 19 letters.forEach(function (letter) { 20 var span = document.createElement("span"); 21 span.textContent = letter; 22 span.className = "letter"; 23 word.append(span); 24 }); 25}); 26var currentWordIndex = 0; 27var maxWordIndex = words.length - 1; 28words[currentWordIndex].style.opacity = "1"; 29var rotateText = function () { 30 var currentWord = words[currentWordIndex]; 31 var nextWord = currentWordIndex === maxWordIndex ? words[0] : words[currentWordIndex + 1]; 32 // rotate out letters of current word 33 Array.from(currentWord.children).forEach(function (letter, i) { 34 setTimeout(function () { 35 letter.className = "letter out"; 36 }, i * 80); 37 }); 38 // reveal and rotate in letters of next word 39 nextWord.style.opacity = "1"; 40 Array.from(nextWord.children).forEach(function (letter, i) { 41 letter.className = "letter behind"; 42 setTimeout(function () { 43 letter.className = "letter in"; 44 }, 340 + i * 80); 45 }); 46 currentWordIndex = 47 currentWordIndex === maxWordIndex ? 0 : currentWordIndex + 1; 48}; 49rotateText(); 50setInterval(rotateText, 4000); 51 </script>
js
1home.js (home.htmlに直打ちしています) 2 3"use strict"; 4var words = document.querySelectorAll(".word"); 5words.forEach(function (word) { 6 var letters = word.textContent.split(""); 7 word.textContent = ""; 8 letters.forEach(function (letter) { 9 var span = document.createElement("span"); 10 span.textContent = letter; 11 span.className = "letter"; 12 word.append(span); 13 }); 14}); 15var currentWordIndex = 0; 16var maxWordIndex = words.length - 1; 17words[currentWordIndex].style.opacity = "1"; 18var rotateText = function () { 19 var currentWord = words[currentWordIndex]; 20 var nextWord = currentWordIndex === maxWordIndex ? words[0] : words[currentWordIndex + 1]; 21 // rotate out letters of current word 22 Array.from(currentWord.children).forEach(function (letter, i) { 23 setTimeout(function () { 24 letter.className = "letter out"; 25 }, i * 80); 26 }); 27 // reveal and rotate in letters of next word 28 nextWord.style.opacity = "1"; 29 Array.from(nextWord.children).forEach(function (letter, i) { 30 letter.className = "letter behind"; 31 setTimeout(function () { 32 letter.className = "letter in"; 33 }, 340 + i * 80); 34 }); 35 currentWordIndex = 36 currentWordIndex === maxWordIndex ? 0 : currentWordIndex + 1; 37}; 38rotateText(); 39setInterval(rotateText, 4000);
css
1home.css 2 3.rotating-text { 4 font-family: Lato, sans-serif; 5 font-weight: 600; 6 font-size: 36px; 7 color: black; 8 transform: translateX(-80px); 9} 10.rotating-text p { 11 display: inline-flex; 12 margin: 0; 13 vertical-align: top; 14} 15.rotating-text p .word { 16 position: absolute; 17 display: flex; 18 opacity: 0; 19} 20.rotating-text p .word .letter { 21 transform-origin: center center 25px; 22} 23.rotating-text p .word .letter.out { 24 transform: rotateX(90deg); 25 transition: 0.32s cubic-bezier(0.6, 0, 0.7, 0.2); 26} 27.rotating-text p .word .letter.in { 28 transition: 0.38s ease; 29} 30.rotating-text p .word .letter.behind { 31 transform: rotateX(-90deg); 32} 33 34.alizarin { 35 color: #e74c3c; 36} 37 38.wisteria { 39 color: #8e44ad; 40} 41 42.peter-river { 43 color: #3498db; 44} 45 46.emerald { 47 color: #2ecc71; 48} 49 50.sun-flower { 51 color: #f1c40f; 52}
html
1about.html 2<h1>about作成中</h1> 3 4works.html 5<h1>works作成中</h1> 6 7contact.html 8<h1>contact作成中</h1>
補足情報(FW/ツールのバージョンなど)
jQuery3.4.1
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/25 12:28
2020/07/25 12:42 編集
2020/07/25 14:17