Правильний спосіб анімації box-shadow за допомогою jQuery


Відповіді:


78

Пряма відповідь

Використання Едвіна Мартіна JQuery плагін для тіньової анімації , який розширює .animateметод, ви можете просто використовувати звичайний синтаксис з «boxShadow» і кожен аспект цього - колір , в х- і у-зміщення , тим розмиття радіусу і поширення радіуса - отримує анімацію. Він включає підтримку декількох тіней.

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

Замість цього використовуйте анімацію CSS

jQuery анімує, змінюючи styleвластивість елементів DOM, що може викликати сюрпризи зі специфічністю та переміщує інформацію про стиль із таблиць стилів.

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

@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...
});

1
Я згоден, прийнята відповідь нещодавно не оновлювалась. Цей плагін добре працював для мене.
barro32

Здається, я не можу змусити це працювати без помилок, використовуючи jQuery 1.9, хтось ще стикався з цим?
Skami

Враховуючи те, що він вийшов лише тиждень тому (?), Він, мабуть, ще не оновив його. Ви прочитати керівництво по оновленню jQ1.9 і в джерело тіньового анімації плагіна і подивитися , що потрібно бути перероблено, якщо це терміново методі.
iono

Я використав зв’язаний вами архів замість останньої версії його плагіна, і він працював бездоганно. Отже, це вирішило мою проблему, дякую за швидку відповідь.
Skami

1
Вчора я спробував як немініфіковану, так і мінімізовану версію, і обидва видали мені однакову помилку. Я просто радий, що це працює зараз, я просто сподіваюся, що не зіткнуся з жодною з проблем, вирішених в 1.8. Я також сподіваюся, що Едвін буде продовжувати розробляти цей плагін, оскільки це, здається, версія з найменшими клопотами для використання.
Skami

30

Якщо ви використовуєте 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/


CssHooks є частиною 1.4.3 чи плагіном? Я хотів би отримати посилання на документацію jQuery, якщо у вас є, це звучить цікаво.
Surreal Dreams

@ Сюрреалістична частина 1.4.3. cssHooks ще мало задокументовано, але ви можете зануритися у відьмак і перевірити його: github.com/jquery/jquery/blob/master/src/css.js Брендон Аррон багато займався грою в cssHooks: github.com/brandonaaron/jquery-cssHooks
PetersenDid

@Blowsie, ймовірно, є проблемою з boxshadow cssHook. Можливо, така сама, як і ця проблема: github.com/brandonaaron/jquery-cssHooks/issues/32
PetersenDid,

Здається, це не підтримує вставки тіньових вікон, або я помиляюся?
Адам Фрейзер

@AdamFraser працює для мене (протестовано в Chrome) jsfiddle.net/petersendidit/w5aAn/474
PetersenDid,

15

Якщо ви не хочете використовувати плагін, це можна зробити за допомогою трохи 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, ваш шлях до майстерності починається тут ..


Хороший, справді. Якось цей не спалює більшу частину мого процесора, на якому запущена анімація. Я думаю, але я не впевнений, що це було пов’язано з тим, що я використав 2 діапазони відсотків для ключових кадрів (0%, 50% та 100%).
jozi

3

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

$('.error').each( function(idx, el){
    $( el )
        .addClass( 'highlight' )
        .delay( 2000 )
        .removeClass( 'highlight' );
});

0

Ось приклад того, як це зробити без плагіна: jQuery animated Box Але він не має додаткової функціональності, яка поставляється з використанням плагіна, але мені особисто подобається бачити (і розуміти) метод божевілля.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.