У меня есть код, который увеличивает каждую букву заданного слова, начиная с буквы «А», до тех пор, пока не достигнет буквы адресата. Вы можете увидеть пример в фрагменте кода ниже. Код работает, когда я нацелен на один идентификатор div, но я хочу сделать его таким образом, чтобы он применял этот приращающийся текстовый эффект к каждому блоку текста с присвоенным ему классу «block».Доступ к этому классу с использованием каждой функции
$(document).ready(function() {
console.log("ready!");
$('.block').each(function() {
function Letter(table, letter, duration) {
this.table = table;
this.letter = letter;
this.current = 0;
this.delay = duration/tbl.indexOf(letter); // ms
this.time = Date.now();
this.done = false;
}
Letter.prototype.update = function() {
if (this.done) return;
var time = Date.now();
if (time - this.time >= this.delay) {
this.time = time;
if (this.letter === this.table[this.current] || this.current === this.table.length) {
this.done = true;
} else {
this.current++;
}
}
};
var word = $(this).html();
console.log('Word: ' + word);
var tbl = " ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var letters = [];
word.toUpperCase().split("").forEach(function(l) {
letters.push(new Letter(tbl, l, 2500))
console.log(l);
});
(function loop() {
var txt = "",
isDone = true;
letters.forEach(function(l) {
l.update();
if (!l.done) isDone = false;
txt += l.table[l.current];
});
// output txt
//$("div#d").html(txt);
$(this).parent('.block').html(txt);
if (!isDone) requestAnimationFrame(loop);
else { /* done */ }
})();
});
});
Я пытаюсь вывести увеличивающийся эффект на каждый текстовый бит с классом «блок», присвоенный ему:
$(this).parent('.block').html(txt);
Я пытаюсь целью каждого класса «блок» с вышеизложенным строка кода, но она не работает. Как я могу это сделать?
Обратите внимание, с этой линией «Слово» приращения независимо падает внутри «блок» метка:
var word = $(this).html();
$(document).ready(function() {
console.log("ready!");
$('.block').each(function() {
function Letter(table, letter, duration) {
this.table = table;
this.letter = letter;
this.current = 0;
this.delay = duration/tbl.indexOf(letter); // ms
this.time = Date.now();
this.done = false;
}
Letter.prototype.update = function() {
if (this.done) return;
var time = Date.now();
if (time - this.time >= this.delay) {
this.time = time;
if (this.letter === this.table[this.current] ||
this.current === this.table.length) {
this.done = true;
} else {
this.current++;
}
}
};
var word = $(this).html();
console.log('Word: ' + word);
var tbl = " ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var letters = [];
word.toUpperCase().split("").forEach(function(l) {
letters.push(new Letter(tbl, l, 2500))
console.log(l);
});
(function loop() {
var txt = "",
isDone = true;
letters.forEach(function(l) {
l.update();
if (!l.done) isDone = false;
txt += l.table[l.current];
});
// output txt
//d.innerHTML = txt;
$("div#d").html(txt);
if (!isDone) requestAnimationFrame(loop);
else { /* done */ }
})();
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id=d></div>
<div id="other_spans">
<span class="block">First</span>
<span class="block">Second</span>
<span class="block">Third</span>
Где должны быть возвращены на результат? К тому же элементу '# d'? – guest271314
Не то, о чем вы спрашиваете, но не мог ли конструктор 'Letter()' 'и' update() 'перед циклом' .each()? Они не являются частью логики цикла. Кроме того, я надеюсь, что вы не против, но я отредактировал ваш вопрос, чтобы исправить отступ кода (без изменений самого самого кода), потому что было трудно понять, где заканчивается каждый блок. – nnnnnn
@ guest271314 каждому результату возвращается соответствующий элемент класса .block. Другими словами, в приведенном выше примере «Первый», «Второй» и «Третий» все будут отображаться приращающимся эффектом, потому что у них есть «блокирующий» диапазон вокруг них. – cpcdev