Форум программистов, компьютерный форум, киберфорум
JavaScript
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/19: Рейтинг темы: голосов - 19, средняя оценка - 4.95
vatrikovsky

Вертикальный скролл по mouseover

27.10.2010, 18:47. Показов 3531. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Делаю вертикально скроллящееся меню по типу вот этого:
http://www.netpro.ru/?action=DABlank2 (откройте "Мы сделали")
, только на javaScript + jQuery

HTML:
HTML5
1
2
3
4
5
6
<div id="left_list">
  <p class="project_number"><a href="#">007</a></p>
  <p class="project_number"><a href="#">012</a></p>
  ...
  <p class="project_number"><a href="#">186</a></p>
</div>
javaScript:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
$(document).ready(function(){
 
    // При наведении на левый блок
    var winHeight = $(window).height();
    var margin = $('#left_list').height() - winHeight;
 
    // движение при попадании курсора в области
    $('#left_list').unbind('mouseover').mouseover(function(e){
        // top 1/3
        if (e.pageY < (winHeight / 3))
        {
            var speed = (winHeight / 6) / e.pageY;
            if (speed > 2) speed = 2;
            $('#direction').val('top');
        }
        // bottom 1/3
        if (e.pageY > 2 * (winHeight / 3))
        {
            var speed =  (e.pageY - ((2 / 3) * winHeight)) / (winHeight / 6) + 0.5;
            if (speed > 2) speed = 2;
            $('#direction').val('bottom');
        }
        $('#speed').val(speed);
        
        var direction = $('#direction').val();
        var speed = $('#speed').val();
        
        // bottom 1/3, list moves top
        if (direction == 'bottom')
        {
            if (parseInt($('#left_list').css('margin-top')) > (-1) * margin)
            {
                $('#left_list').animate({marginTop: '-=50px'}, (300 / speed));
                $('#int').val(parseInt($('#left_list').css('margin-top')));
            }
            else 
            {
                $('#left_list').animate({marginTop: '-' + margin + 'px'}, (300 / speed));
                $('#int').val(parseInt($('#left_list').css('margin-top'))); 
            }
        }
        // top 1/3, list moves bottom
        if (direction == 'top')
        {   
            if ((parseInt($('#left_list').css('margin-top'))) < 0)
            {
                $('#left_list').animate({marginTop: '+=50px'}, (300 / speed));
                $('#int').val(parseInt($('#left_list').css('margin-top'))); 
            }
            else
            {
                $('#left_list').animate({marginTop: '0px'}, (300 / speed));
                $('#int').val(parseInt($('#left_list').css('margin-top'))); 
            }
        }
        
        // стопим, если увели мышь в середину
        if (direction == 'none')
        {
            $('#left_list').stop();
        }
    });
 
    // остановка при выведении указателя за пределы
    $('#left_list').unbind('mouseout').mouseout(function(){
        $('#speed').val('0');
        $('#direction').val('none');
        $('#left_list').stop();
    });
});
Суть проблемы:
Во всем, кроме ФайрФокса, блок прокручивается именно при движении мыши, а при простое на месте тоже останавливается. Надо, естественно, чтобы везде просто при поднесении мыши к краю списка, он бы скроллился. Пробовал сделать через setInterval, но это страшно тормозит скрипт, нет ли очевидного и грамотного способа реализовать это?

Спасибо.
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.10.2010, 18:47
Ответы с готовыми решениями:

Вертикальный скролл слайдер
Доброго времени суток. Ребята, возникла не простая ситуация по задаче. Материалов для просмотра нет, опишу саму ситуацию. В JS я не...

Убрать вертикальный скролл в ie 6 7
Как убрать вертикальную полосу прокрутки в ie6,7? Только так что бы во всех браузерах она появилась, если контент по вертикали выйдет за...

ListView вертикальный скролл
Народ, подскажите в чем дело? На форме есть ListView, View = List, при заполнении включается горизонтальный скролл, как его убрать и...

2
28.10.2010, 19:27

Не по теме:

Я заинтересовался этой темой.
На досуге поковыряю...

0
 Аватар для ostgals
886 / 681 / 101
Регистрация: 23.01.2009
Сообщений: 1,582
02.11.2010, 12:29
Тема действительно полезная. Пока ковырялся, узнал кое-что новое по jQuery.

HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
<style type="text/css">
 
#list_holder {
    height: 300px;
    width: 400px;
    overflow: hidden;
    border: solid 1px green;
}
 
</style>
 
<div id="list_holder"><div id="list"></div></div>
 
<script type="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script>
<script type="text/javascript">
<!--//
 
    $(function() {
        
        var debug = [];
        
        // создаем список достаточной длины
        for (var i = 0; i < 100; i++)
            $('<div/>').html('Item ' + i).css('border', 'solid 1px red').appendTo($('#list'));
        
        // скорости (пиксели в секунду на каждый участок #list_holder)
        var speeds = [ 400, 200, 100, 50, 0, 0, 0, 0, -50, -100, -200, -400 ],
            speed,
            
            offset = $('#list').height() - $('#list_holder').height(),
            durations = [];
        
        // пересчет скоростей в продолжительность анимации
        for (var i in speeds) durations[i] = Math.round((offset / Math.abs(speeds[i])) * 1000);
        
        $('#list_holder').mousemove(function(e) {
            
            var y = e.pageY - $(this).offset().top;
            var s = Math.floor(y / ($(this).height() / speeds.length));
            
            // только если новая скорость отличается от старой
            if (speed != speeds[s]) {
                
                var list = $('#list').stop(),
                    mtop1 = parseInt(list.css('margin-top')),  // текущий офсет
                    mtop2 = (speeds[s] > 0 ? 0 : -offset),     // конечный офсет
                    time = Math.round(durations[s] * ((mtop2 == 0 ? -mtop1 : offset + mtop1) / $('#list').height()));
                    // время, скалькулированное для скроллинга оставшегося офсета
                    
                if ((speed = speeds[s]) != 0) list.animate( // анимируем только, если скорость не 0
                    { 'margin-top': mtop2 + 'px' },
                    time,
                    'linear'
                );
            }
            
        }).mouseleave(function() { // не mouseout()!!!
            
            $('#list').stop();
            speed = 0;
            
        });
    });
 
//-->
</script>
Этот вариант отладил и проверил в "большой четверке".
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.11.2010, 12:29
Помогаю со студенческими работами здесь

вертикальный скролл для div
Всем привет! Подскажите пожалуйста у меня несколько вопросов по скроллам. 1. Есть div в него динамически добавляется текст. Нужно...

Убрать вертикальный скролл в sListView
Доброго времени суток, Столкнулся с проблемой, нужно убрать Vertical Scroll у компонента sListView Данный компонент предоставляет Alpha...

Как убрать вертикальный скролл
Написал простецкую анимацию. В диве находиться текст и при расширении блока появляется вертикальный скролл. Можно ли убрать его и сделать...

Position: fixed залазит на вертикальный скролл
как сделать, чтобы блок со стрелкой не залазил на скролл, а прижимался к нему? http://view.maquetter.com/niuu67

скрытый вертикальный скролл через overflow-y
А можно как то сделать, что бы блок, со свойством overflow-y: scroll; max-height: 300px; начинал отображать вертикальный...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru