JavaScript

индекс
246,38

Vertical scroll при помощи Javascript

Часто попадаются блоки рекламы, где текст, прокручивается вертикально. Для того чтобы сделать такой блок можно использовать несколько технологий: Flash, Silverlight, Javascript. Для решения своей задачи я использовал Javascript. Из плюсов можно выделить то, что нет необходимости ставить дополнительные плагины.

В качестве вспомогательного Фреймворка был выбран jQuery. Это поможет решить проблему кроссбраузерности.

Задача


Необходимо показывать текстовые сообщения (ссылки, рисунки) в блоке определенной ширины. Сообщения должны отображаться по очереди. Цикл отображения не ограничен временными интервалами.

Возможные варианты решений


В качестве вариантов решения я рассматривал следующие:
  • На каждом шаге добавлять в конец блока текст, который уже был отображен. Таким образом, список будет увеличиваться, но никогда не закончится.
  • Отображать список сообщений по очереди и в момент отображения последнего сообщения прокручивать его сначала. Это получится такой себе зацикленный список.
  • В блоке, для отображения сообщений хранить только текущее сообщение и следующее. На каждом шаге обновлять список.

Достоинства и недостатки предложенных вариантов


При использовании первого варианта были замечены следующие недостатки: где то после пятой итерации блок начал «плыть», то есть возникла необходимость в коррекции; данные, которые уже были показаны, остаются в блоке, хотя они там уже не нужны. Как результат через небольшой промежуток времени браузер начинает «подтормаживать».
Вариант номер два уже лучше. Нет бессмысленного хранения данных, но блок по прежнему «плывет».
Вариант номер три и стал решением поставленной задачи.

Реализация


Код на Javascript:
var scrollerstep = 1;
var lefttime = 0;
var scroll_interval=5000;
var scroll_speed=50;
var part = 1;
var step = 50;
var delta = 0;
var delta_d = 1;
var correct = 0;
var step_l = 0;
var scrol__data = new Array();
var scroll_text_id = 'scroll_text';
var scroll_text_class = 'scroll_data';

function scroll_add(str) {
  scrol__data[scrol__data.length] = str;
}

function set_Interval(interval){
  scroll_interval = interval;
}

function set_Speed(speed){
  scroll_speed = speed;
}

function runScroll() {
  if (part > scrol__data.length - 1) {
    $('#'+scroll_text_id).css('top''0px');
    $('#'+scroll_text_id).attr('innerHTML''');
    $('#'+scroll_text_id).append('<p class="'+scroll_text_class+'">' + scrol__data[scrol__data.length - 1+ '</p>');
    part = 0;
  }
  if (part != 0) {
    $('#'+scroll_text_id).css('top''0px');
    $('#'+scroll_text_id).attr('innerHTML''');
    $('#'+scroll_text_id).append('<p class="'+scroll_text_class+'">' + scrol__data[part - 1+ '</p>');
  }

  var c_data = '<p class="'+scroll_text_class+'">' + scrol__data[part] + '</p>';
  part = part + 1;
  step_l = 0;
  $('#'+scroll_text_id).append(c_data);
  lefttime = setInterval("scrollText()", scroll_speed);
}

function scrollText() {
  currstop = parseInt(-1 * (step) - delta);
  if (parseInt(step_l) >= currstop) {
    nextval = parseInt($('#'+scroll_text_id).css('top')) - scrollerstep + 'px';
    step_l = step_l - scrollerstep;
    $('#'+scroll_text_id).css('top', nextval);
  } else {
    window.clearInterval(lefttime);
  }
}

function scroll_run(){
  $('#'+scroll_text_id).append('<p class="'+scroll_text_class+'">' + scrol__data[0+ '</p>');
  setInterval("runScroll()", scroll_interval);
}


Подключение и инициализация:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Vertical scroll</title>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="scroll.js"></script>
<style type="text/css">
.scroll_data{
                display:block;
                height:50px;
                margin:0px;
                padding:0px;
                vertical-align:middle;
}
.scroll_block{
                position:relative;
                top:50px;
                border:1px solid #DDDDDD;
                width:400px;
                height:50px;
                overflow:hidden;
}
.scroll_text{
                position:absolute;
                right:0px;
                top:0px;
                width:100%;
}
</style>
</head>
<body>
<script type="text/javascript">
$(document).ready(function() {
                set_Interval(3000);
                set_Speed(30);
                scroll_add('string1');
                scroll_add('string2');
                scroll_add('string3');
                scroll_add('string4');
                scroll_add('string5');
                scroll_add('string6');
                scroll_run();
});
</script>
<div class="scroll_block">
<div id="scroll_text" class="scroll_text">
</div></div>
</body>
</html>


Результат


Результат работы можно посмотреть тут
Скачать исходные коды можно по этой ссылке
Надеюсь это решение будет полезно.
–7
9 августа 2010, 16:03
12

комментарии (11)

–2
Matolch #
Побольше бы таких как вы, глядишь, и не задыхались бы браузеры от over 9000 рекламных наговнокоденных флешек.
+4
ish #
И он с таким же успехом станет задыхаться от наговнокоденого яваскрипта
0
atd #
от вот такой штуки:
nextval = parseInt($('#'+scroll_text_id).css('top')) — scrollerstep + 'px';
step_l = step_l — scrollerstep;
$('#'+scroll_text_id).css('top', nextval);

на крупной странице и с несколькими рекламными блоками задыхаться они будут не меньше.

Говнокод он и в африке говнокод, хоть флэш, хоть js
0
le0pard #
>>после пятой итерации блок начал «плыть»
Что это значит? Куда «плыть»?
0
atlete #
если прокручиваемому тексту поставить рамку, то видно что граница прокручиваемого текста не совпадает с границей блока. Получается идет сдвиг по оси Y, если не ошибаюсь.
+2
yroman #
А чего у вас все кишки наружу торчат? Оформили бы как jquery plugin тогда уж, раз jquery используете.
0
Stark #
А что если у меня на странице уже есть ф-ция set_Interval? Или scrollText?
Читайте комментарий выше хабраюзера yroman — такие вещи, нужно оформлять как плагин, если юзаете jQuery.
+1
piumosso #
Почему бы вам не инкапсулировать всё это в jQuery плагин?
К тому же, наверняка, такие имеются)
0
atlete #
к сожалению такого плагина не нашел. Возможно плохо искал.
Найду время — сделаю плагин.
+3
Anonym #
Это пиздец.
0
koteus #
Возможно автор тонкий тролль. Все же выскажу свое мнение:

Несмотря на var-ы, эта куча переменных в начале создается в глобальной области видимости. Таким образом все переменные и функции являются глобальными. Допустим автор написал другой подобный скрипт и там тоже есть переменная step. Вот тут то и собака зарыта.

Можно использовать структуру (Object Literal):

var myScroller = {
options: {
scrollerstep: 1,
...
lefttime: 0
},
runScroll: function() {
...
},
scroll_run: function() {
...
}
};
// Вызов
$(function(){
...
myScroller .scroll_run();
});


Или использовать Self Invoking Anonymouse Function:

var myScroller = (function(){
this.options = {
scrollerstep: 1,
...
lefttime: 0
};
this.runScroll = function() {
...
};
this.scroll_run = function() {
...
};
return this;
})();

// Вызов
$(function(){
...
myScroller .scroll_run();
});

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.