W3C home > Mailing lists > Public > www-style@w3.org > June 2010

Re: [css3-selectors] The :nth-sibling combinator

From: Tab Atkins Jr. <jackalmage@gmail.com>
Date: Mon, 21 Jun 2010 10:04:28 -0700
Message-ID: <AANLkTik9QvWqyWk_tEt04t9MGaFPCL7xetmgltWEz3a7@mail.gmail.com>
To: Eduard Pascual <herenvardo@gmail.com>
Cc: Gabriele Romanato <gabriele.romanato@gmail.com>, www-style@w3.org
On Fri, Jun 18, 2010 at 9:26 AM, Eduard Pascual <herenvardo@gmail.com> wrote:
>> I stumbled on this problem while viewing a demo on scrollable
>> tables that made a large use of something like the following:
>>
>> span + span + span {}
>>
>> Actually, this may be rewritten using a :nth-child() combinator.
> Can it? If you have a markup like this:
> <div>
>   <span>...</span>
>   <span>...</span>
>   <span>...</span>
> </div>
> then either div>span+span+span or div>span:nth-child(3) would do.
> However, what would happen if you had something like this?
> <div>
>   <span>...</span>
>   <img ... alt="Now things are getting funnier!">
>   <span>...</span>
> </div>
> Then we get a difference between what the selectors would match:
> div>span+span+span matches nothing, while div>span:nth-child(3)
> matches the <span> after the <img>.

The actual equivalent of "span:nth-sibling(3)" is "* + * + span".
Both of these would match the same things in both examples, and in
your example below.


> Now, let's take things even crazier:
> <div>
>   <span>...</span>
>   <span>...</span>
>   <span>...</span>
>   <span>Which selectors shall match this?</span>
> </div>
> Now the fun really begins: obviously, div>span:nth-child(3) will match
> the 3rd <span>, but not the fourth. Less obviously, div>span+span+span
> will match *both* the third and the fourth <span>s! (Did you expect
> it?). As a matter of fact, it's possible to match it with
> div>span:nth-child(3+1n) or something like that (sorry, I'm unsure now
> about the exact syntax). To match only the third <span> with a
> '+'-based selector, the simplest way I can think of would be
> div>span:first-child+span+span

Right, that's the simplest way to match only the 3rd child using combinators.

Also, correct, if you want to match from the 3rd child onward, use
:nth-child(3+n).  (When dealing with any of this family of
pseudoclasses, the elements are numbered from 1 upwards, and "n"
starts at 0 and goes upwards.)

Overall, I believe that this selector is exactly equivalent in terms
of power to the :nth-child() pseudoclass, but appears to be more
confusing to use.

~TJ
Received on Monday, 21 June 2010 17:05:21 GMT

This archive was generated by hypermail 2.3.1 : Tuesday, 26 March 2013 17:20:28 GMT