Internet Explorer Hacks

These “hacks” may be used to target a specific browser/client. This may be used to work around browser rendering differences by applying styles in one of those wrappers listed above.

High Contrast Mode in Internet Explorer 10 and greater

In Internet Explorer 10+ and Edge, Microsoft provides the -ms-high-contrast media selector to expose the "High Contrast" setting from the browser, which allows the programmer to adjust their site's styles accordingly.

The -ms-high-contrast selector has 3 states: active, black-on-white, and white-on-black. In IE10+ it also had a none state, but that is no longer supported in Edge going forward.

Examples

@media screen and (-ms-high-contrast: active), (-ms-high-contrast: black-on-white) {
   .header{
      background: #fff;
      color: #000;
   }
}

This will change the header background to white and the text color to black when high contrast mode is active and it is in black-on-white mode.

@media screen and (-ms-high-contrast: white-on-black) {
   .header{
      background: #000;
      color: #fff;
   }
}

Similar to the first example, but this specifically selects the white-on-black state only, and inverts the header colors to a black background with white text.


More Information:

Microsoft Documentation on -ms-high-contrast

Internet Explorer 6 & Internet Explorer 7 only

To target Internet Explorer 6 and Internet Explorer 7, start your properties with *:

.hide-on-ie6-and-ie7 {
    *display : none; // This line is processed only on IE6 and IE7
}

Non-alphanumeric prefixes (other than hyphens and underscores) are ignored in IE6 and IE7, so this hack works for any unprefixed property: value pair.

Internet Explorer 8 only

To target Internet Explorer 8, wrap your selectors inside @media \0 screen { }:

@media \0 screen {
    .hide-on-ie8 {
        display : none;
    }
}

Everything between @media \0 screen { } is processed only by I

Adding Inline Block support to IE6 and IE7

display: inline-block;

The display property with the value of inline-block is not supported by Internet Explorer 6 and 7. A work-around for this is:

zoom: 1;
*display: inline;

The zoom property triggers the hasLayout feature of elements, and it is available only in Internet Explorer. The *display makes sure that the invalid property executes only on the affected browsers. Other browsers will simply ignore the rule.