27

This works

div{
    -ms-transform: rotate(30deg);
}

And following does not

$("div").css("-ms-transform","rotate(30deg)");

Any ideas why, and how to fix it?
Same thing works good on all other browsers, but not on IE. Ofcourse, only IE9 supports it. Older versions dont.

BoltClock
  • 700,868
  • 160
  • 1,392
  • 1,356
grizwako
  • 1,563
  • 4
  • 19
  • 23

3 Answers3

59

The dash ('-') in the property is invalid for use in scripting. You should use msTransform instead.

By the way: though a number of browsers do understand and parse css like style['background-color'] from scripting, afaik Firefox doesn't. Furthermore I think JQuery .css(...) transforms properties like 'background-color' to their DOM-scripting equivalent ('backgroundColor' in this case) before parsing it.

To be complete: JQuery.css indeed transforms dashed properties to camelCase. Here's a representation of the JQuery.css-internals with the string '-ms-transform':

var fcamelCase = function( all, letter ) {
        return letter.toUpperCase();
    };
var rdashAlpha = /-([a-z])/ig;
// JQuery.css does a replace operation with these variables 
// on the raw property string:
alert('-ms-transform'.replace(rdashAlpha,fcamelCase)); //=> msTransform

So that's why $("div").css("-ms-transform","rotate(30deg)") doesn't work in IE9. IE9 expects: msTransform.

Why then, does $("div").css("-moz-transform", "rotate(-90deg)") work in Firefox? Because Mozilla evidently decided to use complete CamelCase for their -moz-[properties], so the MozTransform scripting style property is valid (and, by the way, mozTransform isn't ... really).

It's all to the browser then, nothing new under the digital sun.

sandstrom
  • 14,554
  • 7
  • 65
  • 62
KooiInc
  • 119,216
  • 31
  • 141
  • 177
  • Is this IE only as `$("P").css("-moz-transform", "rotate(-90deg)");` works fine in FF4? – Rory McCrossan Apr 08 '11 at 11:13
  • @Rory McCrossan: `$('div').css('-moz-box-shadow', '3px 3px 3px #000');` doesn't work for me (I know Fx 4 supports the standard but the prefixed property still works in CSS). – BoltClock Apr 08 '11 at 11:15
  • I think so. And I think it's only the first dash that's illegal. So $('div').css({ 'ms-transform': 'rotate(30deg)' }); *does* work in IE9. See http://jsfiddle.net/KEEYp/1/ – KooiInc Apr 08 '11 at 11:21
  • Looks like this question just got tweeted by [@StackExchange](http://twitter.com/StackExchange) - enjoy your free upvotes! – BoltClock Apr 08 '11 at 11:59
  • Thanks for telling BoltClock. I thought my answer was not quite complete, so I did some more research to complete it ;) – KooiInc Apr 08 '11 at 12:46
  • Your link which says "See also..." goes nowhere. What were you trying to link to? – ChrisW Jul 04 '13 at 22:08
  • @ChrisW: it was a link to MSDN, but they removed the page. I removed the link. – KooiInc Apr 04 '14 at 12:11
19

Not sure why As KooiInc says, dashes in style property names are invalid in DOM scripting.

You can fix it by using object notation and passing in the name in camel case instead of hyphenated, like this:

$('div').css({ msTransform: 'rotate(30deg)' });

jsFiddle preview

Community
  • 1
  • 1
BoltClock
  • 700,868
  • 160
  • 1,392
  • 1,356
10

jQuery 1.8 brings automatic vendor prefix support, so this now works for all browsers:

$("div").css("transform","rotate(30deg)");
samy-delux
  • 3,061
  • 2
  • 29
  • 32