2016-01-28 14 views
6

mam ten znaczników gdzie identyfikatory nie są znane z góry:Wybierz elementy z losowo generowanych identyfikatorów CSS

#product-20625055 { background-color: #FC0; } 
 
#product-66980342 { background-color: #0CF; } 
 
#product-54722210 { background-color: #F0C; }
<div class="product" id="product-20625055">Product 1</div> 
 
<div class="product" id="product-66980342">Product 2</div> 
 
<div class="product" id="product-54722210">Product 3</div>

Muszę zmienić kolor tła wszystkich DIV. Jest to najbardziej szczegółowy selektor mogę myśleć, ale to nie działa:

div.product[id^="product-"] { background-color: transparent; } 

można to zrobić bez ciężkiej kodowania identyfikatorów, korzystając !important i zmieniającym znaczników HTML?

+0

Selektory, które zawierają i selektor '# id' są tak szczegółowe, jak tylko możesz, ponieważ mają na celu być wyjątkowym. Jeśli naprawdę nie możesz postępować zgodnie ze standardowymi wytycznymi CSS i usuwać selektory id, musisz nie stosować się do standardowych wytycznych CSS i używać '! Important'. To nie zawsze jest złe. – Rhumborl

+0

Możesz przenieść konkretny znacznik koloru tła do elementu przed css i zastąpić je klasą .product. – Kao

+2

Trzy selektory 'id' mają specyficzność 100, podczas gdy' div.product [id^= "product -"] 'ma specyficzność tylko 021, więc nie zastąpi koloru tła. Musisz użyć selektora 'id', aby mieć możliwość nadpisania bez używania twardego kodu/ważnego. Może więc przypiszesz 'id' do ciała i użyjesz' #id div.product [id^= "product -"] '. – Harry

Odpowiedz

6

Zamiast uciekania się do !important, warto rozważyć użycie pseudo-klasę :not() zwiększyć swoistość swoje selektor, tak:

div.product:not(#specificity-hack) { background-color: transparent; } 

dopasowuje te same elementy, jak oryginalnego selektora (assumi ng, że specificity-hack nie jest możliwym identyfikatorem dla elementu div produktu, co wydaje się prawdopodobnie tutaj), ale od selectors inside :not() are included in the specificity calculation, liczy się jako bardziej szczegółowy niż reguły, które próbujesz przesłonić.

(Główny reason not to use !important if you can avoid it jest to, że uzależnia — jedyny sposób, aby zastąpić regułę !important jest z inny!important reguła, więc im więcej korzystasz, tym więcej znajdziesz się potrzebne.Ostatecznie połowa reguł CSS zostanie oznaczona jako !important, a Ty wracasz z powrotem tam, gdzie zaczynałeś, z tym że teraz twoje arkusze stylów są przepełnione dużą ilością znaczników !important, a także skutecznie pozbawiłeś się możliwości używania !important do nadpisuj normalne style w rzadkich przypadkach, w których jest to naprawdę uzasadnione, a teraz ma na celu ucieczka się do hacków specyficznych, takich jak pokazana powyżej. Morał z tej historii: !important jest potężny, ale łatwy do nadużywania — nie używaj go, chyba że naprawdę musisz!)

+1

+1 Zabawne, jak to zostało zadane, zaraz po tym, jak skomentowałeś moją odpowiedź. Doceniam również ironię selektora o nazwie ': not (# specificity-hack)'. – BoltClock

-3

Można zastąpić selektor identyfikatora Za pomocą tego kodu [id | = "produkt"] lub div.product: nie (#product) selektor:

#product-20625055 { background-color: #FC0; } 
 
#product-66980342 { background-color: #0CF; } 
 
#product-54722210 { background-color: #F0C; } 
 

 
/* You Can Use This Selector */ 
 
[id|="product"] { 
 
    background-color: transparent !important; 
 
} 
 

 
/* Or This Selector */ 
 
div.product:not(#product) { background-color: transparent; }
<div class="product" id="product-20625055">Product 1</div> 
 
<div class="product" id="product-66980342">Product 2</div> 
 
<div id="product-54722210" class="product">Product 3</div>

Inną praktyką jest mieć klasy, a nie ids w twoim css, więc mogą być łatwo nadpisane.

.product-20625055 { background-color: #FC0; } 
 
    .product-66980342 { background-color: #0CF; } 
 
    .product-54722210 { background-color: #F0C; } 
 
    
 
    
 
    .product { background-color:transparent; } 
 
<div class="product product-20625055" id="product-20625055">Product 1</div> 
 
    <div class="product product-66980342" id="product-66980342">Product 2</div> 
 
    <div id="product-54722210" class="product product-54722210">Product 3</div> 
 

0

Może wybrać div poprzez klasy (bo wszyscy mają takie same) i dodać !important

.product { 
    background: transparent!important; 
} 
0

użyć CSS! Ważną cechą jest to użyteczne w sytuacjach, jak jesteś obecnie. Ale bądźcie kużni podczas korzystania z niego nie używaj go nadmiernie w swoich plikach css. Jest używany w css do nadpisywania reguł. Ilekroć umieścisz go po jakiejkolwiek regule css, która będzie ważna, użyjemy tej reguły w stosunku do jakiejkolwiek innej reguły zdefiniowanej gdziekolwiek w plikach css, których używasz.

#product-20625055 { background-color: #FC0 !important ; } 
#product-66980342 { background-color: #0CF !important ; } 
#product-54722210 { background-color: #F0C !important ; } 
3

Myślę, że to jeden z tych przypadków, gdzie !important może być najlepszym rozwiązaniem.

#product-20625055 { 
 
    background-color: #FC0; 
 
} 
 
#product-66980342 { 
 
    background-color: #0CF; 
 
} 
 
#product-54722210 { 
 
    background-color: #F0C; 
 
} 
 
div[id^="product-"].product { 
 
    background-color: transparent !important; 
 
}
<div class="product" id="product-20625055">Product 1</div> 
 
<div class="product" id="product-66980342">Product 2</div> 
 
<div class="product" id="product-54722210">Product 3</div>

0

Prosto z https://developer.mozilla.org/en/docs/Web/CSS/Specificity#The_!important_exception

Gdy! Ważna zasada jest stosowana na deklaracji stylu, deklaracja zastępuje żadnych innych deklaracji.

można wykorzystywać !important pominięcia każdego Css

<div class="product" id="product-20625055">Product 1</div> 
<div class="product" id="product-66980342">Product 2</div> 
<div class="product" id="product-54722210">Product 3</div> 

#product-20625055 { background-color: #FC0; } 
#product-66980342 { background-color: #0CF; } 
#product-54722210 { background-color: #F0C; } 

.product {background-color: transparent !important;} 
0

Selektor atrybut [id ....] musi być zmieniona, aby wykonać wartość prefix ([id^= "produkt"]), także dlatego, że ID będzie wymagać czegoś, co będzie potrzebne, ważne po zastosowaniu przezroczystego bgcolor. Zobacz poniżej próbkę html.

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <title>Title</title> 
    <style type="text/css"> 
     <!-- 
     #product-20625055 { background-color: #FC0; } 
     #product-66980342 { background-color: #0CF; } 
     #product-54722210 { background-color: #F0C; } 

     div.product[id^="product"] { 
      background-color: transparent!important; 
     } 
     --> 
    </style> 
</head> 
<body> 

<div class="product" id="product-20625055">Product 1</div> 
<div class="product" id="product-66980342">Product 2</div> 
<div class="product" id="product-54722210">Product 3</div> 



</body> 
</html> 
0

Wystarczy dodać do swojej body lub inny element, który owija swój products jakiś identyfikator i

#product-20625055 { 
 
    background-color: blue; 
 
} 
 
#wrapper .product[id^="product-"] { 
 
    background-color: red; 
 
}
<div id="wrapper"> 
 
    <div class="product" id="product-20625055">Product 1</div> 
 
</div>

-1

można użyć tego

: nth-child (liczba) {deklaracje css;} Przykład:

div.product:nth-child(1){ 
background-color:white; 
} 

div.product:nth-child(2){ 
background-color:blue; 
} 

div.product:nth-child(3){ 
background-color:yellow; 
} 
3

wszystkich trzech id selektorów, które są stosowane we fragmencie mają swoistość 100 natomiast selektora, którego używasz, aby spróbować i zastąpić (div.product[id^="product-"]) ma specyfikę tylko 021 (bo ma jeden selektor klasy, jeden selektor atrybutu i jeden selektor typu elementu).

Nie można zastąpić przełącznik id chyba że używasz innego wyboru id jako część pełnego selektora (dodając selektor id nigdzie wystarczą) (lub) stosowanie !important (lub) stosowanie stylów inline. Ponieważ nie zostanie dodany selektor id, pierwsza cyfra będzie zawsze wynosić 0, a więc będzie mniej dokładna niż selektory id.

Ponieważ nie można zakodować na stałe wartości id każdego elementu (ponieważ jest losowa), jedyną opcją byłoby dodanie elementu id do elementu nadrzędnego, a następnie użycie go jako części selektora, tak jak wspomniałem w moim komentarzu. id może zostać dodany do wspólnego rodzica (lub), jeśli nie ma rodzica, a następnie do body.

#product-20625055 { 
 
    background-color: #FC0; 
 
} 
 
#product-66980342 { 
 
    background-color: #0CF; 
 
} 
 
#product-54722210 { 
 
    background-color: #F0C; 
 
} 
 
#id div.product[id^="product-"] { 
 
    background-color: transparent; 
 
}
<div id='id'> 
 
    <div class="product" id="product-20625055">Product 1</div> 
 
    <div class="product" id="product-66980342">Product 2</div> 
 
    <div class="product" id="product-54722210">Product 3</div> 
 
</div>

+0

Dobra robota, nie pomyślałem o tym, kiedy napisałem swój komentarz, ale wymaga to zmiany znaczników (czy to naprawdę niemożliwe z powodu PO, czy "tylko dlatego, że", nie wiem) – Rhumborl

+0

@Rhumborl Nie , tak naprawdę nie wymaga zmiany znaczników (co oznacza, że ​​nie wymaga zmiany w samym pliku HTML), ponieważ 'id' może być dodany również w inny sposób. Dodatkowo OP mówi bez twardego kodu id i bez użycia '! Important', więc jedynym sposobem jest dodanie selektora' id' jako części złożonego selektora. – Harry

+0

To jest dobra druga opcja (pierwsza, gdybym miał jakąś kontrolę nad elementami nadrzędnymi). –

0

Selector div.product[id*="product-"] will działa! jeśli trzeba przerobić już istniejący obiekt, trzeba użyć !important:

#product-20625055 { background-color: #FC0; } 
#product-66980342 { background-color: #0CF; } 
#product-54722210 { background-color: #F0C; } 

div.product[id*="product-"] { 
    background-color: green!important; 
} 

jsfiddle-link