Печатающийся текст на экране (Javascript)
Раньше этот скрипт стоял на этом сайте, но однажды я решил его убрать. Не потому что он плохо работал, а потому что, по некоторым соображениям, я посчитал его лишним. Но чтобы скрипт сохранился, я решил создать этот пост. Велика вероятность, что он мне еще пригодится.
Скрипт ниже имитирует печатание заголовков статей на экране в виде ссылки на саму статью. Заголовки указываются в скрипте и также указываются УРЛы к ним. Скрипт создает ссылки из переданных данных и печатает ссылки в одной строке поочередно.
ДемоА это код скрипта:
Рекомендую: <a id="Ticker" href="http://example.com/default_link">Здесь можно вписать дефолтную ссылку.</a>
<script>
autotypingText( {
typingSpeed: 50, // скорость печатания
switchTimeout: 2000, // время ожидания перед переключением между элементами
element: document.getElementById( 'Ticker' ),
data: [
{
text: 'Плагин Webmaster Yandex для WordPress',
url: 'http://wp-kama.ru/4015'
},
{
text: 'Kama Thumbnail: плагин WordPress для создание картинок-миниатюр записи',
url: 'http://wp-kama.ru/142'
},
{
text: 'Настраиваем robots.txt для WordPress',
url: 'http://wp-kama.ru/id_803/pishem-pravilnyiy-robotstxt-dlya-wordpress.html'
},
{
text: 'WP-Cumulus: 3D облако меток на flash (улучшенная русская версия)',
url: 'http://wp-kama.ru/4271'
},
{
text: 'Плагин для защиты от спама в комментариях WordPress',
url: 'http://wp-kama.ru/95'
},
{
text: 'Плагин для легкого управления сайтом на WordPress (версия 3)',
url: 'http://wp-kama.ru/note/plagin-dlya-legkogo-upravleniya-saytom-na-wordpress-versiya-3'
},
{
text: 'Автоматическое растягивание textarea на javascript и jQuery',
url: 'http://wp-kama.ru/112'
},
],
} )
/**
* Печатание текста - Тиккер
* @param {object} args
*/
function autotypingText( args ){
let itemCount = Number( args.data.length );
let curItemIndex = -1;
let currentLength = 0;
let theText = '';
runTheTicker();
function runTheTicker(){
let theHold
// Переход к следующему элементу
if( currentLength === 0 ){
curItemIndex++;
curItemIndex = curItemIndex % itemCount;
theText = args.data[curItemIndex].text.replace( /"/g, '-' );
args.element.href = args.data[curItemIndex].url;
}
// Располагаем текущий текст в анкор с печатанием
args.element.innerHTML = theText.substring( 0, currentLength ) + znak();
// Преобразуем длину для подстроки и определяем таймер
if( currentLength !== theText.length ){
currentLength++;
theHold = args.typingSpeed;
}
else{
currentLength = 0;
theHold = args.switchTimeout;
}
// Повторяем цикл с учетом задержки
setTimeout( runTheTicker, theHold );
}
function znak(){
return ( currentLength === theText.length ) ? '' : '|';
}
}
</script>
Данные
Можно получать динамичестки в WordPress. Допустим, можно получать записи с произвольным полем "Рекомендую" и вывести их в нужном формате. Для WordPress код будет таким:
<?php
$query = new WP_Query( 'meta_key=my_recommended' );
$data = [];
while( $query->have_posts() ){
$query->the_post();
$data[] = [
'text' => get_the_title(),
'url' => get_permalink()
];
}
wp_reset_query();
$dataJsObject = json_encode( $data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT );
?>
<script>
autotypingText( {
typingSpeed: 50, // скорость печатания
switchTimeout: 2000, // время ожидания перед переключением между элементами
element: document.getElementById( 'Ticker' ),
data: <?= $dataJsObject ?>,
} );
</script>
Просто печатающийся текст
Раз уж речь зашла о печатании текста на экране, то наверное правильно было бы привести пример простого печатания обычного или необычного текста, тут уж от автора зависит. Как и до этого: сначала пример, а затем код:
Пример
<div id="my-text">
Этот текст печатается сам. И не важно, что вы не смотрите на него или даже не
смотрите вообще куда-либо. Он будет продолжать печататься со стабильной скоростью:
одна буква / 50 милесекунд. <br><br>
Как видите, можно напечатать даже переносы строк. <br><br>
В прочем это не печатание, а вывод уже готового текста в стиле печатной машинки -
это интересно и иногда привлекает читателей, поэтому возьмите на вооружение этот
скрип. К тому же, он ну очень прост.
</div>
<script>
// init
printText( document.getElementById( 'my-text' ) );
function printText( el ){
let letterTimeout = 20
let text = el.innerHTML
let i = 1
print__fn() // init
function print__fn(){
if( i <= text.length ){
el.innerHTML = text.substr( 0, i );
setTimeout( arguments.callee, letterTimeout );
}
i++;
}
}
</script>