logo


home map contact


Если вы видите это сообщение - значит вы используете браузер Internet Explorer. Негативное отношение к этому браузеру сложилось не только у владельца данного ресурса, но и у подавляющего большинства людей, разбирающихся в web технологиях. Попробуйте установить один из браузеров по ссылке ниже, возможно вам он тоже понравится больше!

Opera, the fastest and most secure web browser     Spread Firefox Affiliate Button

плавающее JavaScript меню

Попробуем создать меню на JavaScript, чтобы его пункты плавно приближались при наведении и плавно уменьшались по onmouseout. Идея проста: по событиям onmouseover и onmouseout пункта меню пошагово изменяем его размеры с помощью setTimeout. JavaScript код следующий:
var imn;
var icount = 4; 	// image count
var iw = 49;		// start width
var iw2 = 90;		// end width
var ih = 74;		// start height
var ih2 = 135;		// end height
var stop;

function g() {
	for(i=1;i<=icount;i++) {
		var im = document.getElementById("i"+i);
		if(imn!=i) {			
			im.width=(im.width>=iw)?(im.width-2):im.width;
			im.height=(im.height>=ih)?(im.height-2):im.height;
		}
		else {
			im.width=(im.width<=iw2)?(im.width+2):im.width; 
			im.height=(im.height<=ih2)?(im.height+2):im.height;
		}
	}
	if(stop<iw2-iw || stop<ih2-ih) {setTimeout("g()", 20); stop++;}
}
Обратите внимание на то, что img каждого пункта меню имеет уникальный порядковый id, а все меню заключено в теги span с особой обработкой onmouseout для возвращения всех пунктов в исходное состояние.

ajax
php
javascript
html

пример:





Комментарии:



28.02.08 в 00:59

Отличный скрипт. Мне очень понравился. Только я в нём не разобрался. Обьясните пожалуйста поподробнее. Спасибо.





Alek Veritov     28.02.08 в 08:28

Смысл в том, чтобы последовательно перебрать все img меню и установить им нужный размер, что и делает цикл for. Если img onmouseover, то его размер растет с шагом 2, а остальные уменьшаются или не изменяются. Функция вызывает сама себя до достижения min/max размеров изображений. Скрипт не универсален, можно было бы вынести шаг (step) в глобальные переменные, а условие рекурсии проверять так: if(stop<(iw2-iw)/step && stop<(ih2-ih)/step)





sirius365@tut.by     29.02.08 в 03:58

Если есть терпение то разьясните следующее: <TD onmouseout="stop=1; imn=0; g();" align=middle>(для чего здесь onmouseout="stop=1; imn=0; g();"), что за картинка about.gif и about_s.gif, почему в onmouseout указывается height=48, а в src="плавающее меню на JavaScript.files/html_s.gif" width=48, а в onmouseover вообще ничего не указывается?
И наконец var d = document;
var yourImages = new Array('img/js.gif','img/html.gif','img/php.gif','img/ajax.gif', 'img/about.gif');
var preImages = new Array();
for (i = 0; i < yourImages.length; i++)
{
preImages[i] = new Image();
preImages[i].src = yourImages[i];
} Спасибо за ответ.





Alek Veritov     29.02.08 в 08:13

onmouseout="stop=1; imn=0; g();" - для того, чтобы когда уходишь с меню все img возвращались в исходное.

картинки с _s это просто маленькие версии. Дело в том, что непропорционально увеличенные/уменьшенные картинки отображаются коряво, поэтому я подменяю img src по наведению мыши, чтобы избавиться от кривизны.

var d = document; var yourImages = new Array ... это предзагрузка "больших" картинок.





Michail (Zmi)    10.07.08 в 11:44

Я заметил что вы в скрипте статически прописываете количество картиночек в меню, я понимаю то для примера это конешно не важно, но все же я бы предложил следующиий подход - ведь он красивый =):
function g()
{
var divImages = document.getElementById('divImages');
var icount = (divImages.childNodes.length+1);
... // дальше как есть
все картинки (table с ними) заключить в <div id='divImages'> ... </div>
// хотя в реальности количество элементов будет определятся каждый вызов и все по мне не плохой вариант, тем более можно чутка модернизировать если не нравится =)
Удачи в работе, спасибо за отличный сайт.





NNM    05.12.08 19:33

Доброго времени суток, Отличный вариант меню, Ниразу не имел дело с javascripts, как я понял первый код вставляется в scr/jquery.js , второй в саму страницу, и меню выводится через <script type="text/javascript" src="scr/jquery.js"></script> ... В результате чего ничего не получается ))) Можно поподробней, что куда вставляется ?




Vench    13.06.09 18:45

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




Сергей    28.08.09 12:08

Подскажите мне тупому не могу понять как вставить ссылка на страницу в скрипт.




Коля    27.11.09 21:19

Подскажите.
как этот код вписать в html странцу. Вопрос может и тупой, но я первый раз сталкнулся с java и не знаю как это делается....зарание спасибо




AdmFat    16.03.10 21:16

Спасибо. Статья кульь... только не пойму.... чем достигаеться эффект ПЛАВНОГО перехода




nifo    16.11.10 16:04

Зачем рассказывать людям о коде, который сами бы ни за что не стали использовать. Готовую javascript библиотеку ведь просто подключить, не правда ли?




Alek Veritov    17.11.10 00:04

to nifo: замечание вполне справедливо, в таком виде я этот скрипт нигде не использую, в верхнем меню задействован скрипт на основе jquery.magnifier, который, к слову, давно не поддерживается, поэтому пришлось допиливать самостоятельно. Ответ на ваш вопрос зачем - в обучающих целях.




Яшка    21.01.11 22:56

Респект и уважуша автору!!!! Сайту - жить!!! Пасибо, во многом помогли!!!!




Зина    27.03.11 09:20

Спасибо за ваш сайт. Все просто и понятно. Очень интересные примеры.




ЖК    06.08.11 11:49

``в верхнем меню задействован скрипт на основе jquery.magnifier``
в подробностях не получается пока разобраться, но в верхнем меню однозначно изменение более стабильное (не дёргается, не скачет). От чего так? Если не секрет.




Alek Veritov    06.08.11 23:42

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




Gago    15.12.11 00:10

u menya paluchilsa :) balshoe vam spassibo prosto ruski yazik tak chotko ne znayu chtob po dastoynomu vasxvalyat vash brend ). pravilam vashevoo sayta ya uje mnogo ras s raznimi ip ami skazal spasibo ;) i po moemu vi bi ne bili protiv uvidet vash trud v stranicax drugix saytov vot smatrite kak paluchilsa v html stranice i esli est vremeni chitayte interesnuyu statyu v nashem sayte :)






Если вам помогла или просто понравилась эта статья вы можете отблагодарить автора кликнув по рекламе. Спасибо!





комментировать:
прежде чем писать комментарий убедитесь, пожалуйста, что он не попадает в нижеследующие категории:
  • не стоит писать "я чайник, помогите ..." или "я начинающий, объясните ..." - уважайте себя! может вы и новичок, но ведь не тупой же! сами вполне способны во всем разобраться, тем более, что материал здесь изложен весьма доступно

  • не пишите вопросы типа "как мне сделать такую же менюху как наверху?", "куда вставлять этот код?", "как устроен интернет?" и т.д. - уважайте время автора!

  • комментарии вида "все, что здесь написано - бред" будут оставлены только если будут подписаны "я такой-то, разработчик сайта такого-то с посещаемостью 1000 хостов в день" и т.п. Если вы не согласны с чем-то - обоснуйте, напишите как правильно, а писать простые ругательства не надо, это не забор

прямые оскорбления кого бы то ни было будут удалятся!
здоровая критика приветствуется!



от кого:  

security picture