Бегущая строка на JavaScript своими руками
28.07.2009
Сегодня речь пойдет о создании простого скрипта для имитации эффекта бегущей строки. Для начала, придумаем, как это будет работать. По идее должен быть внешний контейнер, который определит размеры блока бегущей строки и ее положение в пространстве на странице, назовем его marquee_container. Также должен существовать блок, содержащий "бегущий" текст, наречем его - marquee_text.
Теперь должно быть все просто, мы задаем родительскому блоку фиксированную ширину, position: relative (для того, чтобы мы могли абсолютно позиционировать блок с текстом относительно текущего), overflow: hidden (для того, чтобы "бегущий" текст скрывался за границами родительского блока). Далее пишем скрипт, который отодвигает текст вправо на ширину родительского блока (теперь он не видим) и потом перемещает его влево с заданной скоростью, пока текст не скроется полностью. И повторяем это действие снова и снова =).
Для того, чтобы рассчитать момент, когда текст полностью скроется за левой границей, нам нужно узнать настоящую ширину блока с текстом. Если наш текстовый блок будет содержаться в marquee_container с заданной шириной, скрипт нам покажет ширину не больше нами заданной. Поэтому нам нужен еще один блок (marquee_subcontainer). Зададим ему ширину width:9999999px, и поместим в него текстовый блок. Теперь проблема с определением ширины решена.
Составим HTML код бегущей строки:
<div class="marquee-container" id="marquee_container">
<div class="marquee-subcontainer" id="marquee_subcontainer">
<div class="marquee-text" id="marquee_text">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
</div>
</div>
Теперь составим таблицу CSS стилей в соответствии с нашими рассуждениями:
.marquee-container {
position: relative; /* см. UPD 1 */
border-right:1px dotted #d8cfc2;
height:30px;
width:200px;
overflow: hidden;
border:2px solid #f00;
margin:0px auto;
}
.marquee-subcontainer {
position: relative;
width:9999999px;
height:30px;
margin:0px;
}
.marquee-text {
position: absolute;
margin: 0px;
top:0px;
left:0px;
height:30px;
font: bold 16px Arial Georgia;
color:#000;
}
Когда все предварительные приготовления сделали, можно приступить к написанию JS кода.
// текущий сдвиг текста относительно левой границы блока бегущей строки
var craw_line_offset;
// функция инициализации бегущей строки
function enableCrawLine () {
craw_line_offset = 0;
// ширина текстового блока
var craw_line_width = document.getElementById('marquee_text').offsetWidth;
moveCrawLine (craw_line_width);
}
// функция пошагового сдвига
function moveCrawLine (w) {
var lefttime;
var container_width = document.getElementById('marquee_container').offsetWidth;
// шаг (в пикселях), с которым будем перемещать текст
var step = 1;
// задержка между перемещениями на step пикселей
var tdelay = 50;
// ширина текстового блока
w = parseInt(w);
// если блок не "заехал" за левую границу
if (craw_line_offset<(w+container_width)) {
// сдвигаем блок на шаг влево
craw_line_offset = craw_line_offset + step;
} else {
// иначе начинаем все с начала
craw_line_offset = 0;
}
// изменяем позицию текстового блока
document.getElementById('marquee_text').style.left = parseInt(container_width-craw_line_offset)+'px';
// рекурсивно вызываем функцию сдвига с заданной задержкой
setTimeout('moveCrawLine ('+w+');', tdelay);
}
// вызов инициализирующей функции
enableCrawLine ();
Теперь можем ознакомиться с рабочим примером.
UPD 1: В IE6 не корректно срабатывал overlow: hidden для родительского блока. Дочерний див с position:absolute отображался полностью, не зависимо от границ родительского блока. Оказалось нужно просто добавить свойство position: relative и блоку с overflow:hidden.
Tags: CSS, HTML, JavaScript
01.08.2009 в 17:56
А в каких случаях хорошо использовать иммитацию бегущей строки?! Просто интересно!
[Ответить]
18.08.2009 в 20:15
Спасибо, воспользуюсь
[Ответить]
03.09.2009 в 16:43
Спасибо большое. Воспользуюсь. Только вот как это в typo3 интегрировать? ))
[Ответить]
13.09.2009 в 09:09
Не понял - куда текст прописывать? И возможно ли чередовать несколько фраз?
[Ответить]
18.09.2009 в 10:29
А тег не устраивает?
[Ответить]
21.09.2009 в 11:12
Т.е. вы думаете, что если бы меня устраивал тег marquee то я стал бы усложнять себе жизнь?
[Ответить]
04.10.2009 в 16:25
А как сделать так, чтобы начало бегущей строки выбегало сразу за концом, недожидаясь пока вся фраза уйдёт за экран
[Ответить]
17.10.2009 в 08:35
По идее нужно клонировать элемент с текстом (marquee_text) и прокручивать их с определенным интервалом. Скоро выйдет статья об обновленном скрипте бегущей строки, там расскажу более подробно.
[Ответить]
19.01.2010 в 19:13
Спасибо......ваш пример очень помог) и был использован на сайте
[Ответить]
06.05.2010 в 21:55
А как насчет того что
"overflow: hidden (для того, чтобы "бегущий" текст скрывался за границами родительского блока)." не работает в IE, он (текст) не скрывается
[Ответить]
Mihalytch Reply:
Май 7th, 2010 at 10:57
Спасибо! Нашел способ пофиксить этот баг для ослика
[Ответить]
28.05.2010 в 15:46
Если скрипт отдельным файлом. marquee_row.js
Как его вызвать из хтмл?
Если
поставить в шапке, то не работает скрипт
[Ответить]
Mihalytch Reply:
Май 28th, 2010 at 17:28
<script type="text/javascript" src="/путь_к_скрипту/marquee_row.js"></script>
[Ответить]
31.05.2010 в 13:25
А вот не работает бегущая строка, если скрипт подключать из отдельного файла. Хотя alert срабатывает.
не надо вносить изменения к код скрипта?
[Ответить]
Mihalytch Reply:
Май 31st, 2010 at 13:35
А мой пример у вас работает http://mihalytch.org.ua/example/marquee-javascript.html ? - Если да, то скорее всего ошибку нужно искать в CSS стилях.
Может дадите ссылку на страницу с не рабочей строкой?
[Ответить]
31.05.2010 в 13:45
пример работает.
http://upload.com.ua/get/901683107/
[Ответить]
Mihalytch Reply:
Май 31st, 2010 at 14:13
Из js/marquee_row.js удалить вызов функции enableCrawLine (); (в самом конце файла).
в index.html к тегу <body> добавить атрибут onload="" с вызовом ф-и инициализирующей строку:
<body onload="enableCrawLine ();">
Смысл в том, что скрипт должен начинать работу когда DOM загружено браузером или хотя бы часть документа с блоками содержащими бегущую строку.
[Ответить]
31.05.2010 в 14:34
Спасибо большое, заработало !!! )))
[Ответить]
Mihalytch Reply:
Май 31st, 2010 at 14:43
Пожалуйста! Всегда рад помочь.
[Ответить]
12.07.2010 в 12:11
В опере не работает
[Ответить]
Mihalytch Reply:
Июль 12th, 2010 at 15:28
Уточните пожалуйста, пример http://mihalytch.org.ua/example/marquee-javascript.html не работает или у вас не работает?
И версию оперы пожалуйста!
[Ответить]