How to workaround: IE6 does not support CSS "attribute" selectors

14,375

Solution 1

Since IE6 is essentially limited to:

  • class selectors
  • ID selectors
  • (space) descendant selectors
  • a:-only pseudo-selectors

your only options are:

  • Use more classes to identify your elements
  • Use JavaScript (strongly not recommended except in highly specialized cases)

I find it very helpful to take advantage of the ability to assign multiple classes to an element by separating them with a space: class="foo bar"

Solution 2

This isn't possible without peppering your HTML with a stack of extraneous class selectors, sadly.

I'd recommend designing your site so that your entirely valid CSS works for people using modern browsers, and that it's still usable in the IE6, albeit visually not quite right. You just have to find the right balance between getting your site up to standard and bending over backwards for users who won't upgrade. It's a broken browser, treat it as such.

Solution 3

If you want attribute selector in IE6, you can use Dean Edward IE.js. http://dean.edwards.name/IE7/

That will make IE 5+ behave much more like IE7

supports the following CSS selectors: 
parent > child
adjacent + sibling
adjacent ~ sibling
[attr], [attr="value"], [attr~="value"] etc
.multiple.classes (fixes bug)
:hover, :active, :focus (for all elements)
:first-child, :last-child, only-child, nth-child, nth-last-child
:checked, :disabled, :enabled
:empty, :contains(), :not()
:before/:after/content:
:lang()

I didn't have IE6 (use IE7) so i can't said it worked, but give it a try

Solution 4

You can use Internet Explorer CSS expressions combined with the safe underscore ("_", IE6 and earlier) CSS hack:

/* Adds dotted bottom border to `<ABBR>` with a `title` attribute. */
abbr {
        _border-bottom: expression(this.title ? '1px dotted' : 'none');
}

abbr[title] {
        border-bottom: 1px dotted;
}

I do understand, that you did ask for "valid" CSS, but if the CSS hack above freaks you out, please read about Safe CSS Hacks.

The above could be changed to:

.ie6 abbr {
        _border-bottom: expression(this.title ? '1px dotted' : 'none');
}

abbr[title] {
        border-bottom: 1px dotted;
}

That is if your HTML began as:

<!--[if lt IE 7]><html class="ie6"><![endif]-->
<!--[if IE 7]>   <html class="ie7"><![endif]-->
<!--[if IE 8]>   <html class="ie8"><![endif]-->
<!--[if gt IE 8]><!--><html><!--<![endif]-->

Solution 5

Dean Edwards' IE7 JavaScript library provides attribute selector support for IE 5 and 6.

Share:
14,375
coder_bro
Author by

coder_bro

Updated on June 05, 2022

Comments

  • coder_bro
    coder_bro almost 2 years

    One of the projects which I am working uses CSS "attribute" selector [att]

    CSS Selectors

    which is not supported by ie6: Support for CSS selectors in IE6 (look for text "Attribute Selectors")

    Is there any workaround/hack which is of course valid html/css to overcome this problem?

  • coder_bro
    coder_bro about 15 years
    is <input type="button" class="foo" class="bar" /> valid html?
  • JonDrnek
    JonDrnek about 15 years
    @ngm no, duplicate attribute specifications are not allowed
  • Julian Aubourg
    Julian Aubourg about 15 years
    use class="button bar" instead
  • Dels
    Dels about 15 years
    @ngm you can however use class="foo bar"
  • Dels
    Dels about 15 years
    @ngm you can use class="foo bar"
  • ndorfin
    ndorfin about 15 years
    @Rex M and @Ngm, Multiple classname styles are ignored by IE6 e.g. .foo.bar {}
  • JonDrnek
    JonDrnek about 15 years
    @ndorfin that's true but beside the point in this case. just because multiple classes on the same level can't be targeted in IE6 doesn't mean we cant use multiple classes to apply different styles to overlapping sets of elements.
  • JonDrnek
    JonDrnek about 15 years
    @crescentfresh i am not sure if that is true. targeting a.foo.bar in IE6 does not seem to work.
  • Crescent Fresh
    Crescent Fresh about 15 years
    @Rex: <a class="foo"... will get your foo styles and your bar styles, even though "bar" is not an assigned class. See interfacethis.com/misc/css-test/multiclass.html
  • DisgruntledGoat
    DisgruntledGoat about 15 years
    Yeah this is the way forward. Developers have got to stop trying to make things pixel-perfect in IE6. For example I've set up some columns using the :first-child pseudo-selector to remove the left margin on the first column. For IE6 I just made the margins smaller so it doesn't mess up.
  • Nicole
    Nicole about 14 years
    This is a good option but be aware, (and this isn't from experience but from looking at the code and how it implements support) that your CSS rules will not automatically "apply" to dynamic changes to elements that happen through JS - adding classes, elements, etc. will not get the original CSS rules.
  • kzh
    kzh over 12 years
    It is possible with CSS expressions. See stackoverflow.com/q/8231617/143739
  • Ahmad Alfy
    Ahmad Alfy about 11 years
    +1 for the expression() statement. I've been building websites and crafting CSS for 12 years and it's the first time in my life to see this wizzardy cool shit!
  • kzh
    kzh about 11 years
    It doesn't work in IE8. They finally took it out due to security issues, but it does work in IE7. IE also has a thing called "behaviors" in CSS.