Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > JavaScript: для новичков > Плавное изменение opacity |
Автор: MagicDew 17.10.2011, 10:47 | ||||
Добрый день, Уважаемые форумчане! Я начинаю изучать JavaScript и хотелось бы решить следующую задачу: на странице есть несколько участков текста, облаченных в тег <p></p> и ссылка-кнопка, при нажатии на которую у текста свойство "opacity" должно ПЛАВНО уменьшиться с 1 до 0.4. Вот то, что я смог наваять:
Вот суть проблемы: я не понимаю как работает функция setTimeout() и как получить и проверить текущее значение свойства "opacity" |
Автор: mcTep 17.10.2011, 14:21 | ||
setTimeout(foo, duration) говорит браузеру выполнять функцию foo c интервалом в duration миллисекунд. В foo вам надо передать именно функцию, которая будет выполняться с этим интервалом. Сейчас у вас `setOpacity(i)` это вызов функции, в результате которой возвращается какое-то значение, которое вряд ли будет функцией, судя по вашему примеру. Т.е. в вашем примере просто произойдет несколько вызовов фунции setOpacity и, увы, больше ничего. Сделать стоит примерно следующее:
Здесь мы заводим обработчики для каждого параграфа, и создаем ссылку на них в par.animationInterval для каждого элемента. При достижении значения 0.4 и меньше, мы этот обработчик сбрасываем через clearInteval. |
Автор: MagicDew 17.10.2011, 15:51 | ||
Поясните пожалуйста вот этот код:
и как вызывать и работать с этим функциями? |
Автор: mcTep 18.10.2011, 08:59 | ||||
Здесь мы берем нужные параграфы, потом проходясь по циклу каждому параграфу в свойство animationInterval добавляем интервал вызова функции downgradeOpacityForPar, в которой с интервалом 100 миллисекунд понижаем прозрачность конкретного параграфа. Этот участок кода можно обрамить в функцию и вызвать ее при, например при клике или когда вам угодно.
|
Автор: $дмитрий 18.10.2011, 14:20 | ||||
Небольшая оптимизация
Можно заменить на
|
Автор: mcTep 18.10.2011, 14:40 |
Данный подход подобен использованию eval(), где текст выполняется как код. Данный подход не рекомендуется. |
Автор: $дмитрий 18.10.2011, 14:53 |
Не вижу смысла в функции которая не делает ничего, кроме вызова другой функции ![]() |
Автор: mcTep 18.10.2011, 15:19 | ||
Ваш пример делает тоже самое ![]() Добавлено через 6 минут и 32 секунды К томуже эта функция вызывает другую в нужном нам окружении. Мы могли бы конечно сделать что-то вроде
и в downgradeOpacity обращаться к параграфу через this. |
Автор: MagicDew 28.10.2011, 10:51 | ||||
Уважаемые mcTep и $дмитрий, спасибо, что отозвались, но, увы, приведенный вами код у меня не работает. Вот то, что я написал по вашим советам:
|
Автор: Absinthe 28.10.2011, 12:14 | ||||
|
Автор: MagicDew 2.11.2011, 15:39 |
Проблема осталась не решенной, помогите, плиз |
Автор: magelan 2.11.2011, 17:31 | ||
MagicDew, 1я проблема - опасити изначально не определен, я с этим поборолся тупо, лень смотреть как по умному. 2я проблема - лоическая downgradeOpacityForPar вычисляется только один раз, в связи с чем только последний параграф будет высветляться.
|
Автор: Absinthe 2.11.2011, 17:43 | ||
Без jQuery таким не занимался, т.к. не вижу смысла. |
Автор: ksnk 2.11.2011, 20:16 | ||
|
Автор: SelenIT 3.11.2011, 01:16 |
Absinthe, в пользу слов mcTepа высказываются https://developer.mozilla.org/en/DOM/window.setTimeout#Passing_string_literals и http://dev.opera.com/articles/view/efficient-javascript/?page=2#timeouts, да и это вроде как давно общепринятое мнение в сообществе. Я, как обычно, проспал какую-то революцию? Буду дико благодарен за ссылки! |
Автор: Absinthe 3.11.2011, 12:45 |
SelenIT, прошу прошения, я думал, что это было высказывания про анонимные функции, не дочитал ![]() |