Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 05.06.2011, 11:57
Аспирант
Отправить личное сообщение для evgh Посмотреть профиль Найти все сообщения от evgh
 
Регистрация: 29.01.2011
Сообщений: 58

прокручивающееся подменю
доброго времени суток.
проблема в том что подменю очень длинные и выходят за границу страницы, и ничего другого представить себе не могу как прокручивающееся подменю.

помогите с реализацией на javascript.
уже который день сижу на месте, не знаю что искать, куда смотреть.
Ответить с цитированием
  #2 (permalink)  
Старый 05.06.2011, 14:12
Профессор
Отправить личное сообщение для nikita.mmf Посмотреть профиль Найти все сообщения от nikita.mmf
 
Регистрация: 01.02.2010
Сообщений: 364

css-свойство overflow
Ответить с цитированием
  #3 (permalink)  
Старый 05.06.2011, 14:19
Аспирант
Отправить личное сообщение для evgh Посмотреть профиль Найти все сообщения от evgh
 
Регистрация: 29.01.2011
Сообщений: 58

)), угу.
но ставить полосу прокрутки подменюшке не красиво.
а значит надо без неё "проворачивать" список, скрывая элементы которые "уходят" за границу видимости.

к тому же надо "родить" )) как определить стрелка(курсор) мышки ниже половины списка или выше, что бы прокрутить список к началу или концу
Ответить с цитированием
  #4 (permalink)  
Старый 05.06.2011, 16:01
Кандидат Javascript-наук
Отправить личное сообщение для Slavenin Посмотреть профиль Найти все сообщения от Slavenin
 
Регистрация: 20.11.2010
Сообщений: 143

каждый элемент списка ловит события наведения мышки, далее начинается просчет координат каждого элемента, при этом должны быть два массива с отображенными элементами и скрытыми. функция изменения положения элементов должна знать координаты начала и конца списка. если координаты первого отображенного элемента выходят за границы дива то мы его скрываем и переносим в массив скрытых, и одновременно показываем первый скрытый элемент в конце списка. (организуем два стека, короче) вместе с тем запускается функция перемещения всех элементов списка вверх или вниз. Хотя в том что удасться обеспечить их плавное перемещение я сильно сомневаюсь

вот наверно как-то так
__________________

Ответить с цитированием
  #5 (permalink)  
Старый 05.06.2011, 16:23
Аспирант
Отправить личное сообщение для evgh Посмотреть профиль Найти все сообщения от evgh
 
Регистрация: 29.01.2011
Сообщений: 58

огого. страшно звучит. я думал вообще без массивов обойтись, просто статичными списками, которыми "ёрзать"

Slavenin то что вы описали смахивает на эту реализацию http://deluxe-menu.com/scrollable-submenus-sample.html...но такое собирать это ужас, да и у меня двуязычное меню, в два раза больше возни...

Последний раз редактировалось evgh, 05.06.2011 в 16:31.
Ответить с цитированием
  #6 (permalink)  
Старый 05.06.2011, 16:45
Кандидат Javascript-наук
Отправить личное сообщение для Slavenin Посмотреть профиль Найти все сообщения от Slavenin
 
Регистрация: 20.11.2010
Сообщений: 143

ну да, примерно тоже самое, ничего сложного, меню разве что прописывать, но их можно отдельно в файликах хранить или в бд. я просто точно не помню, можно ли переместить элемент за границу дива, чтобы при этом не изменился сам размер дива, если можно, то вполне можно обойтись одним списком менюшек, просто менять их координаты и вверх вниз и все, самая большая сложность это отслеживать и менять функции смещения для каждого элемента, чтобы то что ниже центра смещало элементы вниз, а то что выше вверх.
__________________

Ответить с цитированием
  #7 (permalink)  
Старый 05.06.2011, 18:56
Аспирант
Отправить личное сообщение для evgh Посмотреть профиль Найти все сообщения от evgh
 
Регистрация: 29.01.2011
Сообщений: 58

<ul id="p" onmousemove="gg(event, this)">
    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
    <li>5</li>
    <li>6</li>
    <li>7</li>
    <li>8</li>
    <li>9</li>
    <li>10</li>
    <li>11</li>
    <li>12</li>
    <li>13</li>
    <li>14</li>
    <li>15</li>
</ul>

* { margin: 0; padding: 0; }

#p { 
border:1px solid #000;
height: 200px;
overflow-y: scroll;
}

function gg(e,t){
var percent=t.offsetHeight/100; // %=(всего/100)
percent=Math.floor(e.clientY/percent); // %=(позиция/%)

if(percent<25)
{
	//up
}
else if(percent>75)
{
	//down
}
}

вот такую фигню собрал...но не получается список "провернуть", не срабатывает ни scroll, ни scrollBy, ни scrollTo, даже когда overflow-y: scroll, не говоря уже о overflow-y: hidden.
может кто подскажет, как должно быть? как правильно

Последний раз редактировалось evgh, 05.06.2011 в 18:58.
Ответить с цитированием
  #8 (permalink)  
Старый 05.06.2011, 20:00
Аспирант
Отправить личное сообщение для evgh Посмотреть профиль Найти все сообщения от evgh
 
Регистрация: 29.01.2011
Сообщений: 58

спасибо отозвавшимся. сам разобрался. хотя если у кого нить идеи возникнут, я буду рад услышать.
Ответить с цитированием
  #9 (permalink)  
Старый 05.06.2011, 23:22
Кандидат Javascript-наук
Отправить личное сообщение для Slavenin Посмотреть профиль Найти все сообщения от Slavenin
 
Регистрация: 20.11.2010
Сообщений: 143

каждый элемент на страницу имеет свои координаты можно их менять http://javascript.ru/ui/offset двигая весь список целиком вверх или вниз
__________________

Ответить с цитированием
  #10 (permalink)  
Старый 12.06.2011, 00:20
Аспирант
Отправить личное сообщение для evgh Посмотреть профиль Найти все сообщения от evgh
 
Регистрация: 29.01.2011
Сообщений: 58

всё никак скрипт до ума не доведу.
попытался приспособить код к меню.
меню многоуровневое, с выпадающими списками которые ограничены высотой в 200px
var sliding=false;

function up(t){
sliding=clearInterval(sliding);
sliding=setInterval(
						function()
						{
							if(t.scrollTop>0) t.scrollTop--; 
							else sliding=clearInterval(sliding); 
						}
					, 20);
}

function down(t){
var From=t.scrollTop+t.offsetHeight;
sliding=clearInterval(sliding);
sliding=setInterval(
						function()
						{
							if(From<t.scrollHeight) t.scrollTop++; 
							else sliding=clearInterval(sliding); 
						}
					, 20);
}

function gg(e,t){
var ee = e.target || e.srcElement;
var percent=t.offsetHeight/100;
percent=Math.floor((e.clientY-t.offsetParent.offsetTop)/percent);
if(percent<20) up(t); 
else if(percent>80) down(t);
}

function stop(){ sliding=clearInterval(sliding); }

window.onload = function(){

var start=document.getElementById('nav_v');
var height=start.getElementsByTagName('li')[0].offsetHeight;
var all=start.getElementsByTagName('ul');
	for(var i=0; i<all.length; i++)
	{
		if((all[i].childNodes.length * height) > 200)
		{
			all[i].style.overflow = 'hidden';
			all[i].onmouseout = stop;
			all[i].onmouseover=function(event){ gg(event || window.event, this); };
		}
	}
}

больше всего волнует функция gg(e,t) (хотя не против если и в других укажите на ошибки).
в прототипе "процент" (позицию курсора мышки относительно выпадающего списка) вычислял в при помощи
percent=Math.floor((e.clientY-t.offsetTop)/percent);

и всё бы ничего, но когда прикрутил к рабочему меню скрипт начал "козлить", долго думая и ища окольные пути додумал до
percent=Math.floor((e.clientY-t.offsetParent.offsetTop)/percent);

работает лучше, но процент вычисляет с погрешностью.

кто по толковее подскажите как исправить
буду весьма признателен.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Меню и подменю gta Ваши сайты и скрипты 2 20.03.2011 12:45
Горизонтальное меню с отображение нажатого подменю javascript jQuery 1 18.11.2010 23:44
menu с выпадающими подменю при наведении и раздвижное при клике bugor Элементы интерфейса 3 04.10.2010 14:32
Использование css свойства display для подменю Lex4e Общие вопросы Javascript 7 07.01.2010 22:02
Съезжающее вниз подменю Djony1987 jQuery 4 04.10.2009 08:20