Usando expressão regular em css?


127

Eu tenho uma página html com divs que têm id (s) do formulário s1 , s2 e assim por diante.

<div id="sections">
   <div id="s1">...</div>
   <div id="s2">...</div>
   ...
</div>

Eu quero aplicar uma propriedade css a um subconjunto dessas seções / divs (dependendo do id). No entanto, toda vez que adiciono uma div , tenho que adicionar o css para a seção separadamente dessa maneira.

//css
#s1{
...
}

Existe algo como expressões regulares em css que eu possa usar para aplicar estilo a um conjunto de divs .


9
Você provavelmente deveria estar usando o classatributo para identificar a classe de elementos com esses IDs
— LeeGee

Respostas:


191

Você pode gerenciar a seleção desses elementos sem nenhuma forma de regex, como mostram as respostas anteriores, mas para responder diretamente à pergunta, sim, você pode usar uma forma de regex nos seletores:

#sections div[id^='s'] {
    color: red;  
}

Dito isto, selecione qualquer elemento div dentro da #sections div que tenha um ID começando com a letra 's'.

Veja violino aqui .

O seletor de CSS do W3 documenta aqui .


1
Isso estava em uma recomendação para CSS 2.1; ele é suportado pelo IE 7, Opera 9 etc .. Fonte: developer.mozilla.org/en-US/docs/Web/CSS/Attribute_selectors
— Mike S

2
você fez meu dia. Eu estava procurando incluir alguns seletores de CSS avançados em um rastreador para torná-lo configurável pelo usuário. que ^ = era como a água no deserto.
— DGoiko

59

Como complemento desta resposta, você pode usar $para obter as correspondências finais e *obter correspondências em qualquer lugar do nome do valor.

Jogos em qualquer lugar: .col-md, .left-col, .col, .tricolor, etc.

[class*="col"]

Jogos no início: .col-md, .col-sm-6, etc.

[class^="col-"]

Corresponde à final: .left-col, .right-col, etc.

[class$="-col"]

(Eu sei que isso parece loucura, mas) É possível "destruir" a cada partida?
— Walter

24

Um ID destina-se a identificar o elemento exclusivamente . Quaisquer estilos aplicados a ele também devem ser exclusivos para esse elemento. Se você possui estilos que deseja aplicar a muitos elementos, adicione uma classe a todos eles, em vez de confiar nos seletores de ID ...

<div id="sections">
   <div id="s1" class="sec">...</div>
   <div id="s2" class="sec">...</div>
   ...
</div>

e

.sec {
    ...
}

Ou, no seu caso específico, você pode selecionar todas as divisões dentro do contêiner pai, se não houver mais nada dentro dele, da seguinte forma:

#sections > div {
    ...
}

10

Primeiro de tudo, existem muitas, muitas maneiras de combinar itens em um documento HTML. Comece com esta referência para ver alguns dos seletores / padrões disponíveis que você pode usar para aplicar uma regra de estilo a um (s) elemento (s).

http://www.w3.org/TR/selectors/

Combine todos os divs que são descendentes diretos de #main.

#main > div

Combine todos os divs que são descendentes diretos ou indiretos de #main.

#main div

Combine o primeiro, divque é um descendente direto de #sections.

#main > div:first-child

Combine a divcom um atributo específico.

#main > div[foo="bar"]

5

Você pode 'simplesmente adicionar uma classe a cada um dos seus DIVs e aplicar a regra à classe desta maneira:

HTML:

<div class="myclass" id="s1">...</div>
<div class="myclass" id="s2">...</div>

CSS:

//css
.myclass
{
   ...
}

3
Também como regra geral, tento não estilizar as coisas com seletores de ID. Ele altera a especificidade para que sejam mais difíceis de substituir, o que geralmente dói mais do que ajuda na minha experiência. Eu uso id's ... só que não para aplicar css.
— Prodigitalson

Eu estava apenas dizendo que tento evitar o uso de seletores de ID porque, se você substituir o estilo mais tarde (digamos, para uma página específica), acabará tendo que usar o mesmo seletor + o que mais puder usar para torná-lo mais específico do que o seletor original. Não é ruim, .thepage #someidmas apenas pode ficar muito tempo na tabela avançada ou no estilo de lista. Não era uma crítica de sua resposta tanto como ele foi o conselho geral expandindo sua resposta :-)
— prodigitalson

0

Eu costumo usar *quando quero obter todas as seqüências que contêm os caracteres desejados.

* usado no regex, substitui todos os caracteres.

Usado no SASS ou CSS seria algo parecido [id*="s"]e obterá todos os elementos DOM com o ID "s ......".

/* add red color to all div with id s .... elements */

div[id^="s"] {
    color: red;
}

-4

Experimente minha expressão regular CSS genérica

(([a-z]{5,6}.*?\))|([\d.+-]?)(?![a-z\s#.()%])(\d?\.?\d?)?[a-z\d%]+)|(url\([/"'][a-z:/.]*['")]\))|(rgb|hsl)a?\(\d+%?,?\s?\d+%?,?\s?\d+%?(,\s?\d+\.?\d?)?\)|(#(\w|[\d]){3,8})|([\w]{3,8}(?=.*-))

Demo https://regexr.com/4a22i


-11

existe outra maneira simples de selecionar elementos específicos em css também ...

#s1, #s2, #s3 {
    // set css attributes here
}

se você tiver apenas alguns elementos para escolher e não quiser se preocupar com as aulas, isso também será fácil.


3
@AustinHenley Bcoz, essa não é a solução. Não quero editar regras de CSS toda vez que mencionei na pergunta.
— Ankit

Isso não merece voto negativo. Se você soubesse, por exemplo, que havia no máximo 10 divs, poderia colocar # s1 a # s10 e não precisaria tocar nos seletores. A maneira correta de fazer isso é com as classes, mas esta solução está tomando suas suposições e tentando uma solução.
— Jcuenod #

4
Realmente não importa se essa é uma solução possível para essa situação. Esta resposta não responde à pergunta, porque qualquer pessoa com o conhecimento mais básico em CSS sabe como usar vários seletores ou classes.
— precisa saber é o seguinte
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.