¿Cómo apuntar solo a IE (cualquier versión) dentro de una hoja de estilo?

195

Tengo un proyecto heredado y hay lugares donde es un completo desastre. Este es uno de ellos. Necesito apuntar solo a IE (cualquier versión).

#nav li {
    float: left;
    height: 54px;
    background: #4f5151;
    display: table;
    border-left: 1px solid grey;
}

Para ser claros: dentro de la hoja de estilo incrustada y sin agregar ID o clases a las etiquetas en el html, necesito aplicar el estilo de borde solo si el usuario está usando IE. ¿Cómo puedo hacer esto?

Editar: encontré una solución para Firefox, pregunta de edición para reflejar esto.

MetalPhoenix
fuente
Tu pregunta es un poco confusa. ¿Se refiere a los prefijos de proveedores para las propiedades CSS o ¿se refiere a la identificación del navegador de un usuario a través de la inhalación UA y luego aplicar la hoja de estilo sólo si coincide con ...?
War10ck
Para Fireofox: stackoverflow.com/questions/952861/…
nikoskip
Para apuntar a IE, debe modificar su archivo HTML y agregar comentarios condicionales, para IE10 también necesitará algunos Javascript porque viene con soporte 0 para comentarios condicionales. EDITAR hay algunos hacks CSS para apuntar a algunas versiones de IE, pero ese también es el problema: esos son hacks.
Ramiz Wachtler
1
posible duplicado de Aplicar estilo SOLO en IE
MatthewG
1
Si necesita una solución dentro de su CSS, solo puedo pensar en JavaScript. Encontré este rafael.adm.br/css_browser_selector pero está un poco desactualizado.
nikoskip

Respuestas:

429

Internet Explorer 9 y versiones anteriores : puede usar comentarios condicionales para cargar una hoja de estilo específica de IE para cualquier versión (o combinación de versiones) a la que desee apuntar específicamente, como a continuación, usando una hoja de estilo externa.

<!--[if IE]>
  <link rel="stylesheet" type="text/css" href="all-ie-only.css" />
<![endif]-->

Sin embargo, a partir de la versión 10, los comentarios condicionales ya no son compatibles con IE.

Internet Explorer 10 y 11: cree una consulta de medios usando -ms-high-contrast, en la que coloca sus estilos CSS específicos de IE 10 y 11. Dado que -ms-high-contrast es específico de Microsoft (y solo está disponible en IE 10+), solo se analizará en Internet Explorer 10 y versiones posteriores.

@media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {
     /* IE10+ CSS styles go here */
}

Microsoft Edge 12: puede usar la regla @supports Aquí hay un enlace con toda la información sobre esta regla

@supports (-ms-accelerator:true) {
  /* IE Edge 12+ CSS styles go here */ 
}

Detección de la regla IE8 en línea

Tengo 1 opción más, pero solo es detectar IE8 y la versión inferior.

  /* For IE css hack */
  margin-top: 10px\9 /* apply to all ie from 8 and below */
  *margin-top:10px;  /* apply to ie 7 and below */
  _margin-top:10px; /* apply to ie 6 and below */

Como especificó para la hoja de estilo incrustada. Creo que debe usar la consulta de medios y el comentario de condición para la versión siguiente.

Jay Patel
fuente
14
Lo suficientemente bueno, probé que esta solución no afecta al navegador Edge, alguien se preguntó JIC.
j4v1
también necesita @supports (-ms-accelerator: auto) para edge, ver más abajo
Phyllis Sutherland
55
Para Edge, usar @supports (-ms-ime-align: auto) en lugar de -ms-accelerator me funciona
SeventhSteel
-ms-high-contrast:activeafecta a Edge si el sistema está en modo de alto contraste.
ShortFuse
La @supportssolución es realmente excelente: la detección de funciones es el camino a seguir. Estaba dispuesto a apuntar a Edge debido a su falta de soporte de width: max-content: lo @supports not (width: max-content)hace perfectamente, y será muy ignorado cuando Edge termine de apoyarlo. (Debería suceder en el otoño de 2019, ya que luego debería cambiar a Chromium para renderizar).
Frédéric
76

Aquí hay una colección de consultas de medios que le permitirán hacer eso para cualquier versión de Internet Explorer (desde IE6 a IE11 +), Firefox, Chrome y Safari (EDITAR: también se agregó Opera).

IE 6

* html .ie6 { property: value; }

o

.ie6 { _property: value; }

IE 7

*+html .ie7 { property: value; }

o

*:first-child+html .ie7 { property: value; }

IE 6 y 7

@media screen\9 { 
    .ie67 {
        property: value; 
    }
}

o

.ie67 { *property: value; }

o

.ie67 { #property: value; }

IE 6, 7 y 8

@media \0screen\,screen\9 {
    .ie678 {
        property: value;
    }
}

IE 8

html>/**/body .ie8 { property: value; }

o

@media \0screen {
    .ie8 {
        property: value;
    }
}

Modo de estándares IE 8

.ie8 { property /*\**/: value\9 }

IE 8,9 y 10

@media screen\0 {
    .ie8910 {
        property: value;
    }
}

Solo IE 9

@media screen and (min-width:0\0) and (min-resolution: .001dpcm) { 
    // IE9 CSS
    .ie9{
        property: value;
    }
}

IE 9 y superior

@media screen and (min-width:0\0) and (min-resolution: +72dpi) {
    // IE9+ CSS
    .ie9up { 
        property: value; 
    }
}

IE 9 y 10

@media screen and (min-width:0\0) {
    .ie910 {
        property: value\9;
    } /* backslash-9 removes ie11+ & old Safari 4 */
}

Solo IE 10

_:-ms-lang(x), .ie10 { property: value\9; }

IE 10 y superior

_:-ms-lang(x), .ie10up { property: value; }

o

@media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {
    .ie10up {
        property:value;
    }
}

IE 11 (y superior ..)

_:-ms-fullscreen, :root .ie11up { property: value; }

Firefox (cualquier versión)

@-moz-document url-prefix() {
    .ff {
        color: red;
    }
}

Firefox (solo Quantum / Stylo)

@-moz-document url-prefix() {
    @supports (animation: calc(0s)) {
        /* Stylo */
        .ffStylo {
            property: value;
        }
    }
}

Firefox Legacy (pre-Stylo)

@-moz-document url-prefix() {
    @supports not (animation: calc(0s)) {
        /* Gecko */
        .ffGecko {
            property: value;
        }
    }
}

Webkit (Chrome y Safari, cualquier versión)

@media screen and (-webkit-min-device-pixel-ratio:0) { 
    property: value;
}

Google Chrome (29+)

@media screen and (-webkit-min-device-pixel-ratio:0) and (min-resolution:.001dpcm) {
    .chrome {
        property: value;
    }
}

Safari (7.1+)

_::-webkit-full-page-media, _:future, :root .safari_only {
    property: value;
}

Safari (de 6.1 a 10.0)

@media screen and (min-color-index:0) and(-webkit-min-device-pixel-ratio:0) { 
    @media {
        .safari6 { 
            color:#0000FF; 
            background-color:#CCCCCC; 
        }
    }
}

Safari (10.1+)

@media not all and (min-resolution:.001dpcm) { 
    @media {
        .safari10 { 
            color:#0000FF; 
            background-color:#CCCCCC; 
        }
    }
}

Opera (12+)

@media (min-resolution: .001dpcm) {
    _:-o-prefocus, .selector {
        .opera12 {
            color:#0000FF; 
            background-color:#CCCCCC; 
        }
    } 
}

Opera (11 y menor)

@media all and (-webkit-min-device-pixel-ratio:10000), not all and (-webkit-min-device-pixel-ratio:0) {
    .opera11 {
        color:#0000FF; 
        background-color:#CCCCCC; 
    }
}

Para obtener más información o consultas de medios adicionales, visite el sitio web browserhacks.com y / o consulte esta publicación de blog que escribí sobre este tema.

Darkseal
fuente
1
¡Septiembre de 2018 y todavía salvas vidas! Muchas gracias. ¿Pero qué pasa con Opera (versiones anteriores)? ¿Solo Webkit?
La chica con el pelo rojo
1
@Thegirlwithredhair hay un par de trucos para seleccionar Opera> = 9, Opera <= 9 y Opera <= 11 aquí: browserhacks.com/#op
Darkseal
1
@Thegirlwithredhair Agregué dos consultas de medios que pueden usarse para apuntar Opera> = 12 y Opera <= 11 a mi respuesta anterior.
Darkseal
12

Cuando uso SASS, uso los siguientes 2 @media queriespara apuntar a IE 6-10 y EDGE.

@media screen\9
    @import ie_styles
@media screen\0
    @import ie_styles

http://keithclark.co.uk/articles/moving-ie-specific-css-into-media-blocks/

Editar

También apunto a versiones posteriores de EDGE usando @support queries(agregue tantas como necesite)

@supports (-ms-ime-align:auto)
    @import ie_styles
@supports (-ms-accelerator:auto)
    @import ie_styles

https://jeffclayton.wordpress.com/2015/04/07/css-hacks-for-windows-10-and-spartan-browser-preview/

minlare
fuente
4

Para apuntar a IE solo en mis hojas de estilo, uso este Sass Mixin:

@mixin ie-only {
  @media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {
    @content;
  }
}
Ilham Moutaharik
fuente
0

Otra solución de trabajo para el estilo específico de IE es

<html data-useragent="Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)">

Y luego tu selector

html[data-useragent*='MSIE 10.0'] body .my-class{
        margin-left: -0.4em;
    }
Sahib Khan
fuente
Desafortunadamente, según la publicación original, el html no se pudo editar. He examinado un poco su solución propuesta y tiene mérito si puede planificar esto con anticipación.
MetalPhoenix
Puede que tengas razón según la publicación, pero ninguna de las soluciones funciona para las últimas versiones de IE. El estilo condicional ya no es compatible.
Sahib Khan
Y sí, @supports es otra solución si no puede editar la etiqueta html, etc.
Sahib Khan
@supports (-ms-ime-align: auto) {.myclass {/ * styles * /}}
Sahib Khan
0

Después de experimentar problemas con los sitios que se rompen en Edge cuando usa el Modo de alto contraste, me encontré con el siguiente trabajo de Jeff Clayton:

https://browserstrangeness.github.io/css_hacks.html

Es una consulta de medios extraña y extraña, pero son más fáciles de usar en Sass:

@media screen and (min-width:0\0) and (min-resolution:+72dpi), \0screen\,screen\9 {
   .selector { rule: value };
}

Esto apunta a las versiones de IE que se esperan para IE8.

O puedes usar:

@media screen\0 {
  .selector { rule: value };
}

Que apunta a IE8-11, pero también activa FireFox 1.x (que para mi caso de uso, no importa).

En este momento estoy probando con soporte de impresión, y esto parece estar funcionando bien:

@media all\0 {
  .selector { rule: value };
}
Mecha corta
fuente