O que significa “i” em um seletor de atributos CSS?

112

Encontrei o seguinte seletor CSS na folha de estilo do agente do usuário do Google Chrome:

[type="checkbox" i]

O que isso isignifica?

AntiCZ
fonte
1
@Alexander O'Mara: Os seletores de nível 4 fazem parte do CSS3 - é apenas o próximo nível de um módulo que começou no nível 3. "CSS4" é um nome impróprio.
BoltClock
2
@Alexander O'Mara: Eu adoraria ver isso criado no meta. Em particular, gostaria de saber como podemos lidar com o uso da tag [css4] - a medida mais drástica que eu poderia tomar é torná-la um sinônimo de [css3], e isso seria realmente a coisa certa a fazer.
BoltClock
1
@BoltClock Meta Question está em alta! BTW, quando você pergunta sobre a fusão de sua resposta com esta pergunta, você quis dizer editar a pergunta / resposta aqui para adicionar as informações, ou estava se referindo a um botão mágico de mover uma resposta para outra pergunta?
Alexander O'Mara
1
@Alexander O'Mara: Não movendo as respostas individuais, mas combinando duas perguntas inteiras. É uma função somente mod.
BoltClock
1
@TylerH Temos uma discussão sobre Meta neste tópico . Sinta-se à vontade para adicionar à discussão aqui.
Alexander O'Mara

Respostas:

132

Conforme mencionado nos comentários, é para correspondência de atributos que não diferencia maiúsculas de minúsculas. Este é um novo recurso nos seletores CSS de nível 4.

Atualmente, está disponível no Chrome 49+, Firefox 47+, Safari 9+ e Opera 37 + *. Antes disso, ele estava disponível apenas nos estilos de agente do usuário do Chrome a partir do Chrome 39, mas podia ser habilitado para conteúdo da web definindo o sinalizador de recursos experimentais.

* Versões anteriores do Opera também podem suportá-lo.

Exemplo de trabalho / teste de navegador:

[data-test] {
    width: 100px;
    height: 100px;
    margin: 4px;
}

[data-test="A"] {
    background: red;
}

[data-test="a" i] {
    background: green;
}
Green if supported, red if not:

<div data-test="A"></div>

O quadrado acima será verde se o navegador oferecer suporte a esse recurso, vermelho se não for.

Alexander O'Mara
fonte
6
Obrigado por ensinar! Aproveite seu novo chapéu. Esse tipo de coisa funciona em bibliotecas de seletor? Que tipo de suporte de navegador ele oferece?
Benjamin Gruenbaum
1
@BenjaminGruenbaum Parece que está disponível apenas nos estilos de agente de usuário do Chrome (não no CSS de um site, pelo menos ainda não). Não consegui encontrar nenhuma documentação oficial de compatibilidade.
Alexander O'Mara
(Repondo meu comentário anterior, agora que as perguntas estão mescladas.) Não é de todo surpreendente que novos padrões experimentais como esse estejam mal documentados. Dito isso, minha resposta contém mais algumas informações sobre isso, ou seja, como funciona, por que é usado e como é implementado no Chrome (conforme fornecido pela pergunta).
BoltClock
O Chrome adicionará suporte para isso na versão 49.0 (atualmente em Beta), o Firefox na versão 47.0 (programado para ser lançado em junho de 2016). Fonte: developer.mozilla.org/en-US/docs/Web/CSS/…
Miscreant de
1
@LWChris: Não tenho certeza se esse navegador realmente existe. O IE6 não entende seletores de atributo de forma alguma, e o IE7 os suporta mesmo com atributos de dados personalizados.
BoltClock
36

Esse é o sinalizador que não diferencia maiúsculas de minúsculas para seletores de atributo, apresentado em Seletores 4 . Aparentemente, eles introduziram uma implementação desse recurso no Chrome já em agosto de 2014.

Resumindo: este sinalizador diz ao navegador para combinar os respectivos valores para o typeatributo sem distinção entre maiúsculas e minúsculas. O comportamento de correspondência do seletor padrão para valores de atributo em HTML faz distinção entre maiúsculas e minúsculas , o que geralmente é indesejável porque muitos atributos são definidos para ter valores que não diferenciam maiúsculas de minúsculas, e você deseja ter certeza de que seu seletor seleciona todos os elementos corretos, independentemente de maiúsculas e minúsculas. typeé um exemplo de tal atributo, porque é um atributo enumerado , e se diz que os atributos enumerados têm valores que não diferenciam maiúsculas de minúsculas .

Aqui estão os commits relevantes:

  • 179370 - implementação
  • 179401 - alterações nas folhas de estilo do UA como mostrado na imagem da pergunta

Observe que ele está oculto no sinalizador "Ativar recursos experimentais da plataforma da Web", que você pode acessar em chrome: // flags / # enable-experimental-web-platform-features. Isso pode explicar por que o recurso passou despercebido - os recursos ocultos atrás desse sinalizador só podem ser usados ​​internamente e não em código voltado ao público (como folhas de estilo do autor), a menos que esteja habilitado, porque eles são experimentais e, portanto, não estão prontos para uso em produção.

Aqui está um caso de teste que você pode usar - compare os resultados quando o sinalizador está ativado e desativado:

span[data-foo="bar"] {
    color: red;
}

span[data-foo="bar" i] {
    color: green;
}
<span data-foo="bar">If all of this text is green,</span>
<span data-foo="Bar">your browser supports case-insensitive attribute selectors.</span>

Observe que eu uso um atributo de dados personalizados em vez de typemostrar que ele pode ser usado com praticamente qualquer atributo.

Não estou ciente de quaisquer outras implementações até o momento em que escrevo, mas espero que outros navegadores se atualizem em breve. Esta é uma adição relativamente simples, mas extremamente útil para o padrão e espero poder usá-la no futuro.

BoltClock
fonte
Estou tendo o cansaço "daquela tarde" ... Depois de ler as especificações W3, ainda não entendi completamente, qual seria o uso prático em css para isso?
Matt de
2
@Matt: A correspondência do seletor de atributos diferencia maiúsculas de minúsculas, conforme indicado no HTML5 , o que em muitos casos é indesejável porque o HTML5 permite valores que não diferenciam maiúsculas de minúsculas para determinados atributos. Você pode usar este sinalizador para garantir que escolheu os elementos certos, independentemente do caso. Por exemplo, na imagem você pode ver que ele procura input[type="search" i], que irá combinar elementos como <input type="SEARCH">.
BoltClock
1
Posso confirmar que funciona com o Chromium versão 43.0.2357.130 e “Ativar recursos experimentais da plataforma da Web” ativados.
Robert Siemer