¿Usando expresiones regulares en css?


127

Tengo una página html con divs que tienen id (s) de la forma s1 , s2 , etc.

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

Quiero aplicar una propiedad css a un subconjunto de estas secciones / divs (dependiendo de la identificación). Sin embargo, cada vez que agrego un div , tengo que agregar el CSS para la sección por separado de esta manera.

//css
#s1{
...
}

¿Hay algo como expresiones regulares en css que pueda usar para aplicar estilo a un conjunto de divs ?


9
Probablemente deberías estar usando el classatributo para identificar la clase de elementos con esos ID
LeeGee

Respuestas:


191

Puede administrar la selección de esos elementos sin ninguna forma de expresión regular como muestran las respuestas anteriores, pero para responder la pregunta directamente, sí, puede usar una forma de expresión regular en los selectores:

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

Eso dice que seleccione cualquier elemento div dentro de las #secciones div que tengan una ID que comience con la letra 's'.

Ver violín aquí .

W3 CSS selector de documentos aquí .


1
Esto estaba en una recomendación para CSS 2.1; es compatible con IE 7, Opera 9, etc. Fuente: developer.mozilla.org/en-US/docs/Web/CSS/Attribute_selectors
Mike S

2
Usted acaba de hacer mi día. Estaba buscando incluir algunos selectores css avanzados en un rastreador para que sea configurable por el usuario. que ^ = era como el agua en el maldito desierto.
DGoiko

59

Como complemento de esta respuesta , puede usar $para obtener las coincidencias finales y *obtener coincidencias en cualquier parte del nombre del valor.

Partidos en cualquier lugar: .col-md, .left-col, .col, .tricolor, etc.

[class*="col"]

Partidos al principio: .col-md, .col-sm-6, etc.

[class^="col-"]

Partidos en la final: .left-col, .right-col, etc.

[class$="-col"]

(Sé que esto suena loco, pero) ¿Es posible hacer "destrucción" con cada partido?
Walter

24

Una identificación está destinada a identificar el elemento de manera única . Cualquier estilo aplicado también debería ser exclusivo de ese elemento. Si tiene estilos que desea aplicar a muchos elementos, debe agregar una clase a todos ellos, en lugar de confiar en los selectores de ID ...

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

y

.sec {
    ...
}

O, en su caso específico, puede seleccionar todas las divisiones dentro de su contenedor principal, si no hay nada más dentro, así:

#sections > div {
    ...
}

10

En primer lugar, hay muchas, muchas formas de hacer coincidir elementos dentro de un documento HTML. Comience con esta referencia para ver algunos de los selectores / patrones disponibles que puede usar para aplicar una regla de estilo a un elemento (s).

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

Une todos los divs que son descendientes directos de #main.

#main > div

Une todos los divs que son descendientes directos o indirectos de #main.

#main div

Empareja el primero divque es un descendiente directo de #sections.

#main > div:first-child

Haga coincidir a divcon un atributo específico.

#main > div[foo="bar"]

5

Puede 'simplemente agregar una clase a cada uno de sus DIV y aplicar la regla a la clase de esta manera:

HTML:

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

CSS:

//css
.myclass
{
   ...
}

3
También, como regla general, trato de no diseñar cosas con selectores de ID. Ajusta la especificidad para que sean más difíciles de anular, lo que generalmente duele más de lo que ayuda en mi experiencia. Uso id's ... solo que no para aplicar css.
prodigitalson

Estaba diciendo que trato de evitar el uso de selectores de id porque luego, si anula el estilo más tarde (digamos para una página específica), terminará teniendo que usar ese mismo selector + cualquier otra cosa que pueda usar para hacerlo más específico que el selector original. No está mal si solo es así, .thepage #someidpero puede quedarse sin aliento en tablas avanzadas o estilos de lista. No fue una crítica de su respuesta tanto como un consejo general que amplió su respuesta :-)
prodigitalson

0

Usualmente uso *cuando quiero obtener todas las cadenas que contienen los caracteres deseados.

* usado en expresiones regulares, reemplaza todos los caracteres.

El uso en SASS o CSS sería algo así [id*="s"]y obtendrá todos los elementos DOM con la identificación "s ......".

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

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

-4

Pruebe mi expresión 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

También hay otra manera simple de seleccionar elementos particulares en CSS ...

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

Si solo tiene unos pocos elementos para elegir y no quiere molestarse con las clases, esto también funcionará fácilmente.


3
@AustinHenley Bcoz esta no es la solución. No quiero editar las reglas CSS cada vez que mencioné en la pregunta.
Ankit

Esto no merece un voto negativo. Si supiera, por ejemplo, que había como máximo 10 divs, podría poner # s1 a # s10 y no tendría que tocar los selectores. La forma correcta de hacerlo es con clases, pero esta solución es tomar sus suposiciones e intentar una solución.
jcuenod

44
Realmente no importa si esta es una posible solución para esta situación dada. Esta respuesta no responde a la pregunta en absoluto porque cualquier persona con el conocimiento CSS más básico sabe cómo usar múltiples selectores o clases.
Jayant Bhawal
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.