2011-12-12 45 views
2

比方說,我有以下HTML:僞類:nextTo?

<ul> 
    <li id="1">First issue.</li> 
    <li id="2" class="error">Second issue.</li> 
    <li id="3" class="error">Third issue.</li> 
    <li id="4">Fourth issue.</li> 
    <li id="5" class="error">Fifth issue.</li> 
    <li id="6" class="error">Sixth issue.</li> 
    <li id="7" class="error">Seventh issue.</li> 
    <li id="8" class="error">Eighth issue.</li> 
    <li id="9">Ninth issue.</li> 
    <li id="10" class="error">Tenth issue.</li> 
</ul> 

下面CSS:

.error { 
    background-color: rgba(255, 0, 0, 0.2); 
} 

什麼我希望做的是樣式在序列中的第一個和最後一個<li>風格不同於位於中間的其他<li>

例如,#2, #5, #10應該都匹配「首先在序列選擇」; #3, #8, #10應該與「上一個順序選擇器」匹配。

我想申請以下樣式爲「先入序列」和「後進序列」,分別爲:

.firstInSequence { 
    border-radius-top-right: 10px; 
    border-radius-top-left: 10px; 
} 

.lastInSequence { 
    border-radius-bottom-right: 10px; 
    border-radius-bottom-left: 10px; 
} 

是否有選擇,我可以用它來做到這一點本身在CSS?

回答

4

正如在其他的答案說,你可以風格的「第一序列的」使用:not:first-child僞選擇:

:not(.error) + .error, 
.error:first-child { 
    border-top-right-radius: 10px; 
    border-top-left-radius: 10px; 
} 

我想我找到了「最後一序列的」在溶液中此方案具有圓角。它使用完成的成品完全不同的方法,但有類似的結果結束:

Rounded Corners on last of sequence

的基本技術是應用僞元素與radial-gradients列出不.error..error是項目S,並將其移動比上年(.error)列表項:

.error + :not(.error):before { 
    content:''; 
    display:block; 
    width:10px; 
    height:10px; 
    position:absolute; 
    top:-20px; 
    left:0; 
    background:-webkit-radial-gradient(100% 0,circle,transparent 10px,white 0); 
} 

.error + :not(.error):after { 
    content:''; 
    display:block; 
    width:10px; 
    height:10px; 
    position:absolute; 
    top:-20px; 
    right:0; 
    background:-webkit-radial-gradient(0 0,circle,transparent 10px,white 0); 
} 

確保liposition:relative;

最後,在最後一個border-radius,使用last-of-type

.error:last-of-type{ 
    border-bottom-right-radius:10px; 
    border-bottom-left-radius:10px 
} 

Demo(僅適用於簡單的Webkit)

+0

不幸的是,該演示沒有解決#10的問題,它只在頂部而不是在底部。 –

+1

這可以用':last-of-type'來解決。我更新了我的答案。 – bookcasey

+1

+1這是一些非常激進的想法。只有我能想到的問題(除了讓它跨瀏覽器工作):需要純色背景;需要列表項之間的餘量。保證金事情似乎是一個交易斷路器。 –

2

我想你可能能夠湊齊這件一起工作,但不是全部。但這是我的想法開始。

自由地運用CSS3 not selectoradjacent sibling combinator的。

這些都是我覺得你有做的機會件。

http://jsfiddle.net/PDQMg/

錯誤是第一次在列表

li.error:first-child { } 
<li error /> 
<li noerror /> 
... 
<li /> 

錯誤是後無差錯。

li:not(li.error) + li.error { } 
<li noerror /> 
<li error /> 
... 
<li /> 

錯誤是最後的名單

li.error:last-child { } 
<li /> 
... 
<li class="error" /> 
+1

+1搞怪我們不得不在同一時間相同的基本思路。我不認爲你需要':last-child'選擇器,除非你想部分覆蓋「last in sequence」位,否則'not(.error)+ .error'應該覆蓋那個。 –

+0

是的,我看到了你的答案,並且更喜歡它的語法。不幸的是,我不認爲他可以得到最後一個列表屬性,因爲沒有:之前在CSS選擇器(也不會認爲會有) – mrtsherman

+0

是的,我認爲OP是沒有氣的那一個。像':not(.error):prev(.error:first)'這樣的想象可能會工作(但肯定是醜陋的)。雖然這種情況很少見。 –

2

對於 「第一順序」 你可以試試這個,只要要素是相鄰的:

演示:http://jsfiddle.net/WkxyP/

:not(.error) + .error, 
.error:first-child { 
    border-top-right-radius: 10px; 
    border-top-left-radius: 10px; 
} 
  • :not(.error) + .error - 類別爲「錯誤」的下一個相鄰元素沒有類別「錯誤」
  • .error:first-child - 類別爲「error」的元素是另一個元素的第一個子元素,對於上述選擇器無法匹配的情況

認爲,涵蓋一切。不知道如何做這個特殊的謎題「順序最後」。

順便說:檢查您的屬性名稱,應該是border-top-left-radius而不是border-radius-top-left,等等。

+0

+1。我'用'了你的答案,(儘管我獨立發現了一個[convergent](http://en.wikipedia.org/wiki/Convergent_evolution)解決方案,如果你願意的話)。但是,我並不是簡單地編輯你的文章,因爲我想出了'最後一個順序'的東西。我很想知道你的想法。 – bookcasey