Плавное появление изображения при наведении указателя мышки.
1 Вариант.
[HTML]<html>
<head>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<script language="javascript">
<!--
function ok(){ //Функция начальной установки прозрачности.
di=document.images
for(c=1;c<=4;c++){
di['i'+c].src='img/1.jpg'
if (di['i'+c].filters){
di['i'+c].style.filter='alpha(opacity='+s+')'}
else{
di['i'+c].style.opacity=s/100}}}
// Временные единицы относительные, подбирать экспериментально.
var up=10 // Время выполнения эффекта, появление.
var dn=15 // Время выполнения эффекта, исчезновение.
var s=10 // Начальная прозрачность, от 0.
var r=100 // Конечная прозрачность, до 100.
/*----------------------------------------------------------------*/
var x=25/up
var y=-25/dn
var z=new Array()
var timer=new Array()
function eff(i,e){
if (timer[i.id]){clearInterval(timer[i.id])}
if (e.type!='mouseover'){z[i.id]=y;var t=dn}
else{z[i.id]=x;var t=up}
timer[i.id]=setInterval(function(){return time(i)},t)}
function time(i){
if (i.filters){
i.filters.alpha.opacity+=z[i.id]
c=i.filters.alpha.opacity}
else{
c=i.style.opacity*100
c+=z[i.id]
i.style.opacity=c/100}
if (c<=s){if(i.filters){i.filters.alpha.opacity=s}else{i.style.opacity=s/100};clearInterval(timer[i.id]);return}
if (c>=r){if(i.filters){i.filters.alpha.opacity=r}else{i.style.opacity=r/100};clearInterval(timer[i.id]);return}
}
//-->
</script>
</head>
<body onload=ok()>
<img id=i1 onMouseOver=eff(this,event) onMouseOut=eff(this,event)>
<img id=i2 onMouseOver=eff(this,event) onMouseOut=eff(this,event)>
<img id=i3 onMouseOver=eff(this,event) onMouseOut=eff(this,event)>
<img id=i4 onMouseOver=eff(this,event) onMouseOut=eff(this,event)>
</body>
</html>[/HTML]
2 Вариант.
[HTML]<html>
<head>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<script language="javascript">
<!--
function ok(){ //Функция начальной установки прозрачности.
di=document.images
for(c=1;c<=4;c++){
di['i'+c].src='img/1.jpg'
if (di['i'+c].filters){
di['i'+c].style.filter='alpha(opacity='+s+')'}
else{
di['i'+c].style.opacity=s/100}}}
// Временные единицы относительные, подбирать экспериментально.
var up=5 // Время выполнения эффекта, появление.
var dn=15 // Время выполнения эффекта, исчезновение.
var s=10 // Начальная прозрачность, от 0.
var r=100 // Конечная прозрачность, до 100.
/*----------------------------------------------------------------*/
var x=25/up
var y=-25/dn
var z=new Array()
var timer=new Array()
function on(i){
if (timer[i.id]){clearInterval(timer[i.id])}
z[i.id]=x
timer[i.id]=setInterval(function(){return time(i)},up)}
function off(i){
clearInterval(timer[i.id])
z[i.id]=y
timer[i.id]=setInterval(function(){return time(i)},dn)}
function time(i){
if (i.filters){
i.filters.alpha.opacity+=z[i.id]
c=i.filters.alpha.opacity}
else{
c=i.style.opacity*100
c+=z[i.id]
i.style.opacity=c/100}
if (c<=s){if(i.filters){i.filters.alpha.opacity=s}else{i.style.opacity=s/100};clearInterval(timer[i.id]);return}
if (c>=r){if(i.filters){i.filters.alpha.opacity=r}else{i.style.opacity=r/100};clearInterval(timer[i.id]);return}
}
//-->
</script>
</head>
<body onload=ok()>
<img id=i1 onMouseOver=on(this) onMouseOut=off(this)>
<img id=i2 onMouseOver=on(this) onMouseOut=off(this)>
<img id=i3 onMouseOver=on(this) onMouseOut=off(this)>
<img id=i4 onMouseOver=on(this) onMouseOut=off(this)>
</body>
</html>[/HTML]
А может, кто чего предложит для улучшения. Быстренько улучшим.:)
[html]
<body>
<img src="foo.jpg" rel="demonstration" />
</body>
[/html]
Т.е. в идеале должно получится так. Это удобней и выглядет более "по взрослому" :)
Хорошо, почитаю, как это делается:) , и сделаю, спасибо.
Мне не очень нравится, как они работают в Мозолле и Опере. Какое то мерцание присутствует. От чего это может быть? Или мне кажется....
Хорошо, почитаю, как это делается:) , и сделаю, спасибо.
Мне не очень нравится, как они работают в Мозолле и Опере. Какое то мерцание присутствует. От чего это может быть? Или мне кажется....
Кажется. Лично я ни в Опере ни в Лисе разницы с Ослом не вижу. Просто скорее всего у тебя комп не очень мощновать, то и может протормаживать.
У меня что было, в том и проверил:) Основные IE, Mozilla и Opera, в них работает. Во всяком случае, в последних.
Но я ведь напрямую не обращаюсь к фильтру, только проверяю наличие. Или, как то не так нужно делать?
Но я ведь напрямую не обращаюсь к фильтру, только проверяю наличие. Или, как то не так нужно делать?
Да нет, все так. Только имей в виду, что свойство filters для неподдерживающих браузеров равно undefined, а не boolen. Поэтому лично бы я вел сравнение по нему.
Ни чего удивительно. Расчет прозрачности ведется динамически. Т.е. нагрузка на проц. А в Опере могли пойти под другому. Ну к примеру расчитать каждый "кадр" и просто потом их прокручивать. Хотя точно знаю только лишь разрабы.
[html]
<script type="text/javascript">
window.onload = youFunction()
</script>
[/html]
Если не хочешь забивать загрузку одной функцией, то сделай метод-аккамулятор, который собирает различные функции и вызывает
[html]
<script type="text/javascript">
window.onload = execute()
store = Array()
addFunction('nameFuntion') {
store[] = nameFunction()
}
//И их вызывать
function execute() {
for(var i = 0; i < store.lenght; i++) {
store
}
}
//Те получается, что через addFunction() ты добовляешь функцию для выполнения во время загрузки. Довольно полезно, когда нужно сделать вызов некой цепочки функций при определённом действии
</script>
[/html]
Этот скрипт на 90% нерабочий, т.к. целью было не сделать рабочий скрипт, а показать принцип. А собираются эллементы тоже просто. Если ты используешь какой либо фреймворк, то там коллекция собирается через $$ (или $E, точно не помню), если руками, то просто обойди дерево и вытащи все элементы, у которых rel/class равен твоему и массово задай им onMouseOver и onMouseOut. Задаются они через
[html]
document.getElementById('id').onMouseOver = function() {}
[/html]
Или аналог через дом (через него ты и будешь делать). Удачи.
[html]
if(document.getElementById('id').className == 'need') {
// Тут подключаем обработчики
}
[/html]
Я пытался подобным образом, но у меня не вышло сделать кроссбраузерный вариант захвата событий. Мжет подскажете?
Да где-же тут "по взрослому"? У элемента img не может быть атрибута rel.
Надо заметить, что в условии в любом случае происходит преобразование типа посредством метода ToBoolean. Следовательно undefined -> false.
Если не хочешь забивать загрузку одной функцией, то сделай метод-аккамулятор...
Давным-давно для таких целей используются методы addEventListener/attachEvent...
Надо заметить, что в условии в любом случае происходит преобразование типа посредством метода ToBoolean. Следовательно undefined -> false.
Безусловно. Я в курсе. Не было бы преобразования, скрипт бы не работал. Я просто упомянул об этом для сведения.
Давным-давно для таких целей используются методы addEventListener/attachEvent...
Мой склероз мне говорит, что у разных браузеров это делается разными методами. Хотя конечно может сейчас в этом отношении и достигли едиобразия... хотя зная MS сомнительно :D
Согласия безусловно нет, но можно использовать примерно такой метод:
document.attachEvent('onclick', clickHandler);
else if(document.addEventListener)
document.addEventListener('click', clickHandler, false);
else
document.onclick = clickHandler;
Или написать функцию:
{
if(obj.attachEvent)
obj.attachEvent('on'+ev, func);
else if(obj.addEventListener)
obj.addEventListener(ev, func, false);
else
obj['on'+ev] = func;
}
Правда возможны проблемы с объектом event, но они тоже решаемы.
Effect.Appear - то, что вы пытаетесь сделать. Прикрутить этот эффект к движению мышки - 1 минута работы.
Т.е., Вы предлагаете, вместо функции размером 600 байт прикрутить библиотеку размером 100 килобайт?
[HTML]if (/*@cc_on 1 | @*/ 0){
document.attachEvent('onmouseover',eff)}
else{
document.addEventListener('mouseover',eff, false)}[/HTML]
Было бы лучше присоединить событие только к изображениям, но я не могу придумать как это сделать. Строка такого вида document.images.attachEvent не работает,
document.images().attachEvent - тоже.
И можно ли как нибудь, в обработчике проверить тип объекта(принадлежит ли он к изображениям)?
Пробую так:
[HTML]function eff(i,e){
alert(i.tipe)
}[/HTML]
не понимает "type".
Я не знаток JS, я предлагаю вараинты, какими бы я пользовался в РНР. C JS я работаю через фреймворк и не заморачиваюсь сильно.
[HTML]if (/*@cc_on 1 | @*/ 0){
document.attachEvent('onmouseover',eff)}
else{
document.addEventListener('mouseover',eff, false)}[/HTML]
Есть смысл написать одну функцию на "все случаи жизни", чем каждый раз "пропуcкать" движок через условия:
if (window.addEventListener) {
s = 'o.addEventListener(e, f, !!b)';
} else if (window.attachEvent) {
s = 'o.attachEvent("on" + e, f)';
};
return Function('o, e, f, b', s);
}('');
И можно ли как нибудь, в обработчике проверить тип объекта(принадлежит ли он к изображениям)?
Пробую так:
[HTML]function eff(i,e){
alert(i.tipe)
}[/HTML]
не понимает "type".
Неполучается!!!
Помогите, пожалуйста.
Уже как только не пробовал получить доступ к объекту вызвавшему событие. Как из события получить объект внутри обработчика?
Так захватываю события.
[HTML]if (/*@cc_on 1 | @*/ 0){
document.attachEvent('onmouseover',eff)}
else{
document.addEventListener('mouseover',eff, false)}[/HTML]
А как получить объект или id в функции eff()
У меня как то получилось получить в IE и то уже не помню как, горе, короче, горе...:mad: Весь Интернет прочитал...:)
<script>
function handler(obj,e)
{
// obj - элемент.
// e - событие.
alert(obj.id);
}
function installHandler(el,ev,func)
{
var h = function (e)
{
var obj;
if(window.event) {
e = window.event;
obj = e.srcElement;
} else {
obj = e.target;
}
return func(obj,e);
};
if(el.attachEvent) {
el.attachEvent('on'+ev, h);
} else if(el.addEventListener) {
el.addEventListener(ev, h, false);
} else {
el['on'+ev] = h;
}
}
installHandler(document,'click',handler);
</script>
Возьмем пример посложнее:
var tmp = node.getElementsByTagName('li');
for(var i = 0; i < tmp.length; i++){
tmp.onclick = function(num){
return function() {
alert(num);
}
}(i);
}
Код выбирает все элементы li узла node. Каждому элементу скрипт добавляет обработчик события onclick. Обработчик выводит номер своего элемента.
Взял кусок статьи: Нетривиальный синтаксис , возможно поможет
P.S. skywalker, я, собственно, от автора этой статьи и заразился эффектами, особенно мне нравится, как унего решено претекание цвета.
3 Вариант.
[HTML]<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<script language="javascript">
<!--
function ok(){ //Функция начальной установки прозрачности.
var img=document.getElementsByTagName('img')
for(c=0;c<img.length;c++){
img[c].src='img/'+(c+1)+'.jpg'
img[c].onmouseover=eff
img[c].onmouseout=eff
if (img[c].filters){
img[c].style.filter='alpha(opacity='+s+')'}
else{
img[c].style.opacity=s/100}}}
// Временные единицы относительные, подбирать экспериментально.
var up=10 // Время выполнения эффекта, появление.
var dn=15 // Время выполнения эффекта, исчезновение.
var s=10 // Начальная прозрачность, от 0.
var r=100 // Конечная прозрачность, до 100.
/*----------------------------------------------------------------*/
var x=25/up
var y=-25/dn
var z=new Array()
var timer=new Array()
function eff(e){
var i=this.id
if (timer){clearInterval(timer)}
if (!e){e=window.event}
if ((e.type)!='mouseover'){z=y;var t=dn}
else{z=x;var t=up}
timer=setInterval(function (i){return function(){ time(i)}}(this),t)}
function time(i){
if (i.filters){
i.filters.alpha.opacity+=z[i.id]
c=i.filters.alpha.opacity}
else{
c=i.style.opacity*100
c+=z[i.id]
i.style.opacity=c/100}
if (c<=s){if(i.filters){i.filters.alpha.opacity=s}else{i.style.opacity=s/100};clearInterval(timer[i.id]);return}
if (c>=r){if(i.filters){i.filters.alpha.opacity=r}else{i.style.opacity=r/100};clearInterval(timer[i.id]);return}
}
//-->
</script>
</head>
<body onload=ok()>
<img id=i1>
<img id=i2>
<img id=i3>
<img id=i4>
</body>
</html>[/HTML]
Не смог красиво вписать назначение обработчика, хотелось чтобы прямо в цикле было записано одной строчкой. Типа такого:
[HTML]img[c].onmouseover=function(){return eff(img[c],'mouseover')}
img[c].onmouseout=function(){return eff(img[c],'')}[/HTML]
Но при такой записи теряется объект. Если в цикле создавать переменную и приравнивать ей объект img[c], то тогда передается объект, но, понятно, последний из цикла. Подскажите, как правильно записать.
Как красиво смотрятся тэги с одним ID!!!
Нужно было так записывать:
[HTML]img[c].onmouseover=function(i){return function(){eff(i,'mouseover')}}(img[c])
img[c].onmouseout=function(i){return function(){eff(i,'')}}(img[c])[/HTML]
В предыдущем посту исправил.
img[c].onmouseout = eff;
?
Код:
img[c].onmouseover = eff;
img[c].onmouseout = eff;
?
А так, я не могу достать объект внутри обработчика (не знаю как).
Я, конечно, хочу записать, как можно проще. В идеале, было бы хорошо передавать в функцию только событие или объект, а уже там доставать недостающие части. Мне, для работы этой функции, нужно два параметра - объект и событие. Если Вы знаете как такое сделать, подскажите, пожалуйста.
Установите обработчики событий так, как я показал. В функции eff ключевое слово this будет указывать на объект (изображение в данном случае), на котором произошло событие. А само событие будет передано первым параметром в функцию (в IE первого параметра не будет, поэтому используйте window.event)...
[HTML]function eff(e){
var i=this.id
if (timer){clearInterval(timer)}
if (!e){e=window.event}
if ((e.type)!='mouseover'){z=y;var t=dn}
else{z=x;var t=up}
timer=setInterval(function(){return time(this)},t)}[/HTML]
Но теперь незнаю как передать объект дальше, в функцию time().:)
Так не работает.
Но теперь незнаю как передать объект дальше, в функцию time().:)
timer = setInterval(function () { return time(caller); }, t);
document.body.onclick = function () {
var caller = this; // Create a pointer to the <body>
window.setTimeout(function () { return test(caller); }, 1000);
};
};
function test(o) {
alert(o.tagName); // "BODY", of course!
};
Значит что-то не так делаешь. И вообще лучше сразу в функцию передать объект через this, ибо зачем плодить лишние переменные если они потом все равно не используются.
Что значит "передать объект через this"? И о каких "лишних переменных" идет речь?
var caller = this;
timer = setInterval(function () { return time(caller); }, t);
Я имел ввиду в том духе, что сразу делать time(this), но сейчас вспомнил, что в данной задачи ни какого фреймоврка не используется, значит экземпляров класса нет.
Поэтому в данном случае объект так и нужно дальше передавать по цепочке:
....
function eff(e){
......
time(e)
......
Вот эта строчка будет работать?
timer=setInterval('time('+this.id+')',t)}
заработало.
Везде внес изменения.
Всем спасибо.