Подтвердить что ты не робот

Как я могу применить несколько объявлений преобразования к одному элементу?

У меня есть элемент с двумя классами, один из которых называется "rotate", который будет вращать элемент на 360 градусов, а другой называется "doublelesize", который масштабирует элемент 2x его нормальный размер:

.rotate {
    transform: rotate(0deg);
}

.rotate:hover {
    transform: rotate(360deg);
}

.doublesize {
    transform: scale(1);
}

.doublesize:hover {
    transform: scale(2);
}

http://jsfiddle.net/Sbw8W/

Я предполагаю, что это не работает, потому что классы переопределяют друг друга transform свойство?

Я знаю, что я мог бы легко сделать это в одном правиле CSS, например:

.doublerotatesize {
    transform: scale(1) rotate(0deg);
}

.doublerotatesize:hover {
    transform: scale(2) rotate(360deg);
}

Но я хотел бы иметь возможность применять каждый класс отдельно от другого, если это возможно.

4b9b3361

Ответ 1

Я предполагаю, что это не работает, потому что классы переопределяют друг друга transform свойство?

Правильно. Это несчастливое ограничение как побочный эффект работы каскада.

Вам нужно будет указать обе функции в одном объявлении transform. Вы могли бы просто сгруппировать оба селектора классов вместе вместо создания нового класса для комбинированного преобразования:

.doublesize.rotate {
    -webkit-transform: scale(1) rotate(0deg);
}

.doublesize.rotate:hover {
    -webkit-transform: scale(2) rotate(360deg);
}

... но, как вы можете видеть, проблема заключается в свойстве transform, а не в селекторе.


Ожидается, что это будет исправлено в Transforms level 2, где каждое преобразование было доведено до собственного свойства, что позволило бы объединить преобразования просто, объявив их отдельно, как и любая другая комбинация свойств CSS. Это означает, что вы сможете просто сделать это:

/* Note that rotate: 0deg and scale: 1 are omitted
   as they're the initial values */

.rotate:hover {
    rotate: 360deg;
}

.doublesize:hover {
    scale: 2;
}

... и использовать каскад, а не препятствовать ему. Нет необходимости в специализированных именах классов или комбинированных правилах CSS.

Ответ 2

Вы можете объединить несколько анимаций, но не объединяя классы CSS. См. Первый ответ здесь: объединение нескольких анимаций css в одну общую анимацию

В первой части вам рассказывается, как объединить анимацию с CSS с некоторыми параметрами (задержка, продолжительность):

.outside.animate {
   -webkit-animation-delay: 0s, .5s, .5s;
   -webkit-animation-duration: 500ms, 1000ms, 1000ms;
   -webkit-animation-name: button-bounce, rotate, skyblue;
}

Конечно, сначала вам нужно определить свои анимации.

Ответ 3

Вы не можете сделать это, используя только CSS, но если вы не против использования какого-либо jQuery, вы можете связать этот эффект с помощью некоторого jQuery:

var $elem = $('.cssDropPinImage');
$({ deg: 0 }).animate({ deg: 359 }, {
    duration: 600,
    step: function (now) {
        var scale = (2 * now / 359);
        $elem.css({
            transform: 'rotate(' + now + 'deg) scale(' + scale + ')'
        });
    }
});

Надеюсь, это поможет другим читателям, столкнувшись с одной и той же проблемой.