2017-06-26 68 views
1

我有一個外部Select反應組件,這反過來又呈現li標籤。 我想風格所有li除了第一個012px20px;如何訪問外部組件的內部元素

下面是代碼:

const StyledSelect = styled(Select)` 
    li { 
    margin-left: 20px; 
    } 
` 

知道爲什麼這是不工作或另一種方式來做到這一點?

+0

你的代碼將風格所有李Select組件中的元素。如果你想排除第一個li,你必須添加一個css規則/選擇器。見[這個問題](https://stackoverflow.com/questions/10033299/is-there-any-way-to-specify-a-css-shorthand-for-all-elements-except-the-first-l) – devboell

+0

你的問題有點不清楚。是'margin-left:20px;'正確應用,並且您想知道如何排除第一個li?或者你的風格根本不適用? – devboell

回答

5

這應該可行,但根據外部Select如何應用樣式,它們可能具有更高的特異性,並且仍然覆蓋您應用的樣式。 (見this article的底漆上的特異性是如何工作的)

不知道你正在使用Select組件這是一個有點難以調試,但我假設它使用內嵌樣式(即style道具),它有一個非常高特異性,並因此會覆蓋您的應用風格。

如果外部組件不使用內聯樣式,有兩種方法可以改變樣式的特異性,這兩種方法都不推薦使用

撞特異性的第一種方式是使用!important

const StyledSelect = styled(Select)` 
    li { 
    margin-left: 20px!important; 
    } 
` 

在某些情況下,可能還不夠,而且它也很乏味,一旦你有你需要的強行覆蓋更多的屬性。一個更好的辦法,但仍然不建議太是使用類黑客:(注意&符號)

const StyledSelect = styled(Select)` 
    &&& li { 
    margin-left: 20px; 
    } 
` 

什麼styled-components在這裏所做的是生成的類替換每個這些&,這意味着所產生的CSS會看起來像這樣:

.sc-asdf123.sc-asdf123.sc-asdf123 li { 
    margin-left: 20px; 
} 

這三個類大規模撞塊內的風格的特異性。這應該夠了吧!


爲了不樣式您可以用not僞選擇器一起使用first-child的第一個孩子:

const StyledSelect = styled(Select)` 
    &&& li:not(:first-child) { 
    margin-left: 20px; 
    } 
` 
+0

暗示黑客或使用特異性不是指向某人的好方向,imho。 – klaasman

+0

如果外部組件使用內聯樣式,我假定是這種情況,否則樣式將被覆蓋,沒有辦法讓您的樣式應用,而不會給它們比內聯樣式更高的特異性,唯一的方法就是這是可悲的黑客。讓我更新我的答案,解釋爲什麼我認爲這是必要的,一秒鐘! – mxstbr

+0

我已經更新了答案以反映我的假設(外部組件使用內聯樣式)並解釋了爲什麼hacks是必需的,但也說明了如果不是絕對必要的話,它們不應該使用。我的回答現在對你更有意義嗎? – mxstbr