Модераторы: Sardar, Aliance

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> изменение ширины div-a по событию onMouseover, при наведении мыши ширина div-a увеличив 
:(
    Опции темы
Enya
  Дата 7.2.2008, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 5.10.2005

Репутация: нет
Всего: нет



У нас есть div высота 100% ширина 1-2рх, при попадании курсора мыши на эту полоску. Ширина увеличивается стремительно до 25рх, соотвественно когда курсор уходит - то так же стремительно причется в 1-2рх шириной полоску.

Много всякой инфы по событиям связанными с элементами формы, а вот по таким мелким анимационным не очень. Буду благодарна (+) за помощь.


--------------------

Утсанвлен Денвер
1. PHP Version 5.1.6
2. MySQL 5.0.18-max
3. phpMyAdmin 2.6.1
PM MAIL WWW ICQ   Вверх
ksnk
Дата 8.2.2008, 00:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Enya, Чудес, как правило, не бывает. Видимо скрипт чего-то хочет от этой полоски, или в CSS про нее чего-нибудь такое написано. Откройте страничку в FireFox с установленным FireBug и сделайте Inspect Element. Возможно, что-нибудь прояснится... 


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Ghirik
Дата 8.2.2008, 00:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 919
Регистрация: 26.3.2007

Репутация: 13
Всего: 20



ksnk, Вы наверное экстрасенс smile 

Я пять раз прочитал текст сообщения, посмотрел на название темы.... Но не смог понять чего надо. smile 

Если у Enya, есть такой скрипт, то, показывать, как такое сделать, вроде не нужно. А что тогда нужно?


--------------------
Отдадим всё клиенту, пускай его машина мучается...

PM MAIL   Вверх
KuZyagroup
Дата 8.2.2008, 05:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


magento solution
**


Профиль
Группа: Участник
Сообщений: 283
Регистрация: 16.4.2007
Где: Kiev

Репутация: 1
Всего: 4



2Ghirik - коходу ksnk вообще не экстра сэнс. Он ответил явно не на вопрос Enya.
2Enya Сейчас накидаю план, когда освобожусь напишу пример.
1. ловим onMouseOver и передаем в myJS() наш див(или ловим его в функции по id)
2. зaпускаем c задержкой по setTimeout myJS если надо
Что делает сама JS. Она узнает текущий размер div-a и если надо увеличиваетпо сеттаймаут

примерный код
Код

function myJS() {
 divlength = GetElementById(...).style.width;
 if (divlength<25) {
     divlength += (25-divlength)*2+1;
     if (divlength < 25 )  diclength = 25;
     setTimeout('myJS()',200); // Ключивой момент
 }
}


Добавлено через 13 минут и 56 секунд
по ходу выполнения кода советую выкурить первых две темы факъю  данного подфорума
http://forum.vingrad.ru/faq/topic-148995.html
http://forum.vingrad.ru/faq/topic-185836/k...settimeout.html
PM MAIL   Вверх
Enya
Дата 8.2.2008, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 5.10.2005

Репутация: нет
Всего: нет



Код

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>div JS</title>
<link rel="stylesheet" type="text/css" href="my.css">
<script language="Javascript" type="text/javascript">
<!--
    function myJS() {
        divlength = GetElementById(my).style.width;
             if (divlength<25) {
                 divlength += (25-divlength)*2+1;
                 if (divlength < 25 )  diclength = 25;
                 setTimeout('myJS()',200); // Ключивой момент
             }
    }
-->
</script>
</head>
<body>
<div id="my" onmouseover="myJS()"></div>
</body>
</html>



--------------------

Утсанвлен Денвер
1. PHP Version 5.1.6
2. MySQL 5.0.18-max
3. phpMyAdmin 2.6.1
PM MAIL WWW ICQ   Вверх
SelenIT
Дата 8.2.2008, 09:58 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 49
Всего: 401



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

Но вот пример кода, увы, явно безграмотный. А вот рабочий вариант:
Код

<script type="text/javascript">
function anim() {
   if (anim.timer) clearTimeout(anim.timer); // сброс прошлой анимации при смене направления
   if ((anim.obj.offsetWidth < anim.max && anim.dir > 0) || (anim.obj.offsetWidth > anim.min && anim.dir < 0)) {
      anim.obj.style.width = anim.obj.offsetWidth + anim.step*anim.dir + 'px';
      anim.timer = window.setTimeout(anim, anim.duraition/anim.step);
   }
}
anim.min = 5;          // минимальный размер, px
anim.max = 25;         // максимальный -"-
anim.duraition = 200;  // длительность анимации, мс
anim.step = 5;         // шаг анимации, px
</script>
<style>
#dd { width: 5px; height: 100%; background: #a88; }
</style>
<div id="dd" onmouseover="anim.obj=this;anim.dir=1;anim();" onmouseout="anim.obj=this;anim.dir=-1;anim();"></div>

Тут все параметры анимации, а также анимируемый объект и направление анимации (сворачивать или разворачивать) хранятся в статических переменных ф-ции (чтоб не заморачиваться с привязкой this), и нет неявного eval в таймауте...


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
ksnk
Дата 8.2.2008, 11:43 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Ну да, в цирке мне, видимо, выступать пока рано. ;-)
Если изменить первые строчки функции SelenIT'а вот так
Код

function anim(e,d) {
   if((d==1)||(d==-1)){anim.obj=e;anim.dir=d} // проверка на корректность в НУЖНА!
...

, то можно будет писать в html немного поменьше:
Код

<div id="dd" onmouseover="anim(this,1)" onmouseout="anim(this,-1)"></div>




--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
KuZyagroup
Дата 8.2.2008, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


magento solution
**


Профиль
Группа: Участник
Сообщений: 283
Регистрация: 16.4.2007
Где: Kiev

Репутация: 1
Всего: 4



2SelenIT согласен написано криво, но я жн подчеркнул что это не код а направление в котором нужно писать.
П.С. 2Enya Вы хоть разобрались, а то в вашем посте( копи пастлом сделаный) JS с ошибками

Добавлено через 4 минуты и 44 секунды
2ksnk - this +setTimeout это опасная возможность словить грабли
PM MAIL   Вверх
bars80080
Дата 8.2.2008, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 15
Всего: 315



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

в меру своего разумения js, я так полагаю, там просто объект один и ему присваиваются каждый новые параметры, в т.ч. указатель на див, а вот как сделать чтобы всё равно сворачивалось?
PM MAIL WWW   Вверх
SelenIT
Дата 8.2.2008, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 49
Всего: 401



KuZyagroup, в том-то и фокус предложения ksnkа, что this передается только один раз, до возникновения граблей smile
Грабли тут, по-моему, могут быть в другом месте - в Gecko (из-за нестандартного параметра-задержки), и то лишь если поменять аргументы местами...

bars80080, абсолютно верное замечание. Об универсальности я действительно особо не задумывался. Первая мысль - завести хеш анимируемых элементов и передавать их id (а заодно и анимировать все разом, по одному таймеру - меньше вычислений), но не исключаю, что есть решение и лучше...


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
ksnk
Дата 8.2.2008, 17:34 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



SelenIT, Можно обойтись одной функцией как сейчас. Нужно только заменить setTimeout на setInterval и переписать чуть-чуть работу с ним. Ну и сбрасывать "предыдущую" анимацию в начальное состояние anim.obj.width=''.
Вот. Двигается немного глючно - зато спортивно - все в одной функции smile
Код

<body>
<script type="text/javascript">
function anim(e,d) {
    if (anim.obj && e!=anim.obj){
        anim.obj.style.width='';
    }
    if (anim.timer) clearInterval(anim.timer); // сброс прошлой анимации при смене направления
    anim.obj=e; anim.dir=d;
    anim.timer=setInterval(function(){
        if ((anim.obj.offsetWidth < anim.max && anim.dir > 0)
            || (anim.obj.offsetWidth > anim.min && anim.dir < 0)) 
        {
            anim.obj.style.width = anim.obj.offsetWidth + anim.step*anim.dir + 'px';
        } else {
            clearInterval(anim.Timer);  anim.Timer=null;
        }
    },anim.duraition/anim.step);
}
anim.min = 5;          // минимальный размер, px
anim.max = 25;         // максимальный -"-
anim.duraition = 200;  // длительность анимации, мс
anim.step = 5;         // шаг анимации, px
</script>
<style>
.dd, .ddd { float:left; width: 5px; height: 100%; }
.dd { background: #a88; }
</style>
<div class="dd" onmouseover="anim(this,1)" onmouseout="anim(this,-1)"></div>
<div class="ddd" ></div>
<div class="dd" onmouseover="anim(this,1)" onmouseout="anim(this,-1)"></div>
<div class="ddd" ></div>
<div class="dd" onmouseover="anim(this,1)" onmouseout="anim(this,-1)"></div>
<div class="ddd" ></div>
<div class="dd" onmouseover="anim(this,1)" onmouseout="anim(this,-1)"></div>
<div class="ddd" ></div>
<div class="dd" onmouseover="anim(this,1)" onmouseout="anim(this,-1)"></div>
<div class="ddd" ></div>
<div class="dd" onmouseover="anim(this,1)" onmouseout="anim(this,-1)"></div>
<div class="ddd" ></div>
<div class="dd" onmouseover="anim(this,1)" onmouseout="anim(this,-1)"></div>
<div class="ddd" ></div>
<div class="dd" onmouseover="anim(this,1)" onmouseout="anim(this,-1)"></div>
<div class="ddd" ></div>
<div class="dd" onmouseover="anim(this,1)" onmouseout="anim(this,-1)"></div>
<div class="ddd" ></div>
<div class="dd" onmouseover="anim(this,1)" onmouseout="anim(this,-1)"></div>
<div class="ddd" ></div>
<div class="dd" onmouseover="anim(this,1)" onmouseout="anim(this,-1)"></div>
<div class="ddd" ></div>
<div class="dd" onmouseover="anim(this,1)" onmouseout="anim(this,-1)"></div>
<div class="ddd" ></div>
<div class="dd" onmouseover="anim(this,1)" onmouseout="anim(this,-1)"></div>
<div class="ddd" ></div>
<div class="dd" onmouseover="anim(this,1)" onmouseout="anim(this,-1)"></div>
<div class="ddd" ></div>
<div class="dd" onmouseover="anim(this,1)" onmouseout="anim(this,-1)"></div>
<div class="ddd" ></div>
<div class="dd" onmouseover="anim(this,1)" onmouseout="anim(this,-1)"></div>
<div class="ddd" ></div>
<div class="dd" onmouseover="anim(this,1)" onmouseout="anim(this,-1)"></div>
<div class="ddd" ></div>
<div class="dd" onmouseover="anim(this,1)" onmouseout="anim(this,-1)"></div>
<div class="ddd" ></div>
<div class="dd" onmouseover="anim(this,1)" onmouseout="anim(this,-1)"></div>
<div class="ddd" ></div>
<div class="dd" onmouseover="anim(this,1)" onmouseout="anim(this,-1)"></div>
<div class="ddd" ></div>
<div class="dd" onmouseover="anim(this,1)" onmouseout="anim(this,-1)"></div>
<div class="ddd" ></div>
<div class="dd" onmouseover="anim(this,1)" onmouseout="anim(this,-1)"></div>
<div class="ddd" ></div>
<div class="dd" onmouseover="anim(this,1)" onmouseout="anim(this,-1)"></div>
<div class="ddd" ></div>
<div class="dd" onmouseover="anim(this,1)" onmouseout="anim(this,-1)"></div>
<div class="ddd" ></div>
<div class="dd" onmouseover="anim(this,1)" onmouseout="anim(this,-1)"></div>
</body>


Это сообщение отредактировал(а) ksnk - 8.2.2008, 17:37


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
SelenIT
Дата 9.2.2008, 05:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 49
Всего: 401



Для полноты картины я все-таки довел до реализации свою идею с хешем (точнее, двумя, как оказалось;) внутри ф-ции:
Код

<script type="text/javascript">
function anim(id,dir) {
   // ставим таймер "впрок", чтобы не терять время на вычисления (для плавности)
   anim.timer = window.setTimeout(anim, anim.duraition*anim.step/(anim.max - anim.min));
   // если первый раз - инициализируем хеши объектов и направлений анимации
   if (!anim.obj) {
      anim.obj = {};
      anim.dir = {};
   }
   // обновляем хеши по текущей ситуации (новому событию)
   if ((dir == 1) || (dir == -1)) {
      anim.dir[id]=dir;
      if (!anim.obj[id]) anim.obj[id]=document.getElementById(id);
   }
   // флаг активности анимации (хотя бы одной)
   var playing = false;
   // идем по хешу, анимируем те объекты, для которых это актуально
   for (var i in anim.obj) {
      if ((anim.obj[i].offsetWidth < anim.max && anim.dir[i] > 0) ||
          (anim.obj[i].offsetWidth > anim.min && anim.dir[i] < 0)) {
         anim.obj[i].style.width = anim.obj[i].offsetWidth + anim.step*anim.dir[i] + 'px';
         // и устанавливаем флаг, что анимация активна
         playing = true;
      }
   }
   // если все анимации закончились - сбрасываем таймер
   if (!playing) window.clearTimeout(anim.timer);
}
anim.min = 10;         // минимальный размер, px
anim.max = 45;         // максимальный -"-
anim.duraition = 600;  // длительность анимации, мс
anim.step = 5;         // шаг анимации, px

</script>
<style>
div { width: 10px; height: 20%; margin: 2px; background: #8a8; }
</style>
<div id="dd0" onmouseover="anim('dd0',1)" onmouseout="anim('dd0',-1)"></div>
<div id="dd1" onmouseover="anim('dd1',1)" onmouseout="anim('dd1',-1)"></div>
<div id="dd2" onmouseover="anim('dd2',1)" onmouseout="anim('dd2',-1)"></div>
<div id="dd3" onmouseover="anim('dd3',1)" onmouseout="anim('dd3',-1)"></div>

Заодно исправил идиотскую арифметическую ошибку с расчетом задержки для таймаута (стр. 6 в моем прошлом коде - должно быть как в стр. 4 в новом)... И чуть увеличил величину и время "выезда" табов - для наглядности.


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
Ghirik
Дата 9.2.2008, 07:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 919
Регистрация: 26.3.2007

Репутация: 13
Всего: 20



Ох и упрямы Вы человек,SelenIT!
Класная реализация! Я как раз собирался подобную штуковину делать, а тут так красиво решено....
Спасибо.

P.S. только что то в FF не видно дивы, может я не так собрал страницу.... 


Ага, стили не правильно прикрутил... Все, работает в FF.

Это сообщение отредактировал(а) Ghirik - 9.2.2008, 07:30


--------------------
Отдадим всё клиенту, пускай его машина мучается...

PM MAIL   Вверх
Enya
Дата 9.2.2008, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 5.10.2005

Репутация: нет
Всего: нет



А если полоску Div расположить по центру. то в какую сторону будет увеличиваться ширина?

Добавлено через 5 минут и 37 секунд
Я использовала вот этот код.
Код

BODY{
    margin: 0px;
    padding: 0px;
}
#dd {
    width: 1px;
    height: 100%;
    background: #a88;
    position: absolute;
    left: 60%;
}
Код

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>div JS</title>
<link rel="stylesheet" type="text/css" href="my.css">
<script type="text/javascript">
function anim(e,d) {
   if((d==1)||(d==-1)){anim.obj=e;anim.dir=d} // сброс прошлой анимации при смене направления
   if ((anim.obj.offsetWidth < anim.max && anim.dir > 0) || (anim.obj.offsetWidth > anim.min && anim.dir < 0)) {
      anim.obj.style.width = anim.obj.offsetWidth + anim.step*anim.dir + 'px';
      anim.timer = window.setTimeout(anim, anim.duraition/anim.step);
   }
}
anim.min = 1;          // минимальный размер, px
anim.max = 45;         // максимальный -"-
anim.duraition = 200;  // длительность анимации, мс
anim.step = 5;         // шаг анимации, px
</script>
</head>
<body>
    <div id="dd" onmouseover="anim(this,1)" onmouseout="anim(this,-1)"></div>
</body>
</html>

А почему увеличивается в право? а если в лево? можно? smile 


--------------------

Утсанвлен Денвер
1. PHP Version 5.1.6
2. MySQL 5.0.18-max
3. phpMyAdmin 2.6.1
PM MAIL WWW ICQ   Вверх
AKS
Дата 9.2.2008, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Цитата(Enya @  9.2.2008,  14:23 Найти цитируемый пост)
А почему увеличивается в право? а если в лево? можно?  

Можно хоть вправо, хоть влево, хоть в обе стороны. Для этого достаточно знать принципы позиционирования элементов. Тогда и js-код менять не понадобится. Вот простой пример (для "раздвижения" в обе стороны):
css:
Код

#dd {
    text-align:center;
}
#dd div {
    width:10px;
    height:10%;
    background:#a88;
    margin:0 auto;
}

html:
Код

<div id='dd'>
    <div onmouseover="anim(this,1)" onmouseout="anim(this,-1)">X</div>
</div>



Цитата(SelenIT @  9.2.2008,  05:33 Найти цитируемый пост)
Для полноты картины я все-таки довел до реализации свою идею с хешем (точнее, двумя, как оказалось;) внутри ф-ции

Не "лежит" у Вас душа к closures. ;) А ведь тогда можно было обойтись без обращения к глобальным данным (статическим св-вам функции). Как мне кажется, это бы позволило сделать решение более производительным.

PM MAIL   Вверх
Ghirik
Дата 9.2.2008, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 919
Регистрация: 26.3.2007

Репутация: 13
Всего: 20



А подскажите, пожалуйста, как height:10%; прикрутить к доктипу XHTML 1.0 Transitional.
И вообще, может у кого есть ссылочка на современное русское описание CSS. А то я чувствую, что моих знаний недостаточно... вернее, отсутствия знаний недостаточно... smile 

Это сообщение отредактировал(а) Ghirik - 9.2.2008, 22:40


--------------------
Отдадим всё клиенту, пускай его машина мучается...

PM MAIL   Вверх
SelenIT
Дата 10.2.2008, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 49
Всего: 401



Цитата(AKS @  9.2.2008,  18:02 Найти цитируемый пост)
Не "лежит" у Вас душа к closures. ;) А ведь тогда можно было обойтись без обращения к глобальным данным (статическим св-вам функции).

AKS, скорее у меня мозги не всегда соображают, как ими воспользоваться smile. Вот и тут - параметры я еще могу представить, как заclosur'ить, но вот как через closures "захватить и удержать" сами анимированные объекты, особенно когда их много, без размножения таймеров - пардон, откровенно туплю. Буду весьма благодарен за подсказку. И за указание на промахи по части производительности тоже.

Ghirik, про CSS тут неплохой справочник, еще неплохо здесь написано. Но многое легче запоминается не по справочникам, а из практики. Например, то, что размеры в процентах наследуются только от явно указанной высоты, и если нужны проценты от экрана, то необходимо указывать 100%-ю высоту, начиная с корневого элемента - html, body { height: 100%; }. Хотя здесь это оффтопик ;)


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
Ghirik
Дата 10.2.2008, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 919
Регистрация: 26.3.2007

Репутация: 13
Всего: 20



Цитата

Например, то, что размеры в процентах наследуются только от явно указанной высоты, и если нужны проценты от экрана, то необходимо указывать 100%-ю высоту, начиная с корневого элемента - html, body { height: 100%; }


Как там у Шерлока - "Ну, когда-то я это знал, а потом изрядно забыл" smile 
SelenIT, спасибо. Ни фига не оффтопик, а конкретная рекомендация по использованию кода, выложенного в этой ветке. smile 

Вот, я тут свой вариант нарисовал:

Код

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<title>multiDiv floating</title>
<style type="text/css">
html, body {
    height: 100%;
    margin: 0;
}
.anime {
    width: 1px;
    height: 10%;
    margin: 2px;
    background: #A8A;
}
</style>
<script type="text/javascript">
<!--
var min = 20;          // минимальный размер, px
var max = 200;         // максимальный -"-
var t = 15;            // скорость анимации
function divSize() {this.size == min ? this.size = max : this.size = min};
function on() {
    div = document.getElementsByTagName('div');
    for (var i = 0; i < div.length; i++) {
        if (div[i].className == 'anime') {
            div[i].size = min;
            div[i].x = 0;
            div[i].onmouseover = divSize;
            div[i].onmouseout = divSize;
        }
    }
}
function divMotion() {
    for (var i = 0; i < div.length; i++) {
        if (div[i].className == 'anime') {
            if(div[i].size != div[i].x) {
                var add = .1 * (div[i].size - div[i].x);
                add > 0 ? add = Math.ceil(add) : add = Math.floor(add);
                div[i].style.width = div[i].offsetWidth + add + 'px';
                div[i].x = div[i].x + add;
            }
        }
    }
}
window.onload = on;
window.setInterval("divMotion()", t);
//-->
</script>
</head>
<body>
<div class="anime"></div>
<div class="anime"></div>
<div class="anime"></div>
<div class="anime"></div>
<div class="anime"></div>
<div class="anime"></div>
<div class="anime"></div>
<div class="anime"></div>
<div class="anime"></div>
<div class="anime"></div>
</body>
</html>


Ну шибко доволен результатом smile 
Понравилось глобализовать массив через document.getElementsByTagName. И очень легко, можно менять поведенчиские свойства всех дивов страницы через отбор по классу при начальной загрузке. Даже id не требуется.... Немного изменив основную функцию, можно приводить элементы к заданным размерам и по вертикали, а направление раскрывания определить стилями.

Особенно хорошо IE анимирует...


Это сообщение отредактировал(а) Ghirik - 10.2.2008, 01:07


--------------------
Отдадим всё клиенту, пускай его машина мучается...

PM MAIL   Вверх
AKS
Дата 10.2.2008, 08:20 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Цитата(SelenIT @  10.2.2008,  00:28 Найти цитируемый пост)
Вот и тут - параметры я еще могу представить, как заclosur'ить, но вот как через closures "захватить и удержать" сами анимированные объекты, особенно когда их много, без размножения таймеров - пардон, откровенно туплю.

Да я имел ввиду то, что можно сделать в точности, как у Вас (с сохранением ссылок на DOM-узлы в объекте), просто еще вместо хранения параметров анимации в св-вах функции anim "засунуть" их в переменные функции. Вот, примерно так:
Код

var anim = function () {
    var min = 10;
    var max = 45;
    /* все остальные переменные из св-в anim, 
    * а заодно и anim.obj:
    */
    var cache = {}; // одного cache будет достаточно вместо anim.obj/anim.dir
    var interval = 0;
    /*
    * отдельно функция идентификации параметров
    */
    function initElem(aID, aDirection) {
        /* здесь все тоже самое, только вместо св-в функции anim
        * будут использоваться свободные переменные из внешней функции
        */
        if (!cache[aID]) {
            var elem = document.getElementById(aID);
            cache[aID] = {
                elem: elem
            };
        };
        cache[aID].dir = aDirection; 
        if (!interval) {
            interval = window.setInterval(setWidth, delay);
            /*
            * delay тоже можно вычислить заранее -
            * он у Вас все равно неизменный, так ведь?
            */
        };
    };
    /*
    * отдельно функция изменения ширины
    */
    function setWidth() {
    /*
    * те же самые действия, но с переменными -
    * а то много точек, а это ведь тоже оператор
    */
        var i, o, d, w;
        for (i in cache) {
            o = cache[i].elem;
            d = cache[i].dir;
            w = o.offsetWidth;
            if ((w < rbound && d > 0) ||
                    (w > lbound && d < 0)) {
                o.style.width = w + step * d + 'px';
            };
        };
        /*
        * здесь же, если что, очистить установленный
        * интервал для этой функции
        */
    };
    return initElem;
}();


PM MAIL   Вверх
Enya
Дата 10.2.2008, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 5.10.2005

Репутация: нет
Всего: нет



AKS, с основными принципами позиционирования знакома, но вот сделать увеличение ширины в лево не получилось. 



--------------------

Утсанвлен Денвер
1. PHP Version 5.1.6
2. MySQL 5.0.18-max
3. phpMyAdmin 2.6.1
PM MAIL WWW ICQ   Вверх
ksnk
Дата 10.2.2008, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



AKS, 
Цитата(AKS @  10.2.2008,  08:20 Найти цитируемый пост)
var anim = function () {    
  var min = 10;   
  var max = 45;

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


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
AKS
Дата 10.2.2008, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



ksnk, еще напишите, что необходим интерфейс, который бы позволил принимать вводимые посетителями сайта параметры для анимации (размер, задержка). smile
И зачем "ковыряться" в функции – установил нужные константы и все. А то, что варьируется можно передавать вместе с id/direction. Да и "поковыряться", если что, в функции можно – лучше, чем ковыряться в носу от безделья и лени. ;)

Enya, у Вас не получается с тем примером, что я написал вчера?
PM MAIL   Вверх
Enya
Дата 10.2.2008, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 5.10.2005

Репутация: нет
Всего: нет



AKS, да, не вышло.


--------------------

Утсанвлен Денвер
1. PHP Version 5.1.6
2. MySQL 5.0.18-max
3. phpMyAdmin 2.6.1
PM MAIL WWW ICQ   Вверх
AKS
Дата 10.2.2008, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Enya, честное слово - не знаю, почему у Вас не "вышло". Вот такие правила css расположат блок (внутренний) посередине документа, а "выдвигаться" он будет влево:
Код

#dd {
    width:50%;
    text-align:right;
}
#dd div {
    width:10px;
    height:10%;
    background:#a88;
    margin:0 0 auto auto;
}

Код

<div id='dd'>
    <div onmouseover="anim(this, 1)" onmouseout="anim(this,-1)">X</div>
</div>

А вчерашний вариант должен был позволить блоку "раздвигаться" в обе стороны. Ей богу не пойму, почему у Вас все иначе...
PM MAIL   Вверх
ksnk
Дата 10.2.2008, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Цитата(AKS @  10.2.2008,  14:28 Найти цитируемый пост)
И зачем "ковыряться" в функции – установил нужные константы и все.

А для другого приложения - установил новые параметры и все...? И для третьего... А функция обязана сидеть в той html'е , в которой применяется, а совсем не в отдельной библиотеке? слишком много ограничений...
Вообще-то более разумно , imho, было бы хранить такие границы в html разметке. Вдруг кому-то понадобится оранизовать какую-то сложную систему менюшков...
Код

<div onmouseover="anim(this, 1)" onmouseout="anim(this,-1)" min=10 max=45>X</div>





--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
AKS
Дата 10.2.2008, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



ksnk, для того, чтобы функция "сидела" в библиотеке, она должна быть универсальной. Сумеете написать такую? Да нет, конечно. Даже, если получится "накропать" что-то, претендующее на готовое решение "на все времена", то это должно получиться нечто монструозное. А Вам ведь известно, к чему могут привести попытки унификации.
Если говорить конкретно о "системе менюшков", то любые эти min/max будут совершенно непригодны. Простое увеличение шрифта превратит такую "систему" в "кашу".
Я это все к тому, что js-библиотеки - это утопия. Осознание этого приходит с пониманием того, насколько нестабильно окружение, в котором должна быть выполнена js-программа. На мой взгляд, "терапия" должна иметь в своем распоряжении инструмент, заточенный под конкретную задачу. И чем он острее (тоньше, если угодно), тем он эффективнее. 
А приведенные здесь примеры все непригодны - они хороши лишь для "тренинга". В нашем случае, например, функция должна обязательно получить id элемента, а это уже немалое ограничение. Удобно ли ее использовать при установке обработчиков посредством addEventListener/attachEvent?

Это сообщение отредактировал(а) AKS - 10.2.2008, 15:36
PM MAIL   Вверх
ksnk
Дата 10.2.2008, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Цитата(AKS @  10.2.2008,  15:34 Найти цитируемый пост)
для того, чтобы функция "сидела" в библиотеке, она должна быть универсальной. Сумеете написать такую?
 Ваши требования меня пугают smile  Следуя такой "установке" вообще ничего "универсального" делать не стоит. К тому-же универсальное на все времена или на пару ближайших проектов-сайтов, разные страницы которых вполне вероятно захотят использовать что-то такое?



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Ghirik
Дата 13.2.2008, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 919
Регистрация: 26.3.2007

Репутация: 13
Всего: 20



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

В варианте с хэшем можно смело использовать style.clip. Для кроссбраузерного присвоения начальных значений следует делать такую запись.

Код

 clip: rect(40px, auto, auto, 40px);
 clip: rect(40px auto auto 40px);


Это, если вы используете строгий или переходный доктайп.
Первая строчка по спецификации, вторая для IE( smile ).
Еще лучше, эти строчки прописать прямо в тэгах.

Из JavaScript-а значения clip прописываются нормально с запятыми, и в IE, и в остальных.
Если потребуется доставать clip:rect, можно воспользоваться подобным выражением:

Код

animeWidth = Number(/\d*[^p]/.exec(animeDiv[i].style.clip.replace(/rect\(auto(, | )auto(, | )auto(, | )/,'')));


Эта строка достает из 'rect(auto, auto, auto, 40px)'  значение 40 и делает его числовым.

В выложенном мной варианте использовать clip у меня не получилось. Основная причина, циклическое считывание действующего значения clip:rect полностью забирает ресурсы. Но мой вариант хорошо заработал с уводом дивов в отрицательные значения, за экран. Выложить работающий код пока не могу, потому, как писал скрипт под специфическую задачу. Если потом сделаю универсальный вариант - покладу сюда.

Отлично работает ещё один вариант. Мне, кстати, он понравился больше всего. smile 

Вместо дивов я использовал изображения, генерируемые "на лету" php функцией (imagettftext()) и возвращаемые в скрытый фрейм. Работает это молниеносно, и очень годится для информирования в реальном времени посетителей сайта.

Примерно так...



--------------------
Отдадим всё клиенту, пускай его машина мучается...

PM MAIL   Вверх
Ghirik
Дата 15.2.2008, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 919
Регистрация: 26.3.2007

Репутация: 13
Всего: 20



Я прошу прощения, бессмысленный оказался пост, модераторы, удалите пожалуйста.

Это сообщение отредактировал(а) Ghirik - 15.2.2008, 22:10


--------------------
Отдадим всё клиенту, пускай его машина мучается...

PM MAIL   Вверх
Onis
Дата 14.8.2008, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 241
Регистрация: 18.6.2005
Где: Украина, Николаев

Репутация: 2
Всего: 3



SelenIT, 
Переделал ваш шикарный скрипт для себя. Он теперь у меня работает с привью картинок, пока всё симпатично.

Но вот никак не могу домыслить как сделать так чтобы картинки увеличивались пропорционально во все стороны а не от верхнего левого угла.
И вообще это реально?

Код

<html>
<head>
<title>Thumbs</title>
</head>
<script type="text/javascript">

function getPositionX(o)
{var x=0;while(o){x+=o.offsetLeft;o=o.offsetParent;}return x;};
function getPositionY(o)
{var y=0;while(o){y+=o.offsetTop;o=o.offsetParent;}return y;};

function anim(id,dir) 
{
   // ставим таймер "впрок", чтобы не терять время на вычисления (для плавности)
    anim.timer = window.setTimeout(anim, anim.duraition*anim.step/(anim.max - anim.min));
   // если первый раз - инициализируем хеши объектов и направлений анимации
    if (!anim.obj) 
    {
        anim.obj = {};
        anim.dir = {};
    }
   // обновляем хеши по текущей ситуации (новому событию)
    if ((dir == 1) || (dir == -1)) 
    {
        anim.dir[id]=dir;
        
        if (!anim.obj[id])
            anim.obj[id]=document.getElementById(id);
    }
    
    
    // флаг активности анимации (хотя бы одной)
    var playing = false;
    // идем по хешу, анимируем те объекты, для которых это актуально
    if(anim.dir[id] == 1)
    {
        anim.obj[id].style.top = getPositionY(anim.obj[id]);
        anim.obj[id].style.left = getPositionX(anim.obj[id]);
        anim.obj[id].style.zIndex = 100;
        anim.obj[id].style.position = "absolute";
    }
    if(anim.dir[id] == -1)
    {
        anim.obj[id].style.zIndex = 0;
    }
        
    for (var i in anim.obj) 
    {
        if ((anim.obj[i].offsetWidth < anim.max && anim.dir[i] > 0) || (anim.obj[i].offsetWidth > anim.min && anim.dir[i] < 0)) 
        {
            anim.obj[i].style.width = anim.obj[i].offsetWidth + anim.step*anim.dir[i] + 'px';
            // и устанавливаем флаг, что анимация активна
            
            playing = true;
        }
    }
    
   // если все анимации закончились - сбрасываем таймер
    if (!playing)
    {
        for (var i in anim.obj) 
        {
            if(anim.dir[i] == -1)
            {
                anim.obj[i].style.position = "static";
                
            }
        }
        window.clearTimeout(anim.timer);
    }
}
anim.min = 100;         // минимальный размер, px
anim.max = 150;         // максимальный -"-
anim.duraition = 200;  // длительность анимации, мс
anim.step = 10;         // шаг анимации, px

</script>
<body>
<!-- this.style.position='absolute';this.style.top=getPositionY(this);this.style.left=getPositionX(this)-->
<table style="margin-top:200px;margin-left:200px" border="0">
<tr height="100">
<td width="100">
<img src="test.jpg" id="test.jpg" onmouseover="anim(this.id,1);" onmouseout="anim(this.id,-1);" width="100"/>
</td>
<td width="100">
<img src="test2.jpg" id="test2.jpg" onmouseover="anim(this.id,1)" onmouseout="anim(this.id,-1)" width="100"/>
</td>
<td width="100">
<img src="test3.jpg" id="test3.jpg" onmouseover="anim(this.id,1)" onmouseout="anim(this.id,-1)" width="100"/>
</td>
<td width="100">
<img src="test4.jpg" id="test4.jpg" onmouseover="anim(this.id,1)" onmouseout="anim(this.id,-1)" width="100"
</td>
<td width="100">
<img src="test5.jpg" id="test5.jpg" onmouseover="anim(this.id,1)" onmouseout="anim(this.id,-1)" width="100"/>
</td>
</tr>
</table>
</body>
</html>


зы: я грэйв диггер  smile 
PM MAIL   Вверх
Onis
Дата 14.8.2008, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 241
Регистрация: 18.6.2005
Где: Украина, Николаев

Репутация: 2
Всего: 3



Сам допер.

Симпатично получилось: пример работы скрипта

Код

<html>
<head>
<title>Thumbs</title>
</head>
<script type="text/javascript">

function getPositionX(o)
{var x=0;while(o){x+=o.offsetLeft;o=o.offsetParent;}return x;};
function getPositionY(o)
{var y=0;while(o){y+=o.offsetTop;o=o.offsetParent;}return y;};

function anim(id,dir) 
{
   // ставим таймер "впрок", чтобы не терять время на вычисления (для плавности)
    anim.timer = window.setTimeout(anim, anim.duraition*anim.step/(anim.max - anim.min));
   // если первый раз - инициализируем хеши объектов и направлений анимации
    if (!anim.obj) 
    {
        anim.obj = {};
        anim.dir = {};
    }
   // обновляем хеши по текущей ситуации (новому событию)
    if ((dir == 1) || (dir == -1)) 
    {
        anim.dir[id]=dir;
        
        if (!anim.obj[id])
            anim.obj[id]=document.getElementById(id);
    }
    
    
    // флаг активности анимации (хотя бы одной)
    var playing = false;
    // идем по хешу, анимируем те объекты, для которых это актуально
    if(anim.dir[id] == 1)
    {
        anim.obj[id].style.top = getPositionY(anim.obj[id]);
        anim.obj[id].style.left = getPositionX(anim.obj[id]);
        anim.obj[id].style.zIndex = 100;
        anim.obj[id].style.position = "absolute";
    }
    if(anim.dir[id] == -1)
    {
        anim.obj[id].style.zIndex = 0;
    }
        
    for (var i in anim.obj) 
    {
        if ((anim.obj[i].offsetWidth < anim.max && anim.dir[i] > 0) || (anim.obj[i].offsetWidth > anim.min && anim.dir[i] < 0)) 
        {
            anim.obj[i].style.top = getPositionY(anim.obj[i])-(anim.step*anim.dir[i])/2;
            anim.obj[i].style.left = getPositionX(anim.obj[i])-(anim.step*anim.dir[i])/2;
            anim.obj[i].style.width = anim.obj[i].offsetWidth + anim.step*anim.dir[i] + 'px';
            // и устанавливаем флаг, что анимация активна
            
            playing = true;
        }
    }
    
   // если все анимации закончились - сбрасываем таймер
    if (!playing)
    {
        for (var i in anim.obj) 
        {
            if(anim.dir[i] == -1)
            {
                anim.obj[i].style.position = "static";
                
            }
        }
        window.clearTimeout(anim.timer);
    }
}
anim.min = 100;         // минимальный размер, px
anim.max = 150;         // максимальный -"-
anim.duraition = 200;  // длительность анимации, мс
anim.step = 10;         // шаг анимации, px

</script>
<body>
<!-- this.style.position='absolute';this.style.top=getPositionY(this);this.style.left=getPositionX(this)-->
<table style="margin-top:200px;margin-left:200px" border="0">
<tr height="100">
<td width="100">
<img src="test.jpg" id="test.jpg" onmouseover="anim(this.id,1);" onmouseout="anim(this.id,-1);" width="100"/>
</td>
<td width="100">
<img src="test2.jpg" id="test2.jpg" onmouseover="anim(this.id,1)" onmouseout="anim(this.id,-1)" width="100"/>
</td>
<td width="100">
<img src="test3.jpg" id="test3.jpg" onmouseover="anim(this.id,1)" onmouseout="anim(this.id,-1)" width="100"/>
</td>
<td width="100">
<img src="test4.jpg" id="test4.jpg" onmouseover="anim(this.id,1)" onmouseout="anim(this.id,-1)" width="100"
</td>
<td width="100">
<img src="test5.jpg" id="test5.jpg" onmouseover="anim(this.id,1)" onmouseout="anim(this.id,-1)" width="100"/>
</td>
</tr>
</table>
</body>
</html>


В скрипте я переделал то что при начале анимации картинка получает абсолютное позиционирование чтобы не рушить таблицу и не сдвигать другие изображения. И чтобы совсем кавайно было добавил z-index чтобы текущее изображение не перекрывалось уменьшающимся соседним. В общем шикарный у SelenIT скрипт вышел. 

Это сообщение отредактировал(а) Onis - 14.8.2008, 23:23
PM MAIL   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1062 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.