CSS Vendor Prefixes

By  on  

What are the Vendor Prefixes?

Vendor prefixes are small strings prepended to CSS properties that will ensure that the property will only be valid and rendered within the given browser engine.  Chrome and Safari both use the WebKit rendering engine, Firefox uses Gecko, Internet Explorer uses Trident, and Opera uses Presto.  Browser vendors generally don't implement other vendor prefixes but due to the popularity of the WebKit-based mobile browser, vendors like Opera and Firefox have also implemented WebKit's vendor prefixes on their mobile offerings.

Vendors use the following prefixes:

  • WebKit:  -webkit
  • Firefox:  -moz
  • Opera:  -o
  • Internet Explorer:  -ms

Why Vendor Prefixes?

There are a few reasons browser vendors use prefixes:

  • To implement proprietary CSS properties that have no working standard and may never become standard
  • To provide early implementations of standard properties
  • To provide an alternate syntax than the standard

Other reasons may apply but these are the main reasons.

Which Properties Use, or Have Used, Vendor Prefixes?

Prominent vendor-prefixed properties include:

  • @keyframes
  • transition and transform properties   (transition-property, transition-duration, transition-timing-function, transition-delay)
  • animation properties (animation-name, animation-duration, animation-timing-function, animation-delay)
  • border-radius
  • box-shadow
  • backface-visibility
  • column properties
  • flex properties
  • perspective properties

There have been and will be many more prefixed CSS properties!

How are Vendor Prefixes Used?

When using browser-prefixed properties, it's best to place the browser-prefixed properties first, then the standard property name and value.  For example:

/* use of keyframes */
@-webkit-keyframes fadeIn {
	0% { opacity: 0; } 100% { opacity: 0; }
}
@-moz-keyframes fadeIn {
	0% { opacity: 0; } 100% { opacity: 0; }
}
@keyframes fadeIn {
	0% { opacity: 0; } 100% { opacity: 0; }
}

/* use of basic properties */
.myClass {
	-webkit-animation-name: fadeIn;
	-moz-animation-name: fadeIn;
	animation-name: fadeIn;
}

If the standard is known, that rule is used; if unknown the rule is tossed out and the vendor-prefixed property is used!

Recent Features

  • By
    I’m an Impostor

    This is the hardest thing I've ever had to write, much less admit to myself.  I've written resignation letters from jobs I've loved, I've ended relationships, I've failed at a host of tasks, and let myself down in my life.  All of those feelings were very...

  • By
    Conquering Impostor Syndrome

    Two years ago I documented my struggles with Imposter Syndrome and the response was immense.  I received messages of support and commiseration from new web developers, veteran engineers, and even persons of all experience levels in other professions.  I've even caught myself reading the post...

Incredible Demos

  • By
    Chris Coyier’s Favorite CodePen Demos IV

    Did you know you can triple-heart things on CodePen? We’ve had that little not-so-hidden feature forever. You can click that little heart button on any Pen (or Project, Collection, or Post) on CodePen to show the creator a little love, but you can click it again...

  • By
    Create a 3D Panorama Image with A-Frame

    In the five years I've been at Mozilla I've seen some awesome projects.  Some of them very popular, some of them very niche, but none of them has inspired me the way the MozVR team's work with WebVR and A-Frame project have. A-Frame is a community project...

Discussion

  1. oh i hate those things
    can’t just every browser unite under one vendor prefix

    shoot !

  2. Kaylea

    Hi David!

    I used the flip card code on a project and I love it.

    There is a pronounced stutter in Firefox, chrome, Safari and ie even after I used the ie adapted code. Do you know why this could be happening? I cleared the cache and went through with a fine tooth comb.

    My other option would be to use a flip on click animation, but yours is easier in the long run. Thank you for your help.

Wrap your code in <pre class="{language}"></pre> tags, link to a GitHub gist, JSFiddle fiddle, or CodePen pen to embed!