私は jQuery での作業に慣れているため、単純な Javascript でこれを行う方法を理解できないようです。これは私がサイトで使用する唯一のスニペットであり、ライブラリはその目的には大きすぎるため、jQuery を使用したくありません。
これはjQueryスクリプトです(動作中): http://jsfiddle.net/1jt6dhzu/2/
$(document).ready(function () {
var whatAmI = ["Fruit", "Not a vegetable", "A phone", "Yummie in tummy"];
var j, i = 4,
n = whatAmI.length;
function changeSubTitle() {
setTimeout(function () {
j = Math.floor(Math.random() * n - 1);
if (j >= i) j += 1;
$(".page-header > h2").animate({
"opacity": 0
}, 700, function () {
$(this).children("span").text(whatAmI[j]);
$(this).animate({
"opacity": 1
}, 700, changeSubTitle);
});
}, 1000);
i = j;
}
changeSubTitle();
});
そして、それをvanilla JSに交換したいと思います。ループの大部分はそのままで構いませんが、タイムアウトとコールバックを置き換える必要があります。私はIE9のサポートを必要としないので、css3トランジションでこれを行い、クラスを追加できると考えました。これは私がこれまでに持っているものです:
h2 {
opacity: 1;
transition: opacity 700ms;
}
h2.fade-out {
opacity: 0;
}
document.addEventListener("DOMContentLoaded", function () {
var whatAmI = ["Fruit", "Not a vegetable", "A phone", "Yummie in tummy"];
var j, i = 4,
n = whatAmI.length,
heading = document.querySelector(".page-header > h2");
function changeSubTitle() {
setTimeout(function () {
j = Math.floor(Math.random() * n - 1);
if (j >= i) j += 1;
heading.classList.add("fade-out");
setTimeout(function () {
heading.children("span")[0].innerHTML = whatAmI[j];
heading.classList.remove("fade-out");
setTimeout(changeSubTitle, 700);
}, 700);
}, 1000);
i = j;
}
changeSubTitle();
});
残念ながら、これは機能しません。transitionend のイベントの timeOuts (最も外側のものを除く) を交換する方がおそらく良いでしょう。しかし、このクロスブラウザー (IE 10 以降、およびその他の主要なブラウザー) を実装する方法がわかりません。