Правильный способ анимации box-shadow с помощью jQuery

Какой правильный синтаксис для анимации свойства box-shadow с помощью jQuery?

$().animate({?:"0 0 5px #666"});

person chchrist    schedule 09.11.2010    source источник


Ответы (5)


Прямой ответ

Использование плагина jQuery Эдвина Мартина для анимации теней, который расширяет метод .animate, вы можете просто использовать обычный синтаксис с "boxShadow" и всеми его аспектами - цветом, смещением по x и y, размытием -radius и spread-radius — анимируются. Он включает поддержку нескольких теней.

$(element).animate({ 
  boxShadow: "0px 0px 5px 3px hsla(100, 70%, 60%, 0.8)"
}); 

Вместо этого используйте анимацию CSS

jQuery анимирует, изменяя свойство style элементов DOM, что может привести к неожиданностям со специфичностью и перемещению информации о стиле из ваших таблиц стилей.

Я не могу найти статистику поддержки браузерами анимации теней CSS, но вы можете использовать jQuery для применения класса на основе анимации вместо того, чтобы обрабатывать анимацию напрямую. Например, вы можете определить анимацию box-shadow в своей таблице стилей:

@keyframes shadowPulse {
    0% {
        box-shadow: 0px 0px 10px 0px hsla(0, 0%, 0%, 1);
    }

    100% {
        box-shadow: 0px 0px 5px 0px hsla(0, 0%, 0%, 0);
    }
}

.shadow-pulse {
    animation-name: shadowPulse;
    animation-duration: 1.5s;
    animation-iteration-count: 1;
    animation-timing-function: linear;
}

Затем вы можете использовать собственное событие animationend для синхронизации конца анимации с тем, что вы делали в своем JS-коде:

$(element).addClass('shadow-pulse');
$(element).on('animationend', function(){    
    $(element).removeClass('shadow-pulse');
    // do something else...
});
person iono    schedule 08.02.2012
comment
Я согласен, принятый ответ в последнее время не обновлялся. Этот плагин работал хорошо для меня. - person barro32; 27.06.2012
comment
Кажется, я не могу заставить это работать без ошибок, используя jQuery 1.9, кто-нибудь еще сталкивался с этим? - person Skami; 22.01.2013
comment
Учитывая, что он вышел всего неделю назад (?), он, вероятно, еще не обновил его. Ознакомьтесь с руководством по обновлению jQ1.9 и исходный код плагина теневой анимации и посмотреть, какие методы нужно переработать, если это срочный. - person iono; 23.01.2013
comment
Я использовал архив, на который вы ссылаетесь, вместо последней версии его плагина, и он работал безупречно. Так что это решило мою проблему, спасибо за быстрый ответ. - person Skami; 23.01.2013
comment
Не беспокойтесь, но - вау, это было совершенно случайно. Я, должно быть, нажал на неправильную ссылку. Возможно, попробуйте неминифицированную версию 1.8; посмотреть, была ли это ошибка минификации? Кажется странным, что версия 1.7 будет работать лучше, чем 1.8 с 1.9. - person iono; 23.01.2013
comment
Вчера я пробовал как неминифицированную, так и минифицированную версию, и обе выдали одну и ту же ошибку. Я просто счастлив, что теперь это работает, я просто надеюсь, что не столкнусь ни с одной из проблем, которые были решены в 1.8. Я также надеюсь, что Эдвин продолжит разработку этого плагина, так как кажется, что это версия с наименьшими трудностями в использовании. - person Skami; 23.01.2013
comment
Использование с jQuery 1.8.3, и он работает нормально, но убедитесь, что вы установили тень окна по умолчанию (например: нет) в своем CSS... Потратил некоторое время, чтобы понять это. - person webrama.pl; 16.12.2014
comment
@ Si8 Si8 здесь не место для сообщений об ошибках - свяжитесь с Эдвином Мартином по этому поводу. Также это не работает, не очень информативный отчет об ошибке - person iono; 15.03.2016
comment
Ах да, извините... Я имел в виду, что он не анимирует тень, а просто отображает текст. Я обращусь к нему. Спасибо. - person Si8; 15.03.2016
comment
Я новичок в jQuery и JavaScript в целом. Я использовал плагин Эдвина Мартина и попытался добавить тег CDN в имеющийся у меня html-шаблон, а затем в моем app.js я попробовал что-то вроде $("#elementId").animate({boxShadow: ...});, и это не сработало. Я что-то пропустил? - person Kareem Jeiroudi; 25.09.2020

Если вы используете jQuery 1.4.3+, вы можете воспользоваться добавленным кодом cssHooks.

С помощью хука boxShadow: https://github.com/brandonaaron/jquery-cssHooks/blob/master/boxshadow.js

Вы можете сделать что-то вроде этого:

$('#box').animate({
    'boxShadowX': '10px',
    'boxShadowY':'10px',
    'boxShadowBlur': '20px'
});

Крюк пока не позволяет вам анимировать цвет, но я уверен, что можно добавить некоторую работу.

Пример: http://jsfiddle.net/petersendidit/w5aAn/

person PetersenDidIt    schedule 09.11.2010
comment
Являются ли cssHooks частью версии 1.4.3 или плагином? Я хотел бы получить ссылку на документацию jQuery, если она у вас есть, это звучит интересно. - person Surreal Dreams; 09.11.2010
comment
@ Сюрреалистичная часть 1.4.3. cssHooks еще мало документированы, но вы можете погрузиться в источник и проверить его: github.com/jquery/jquery/blob/master/src/css.js Брэндон Аррон много играл с cssHooks: github.com/brandonaaron/jquery-cssHooks - person PetersenDidIt; 09.11.2010
comment
@Blowsie, вероятно, проблема с boxshadow cssHook. Возможно, такая же проблема, как и эта: github.com/brandonaaron/jquery-cssHooks/issues/32< /а> - person PetersenDidIt; 29.06.2011
comment
Кажется, это не поддерживает вставки-тени, или я ошибаюсь? - person Adam Fraser; 22.01.2012
comment
А, это работает. Поэтому вам просто нужно указать inset заранее. Понятно. - person Adam Fraser; 22.01.2012
comment
К вашему сведению: ответ @tomeoftom более современный и работает исключительно хорошо. - person Jordan Arseno; 05.07.2012

Если вы не хотите использовать плагин, это можно сделать с помощью CSS:

#my-div{    
  background-color: gray;
  animation: shadowThrob 0.9s infinite;
  animation-direction: alternate;
  -webkit-animation: shadowThrob 0.9s ease-out infinite;
  -webkit-animation-direction: alternate;
}
@keyframes shadowThrob {
  from {box-shadow: 0 0 30px 10px rgba(190,65,12, 0.9);}
  to {box-shadow: 0 0 30px 10px rgba(190,65,12, 0.2);}
}
@-webkit-keyframes shadowThrob {
  from {box-shadow: 0 0 30px 10px rgba(190,65,12, 0.9);}
  to {box-shadow: 0 0 30px 10px rgba(190,65,12, 0.2);}
}
/*NOTE: The animation property is not supported in Internet Explorer 9 and earlier versions.*/

Проверьте это: http://jsfiddle.net/Z8E5U/

Если вам нужна полная документация по анимации CSS, ваш путь к волшебству начинается здесь..

person ShaneSauce    schedule 21.02.2014
comment
Хороший, правда. Почему-то это не сжигает большую часть моего процессора, выполняющего анимацию. Я думаю, но не уверен, что это произошло из-за того, что я использовал 2 диапазона процентов для ключевых кадров (0%, 50% и 100%). - person jozi; 27.04.2015

Мне нравится решение ShaneSauce! Используйте класс вместо идентификатора, и вы можете добавить/удалить эффект для любого элемента, используя jQuery addClass/delay/removeClass :

$('.error').each( function(idx, el){
    $( el )
        .addClass( 'highlight' )
        .delay( 2000 )
        .removeClass( 'highlight' );
});
person laurent belloeil    schedule 17.04.2015

Вот пример того, как это сделать без плагина: анимированный блок jQuery Но у него нет дополнительной функциональности, которая приходит с использованием плагина, но лично мне нравится видеть (и понимать) метод, стоящий за этим безумием.

person Drazion    schedule 08.05.2012