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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Плавное изменение opacity 
:(
    Опции темы
MagicDew
Дата 17.10.2011, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Добрый день, Уважаемые форумчане!

Я начинаю изучать JavaScript и хотелось бы решить следующую задачу: на странице есть несколько участков  текста, облаченных в тег <p></p> и ссылка-кнопка, при нажатии на которую у текста свойство "opacity" должно ПЛАВНО уменьшиться с 1 до 0.4. Вот то, что я смог наваять:

Код

<script type="text/javascript">
    var txtList = document.getElementsByTagName("p");
    function m_setOpacity(value){
        for (var i=0;i<txtList.length;i++){
            txtList[i].style.opacity = value/10;
        }
    }
    function m_changeOpacity(){
        for (var i=0;i<txtList.length;i++){
            setTimeout(setOpacity(i), 100);
        }
    return false;
    }
</script>


Код

<div id="content-column">
    <p>content column<p><br />
    <p>Lorem ipsum dolor sit amet...</p>
    <p>Lorem ipsum dolor sit amet...</p>
    <p>Lorem ipsum dolor sit amet...</p>
    <p>Lorem ipsum dolor sit amet...</p>
    <p>Lorem ipsum dolor sit amet...</p>
    <p>Lorem ipsum dolor sit amet...</p>

    <a href="#" onClick="m_changeOpacity()">Click Me!</a>
</div>


Вот суть проблемы:
я не понимаю как работает функция setTimeout() и как получить и проверить текущее значение свойства "opacity"

Это сообщение отредактировал(а) MagicDew - 17.10.2011, 11:05
PM MAIL   Вверх
mcTep
Дата 17.10.2011, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



setTimeout(foo, duration) говорит браузеру выполнять функцию foo c интервалом в duration миллисекунд. В foo вам надо передать именно функцию, которая будет выполняться с этим интервалом. Сейчас у вас `setOpacity(i)` это вызов функции, в результате которой возвращается какое-то значение, которое вряд ли будет функцией, судя по вашему примеру. 
Т.е. в вашем примере просто произойдет несколько вызовов фунции setOpacity и, увы, больше ничего.

Сделать стоит примерно следующее:

Код

function downgradeOpacity(elem) {
    var opa = elem.style.opacity;
    if (opa > 0.4) {
         elem.style.opacity = opa - 0.1;
    } else {
         clearInterval(elem.animationInterval);
    }
}

var pars = document.getElementsByTagName('p');
for (var i = 0, c = pars.length; i < c; i++) {
    var par = pars[i];
    par.animationInterval = setInterval(function downgradeOpacityForPar() {
        downgradeOpacity(par);
    }, 100);
}



Здесь мы заводим обработчики для каждого параграфа, и создаем ссылку на них в par.animationInterval для каждого элемента. При достижении значения  0.4 и меньше, мы этот обработчик сбрасываем через clearInteval. 

Это сообщение отредактировал(а) mcTep - 17.10.2011, 14:35
PM MAIL   Вверх
MagicDew
Дата 17.10.2011, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Поясните пожалуйста вот этот код:

Код

var pars = document.getElementsByTagName('p');
for (var i = 0, c = pars.length; i < c; i++) {
    var par = pars[i];
    par.animationInterval = setInterval(function downgradeOpacityForPar() {
        downgradeOpacity(par);
    }, 100);
}


и как вызывать и работать с этим функциями?
PM MAIL   Вверх
mcTep
Дата 18.10.2011, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Здесь мы берем нужные параграфы, потом проходясь по циклу каждому параграфу в свойство animationInterval добавляем интервал вызова функции downgradeOpacityForPar, в которой с интервалом 100 миллисекунд понижаем прозрачность конкретного параграфа. 
Этот участок кода можно обрамить в функцию и вызвать ее при, например при клике или когда вам угодно.

Код

function startAnimation() {
    var pars = document.getElementsByTagName('p');
    for (var i = 0, c = pars.length; i < c; i++) {
        var par = pars[i];
        par.animationInterval = setInterval(function downgradeOpacityForPar() {
            downgradeOpacity(par);
        }, 100);
    }
}


Код

<a href="javascript:void(0)" onclick="startAnimation()">Click Me!</a>

PM MAIL   Вверх
$дмитрий
Дата 18.10.2011, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 19.6.2004

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



Небольшая оптимизация
Код

setInterval(function downgradeOpacityForPar() {
            downgradeOpacity(par);
        }, 100);

Можно заменить на
Код

setInterval("downgradeOpacity(par)", 100);

PM MAIL   Вверх
mcTep
Дата 18.10.2011, 14:40 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Данный подход подобен использованию eval(), где текст выполняется как код. Данный подход не рекомендуется.


PM MAIL   Вверх
$дмитрий
Дата 18.10.2011, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 19.6.2004

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



Не вижу смысла в функции которая не делает ничего, кроме вызова другой функции smile 
PM MAIL   Вверх
mcTep
Дата 18.10.2011, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Ваш пример делает тоже самое smile

Добавлено через 6 минут и 32 секунды
К томуже эта функция вызывает другую в нужном нам окружении. Мы могли бы конечно сделать что-то вроде 

Код

var pars = document.getElementsByTagName('p');
    for (var i = 0, c = pars.length; i < c; i++) {
        var par = pars[i];
        par.foo = downgradeOpacity;
        par.animationInterval = setInterval(par.foo, 100);
    }


и в downgradeOpacity обращаться к параграфу через this.

PM MAIL   Вверх
MagicDew
Дата 28.10.2011, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Уважаемые mcTep и $дмитрий, спасибо, что отозвались, но, увы, приведенный вами код у меня не работает. Вот то, что я написал по вашим советам:

Код

    <script type="text/javascript">
        function downgradeOpacity(elem) {
        var opa = elem.style.opacity;
            if (opa > 0.4) {
                elem.style.opacity = opa - 0.1;
            }
            else {
                clearInterval(elem.animationInterval);
            }
        }
        function startAnimation() {
        var pars = document.getElementsByTagName('p');
            for (var i = 0, c = pars.length; i < c; i++) {
                var par = pars[i];
                par.animationInterval = setInterval(function downgradeOpacityForPar() {
                downgradeOpacity(par);
                }, 100);
//                par.animationInterval = setInterval("downgradeOpacity(par)", 100); опробовал и такой вариант
            }
        }
    </script>


Код

<a href="javascript:void(0)" onclick="startAnimation()">Click Me!</a>



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


Опытный
**


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

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



Цитата

Данный подход подобен использованию eval(), где текст выполняется как код. 
 Не правда.

Цитата

Данный подход не рекомендуется.
 Не правда.
PM MAIL   Вверх
MagicDew
Дата 2.11.2011, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Проблема осталась не решенной, помогите, плиз
PM MAIL   Вверх
magelan
Дата 2.11.2011, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


потерял xPath
**


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

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



MagicDew,
1я проблема - опасити изначально не определен, я с этим поборолся тупо, лень смотреть как по умному.
2я проблема - лоическая downgradeOpacityForPar вычисляется только один раз, в связи с чем только последний параграф будет высветляться.

Код

<script type="text/javascript">
function downgradeOpacity( elem )
{
    if ( elem.style.opacity > 0.4 )
        elem.style.opacity -= 0.1;
    else
        clearInterval( elem.animationInterval );
}
function startAnimation()
{
    var pars = document.getElementsByTagName( 'p' );

    for( var i = 0; i < pars.length; i++ )
    {
        var par = pars[i];
        par.style.opacity = 1;
        runElOpacity( par )      
    }
}
var runElOpacity = function( el )
{
    el.animationInterval = setInterval( function downgradeOpacityForPar() { downgradeOpacity( el ); }, 100 );
}
</script>



Это сообщение отредактировал(а) magelan - 2.11.2011, 17:33
PM MAIL   Вверх
Absinthe
Дата 2.11.2011, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

Проблема осталась не решенной, помогите, плиз
 Я бы просто воспользовался .animate() в jQuery.
Без jQuery таким не занимался, т.к. не вижу смысла.
PM MAIL   Вверх
ksnk
Дата 2.11.2011, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Код

<script type="text/javascript">
function opacity(e,o){
   e.style.filter = "alpha(opacity=" + Math.round(o*100) + ")";
   e.style.opacity = o;
}

function fade(e,o_from,o_to,msec) {
   if (!msec) msec=2000;
   var
     delta=50,
     disp = (o_to-o_from)/(msec/delta),
     cnt = Math.round((o_to-o_from)/disp);
     x = function (){
        if (--cnt){
            o_from+=disp;
            opacity(e,o_from);
            setTimeout(x,delta);
        } else {
            opacity(e,o_to);
        }
     };
   setTimeout(x,delta);
}
</script>

<button onclick="fade(document.getElementById('test'),0,1);">fadein</button>
<button onclick="fade(document.getElementById('test'),1,0,4000);">fadeout</button>
<div id="test" style="background:red; height:100px;"></div>



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


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


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

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



Цитата(Absinthe @  28.10.2011,  12:14 Найти цитируемый пост)
Цитата
Данный подход не рекомендуется.
 Не правда. 

Absinthe, в пользу слов mcTepа высказываются Мозилла и Опера, да и это вроде как давно общепринятое мнение в сообществе. Я, как обычно, проспал какую-то революцию? Буду дико благодарен за ссылки!


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: для новичков | Следующая тема »


 




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


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

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