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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> изменение ширины div-a по событию onMouseover, при наведении мыши ширина div-a увеличив 
:(
    Опции темы
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   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




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


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

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