iT邦幫忙

1

:nth-child() 為什麼是從1開始不是從0開始

nai 2021-10-02 20:26:10613 瀏覽
  • 分享至 

  • xImage
  •  

之前上課時jQuery講師說到:

:nth-child(b) b要從1開始,不知道為什麼

比如$('tr td:nth-child(2)').css('background','black'),會選取tr 底下的第2個td變黑(1然後2,真正意義上的2)

但jQuery的其他選取器,如:eq(b),:lt(b),:gt(b),:odd... 裡面的參數b都要從0開始
比如$('td:lt(3)').css('background', 'black') 會選取小於第3個的td們,使他們背景變黑。
也就是選取了第0個td、第1個td、第2個td,共3個。(第3個的3並沒有小於3)

這樣的不一致有點令人困惑
是因為:nth-child()是CSS原生的語法,後者是jQuery的語法嗎?

序數Ordinal numbers

首先講序數,第1的英文叫 first,第2 叫 second...,那第0叫什麼,有這個東西嗎?
答案是有的
就叫做 zeroth
特殊領域專業甚至還會用到epsilonth(εth)這種東西。

接者就要討論到,從幾開始,這個老問題

從0開始的記數

先看看wiki Zero-based_numbering
裡面大意是說

計算機工程不像日常使用上,很多有序的東西是從0開始計算,也就是array首項叫做 第0項。雖然這樣的合理性或邏輯上的正確性沒有共識,但已是常態。

(裡面也討論了格里歷vs天文紀年,建築物的一樓到底該叫0樓還是一樓呢,等等的問題,蠻有趣的,有興趣可以看看)

:nth

回到問題,nth是什麼?
'n' stands for "Natural number",也就是0和所有正整數
‘th’ stands for ordinal indicator 像是 5th 6th。
以是自然數這樣來看0th沒有什麼不對啊? 但今天後面是 -child(n)。
如果今天n跟:gt(n)一樣,從0開始:
n為0時 那 0th-child就會等於 :first-child;而 1th-child 卻不是 first-child

這就很混亂了。所以這個語法中,第一個小孩,我們就會說是第一個小孩,而不是第0個小孩。
這是為什麼nth-child(n)的 n 是從1開始計算,而不是從0開始,的推測答案。


個案理解了,那通則而言哪些語言的哪些方法是從0開始,哪些又是從1開始呢?
這應該會是個龐大而難以窮盡的問題
剛剛那篇wiki有提到部分:

  • 高階語言如Fortran或COBOL,因為需要與一般上的序數對應,所以是從1開始。(JS也是3GL阿)
  • APL允許設定要從0或從1開始
  • 其他避免誤譯,可以進連結去看

那從0開始的各語言,0是個unsigned integer,還是有所謂正0,負0呢?
這應該是另一個問題了


以上的答案,如果覺得有個人推論上的瑕疵
可以採用mozilla的說明來記憶,就不會有問題了

:nth-child(an+b)

:nth-child(5n)
Represents elements 5 [=5×1], 10 [=5×2], 15 [=5×3], etc. The first one to be returned as a result of the formula is 0 [=5x0], resulting in a no-match, since the elements are indexed from 1, whereas n starts from 0. This may seem weird at first, but it makes more sense when the B part of the formula is >0, like in the next example.

:nth-child(n+7)
Represents the seventh and all following elements: 7 [=0+7], 8 [=1+7], 9 [=2+7], etc.

大意是說,表定上5n第一個符合的值是0,但因為index從1開始,所以0略過。
這樣的定義或許乍看下有點奇怪,但如果是5n+1第一個符合的就是1,第二個符合的是6,就能因此很合邏輯。


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言