Tại sao: nth-child () trong CSS bắt đầu từ 1 thay vì 0?


15

Tại sao: nth-child () lặp từ một thay vì 0?

Như thể hiện trong ví dụ này . Tại sao nó chọn phần tử đầu tiên mà không phải phần tử thứ hai khi

p :nth-child(1)

12
"Các chỉ số mảng có nên bắt đầu từ 0 hay 1 không? Tôi nghĩ rằng sự thỏa hiệp 0,5 của tôi đã bị từ chối mà không có sự cân nhắc đúng đắn." - Stan Kelly-Bootle
Mason Wheeler

1
Vì tôi nghi ngờ điều này sẽ thu hút được một số phiếu bầu gần, tôi bỏ ngỏ điều này vì ít nhất về mặt lý thuyết có thể trả lời khách quan bằng cách trích dẫn các ví dụ khác về lập chỉ mục 1 trong CSS và yêu cầu sự nhất quán hoặc tìm một tuyên bố có liên quan từ một trong những người thực sự đưa ra quyết định tiêu chuẩn CSS. Tôi không biết gần như đủ về CSS để tự mình làm điều đó, nhưng miễn là chúng ta không đưa ra bất kỳ câu trả lời nào cho thấy rõ ràng "đó là cách con người bình thường đếm" mà không có bất kỳ lý do nào giải thích tại sao mọi thứ khác đều được lập chỉ mục 0 không có hại trong việc để mở này.
Ixrec

1
@lxrec: Tôi nghĩ rằng đó là một tuyên bố rằng "mọi thứ khác đều được lập chỉ mục 0" nên được chứng minh. Bạn đừng nói Nữ hoàng Elizabeth the Zeroth, Ngày lễ Giáng sinh, đường zeroth ở bên trái hoặc từ zeroth trên trang.
JacquesB

@lxrec Trong câu trả lời của tôi, XPath được trích dẫn là tiền lệ cho lập chỉ mục dựa trên 1. Không chắc đó thực sự là một yếu tố hay chỉ là sự trùng hợp ngẫu nhiên, nhưng đó là một hệ thống tập trung XML khác nên nó có ý nghĩa.
dùng949300

Câu trả lời:


15

Nếu bạn đếm những đứa con của mình, bạn sẽ nói "đứa con đầu lòng của tôi", "đứa con thứ hai của tôi", v.v., chứ không phải "đứa con tinh thần của tôi". Đây chỉ đơn giản là cách con người đếm. (Lưu ý: Đây không phải là một số ý kiến ​​chủ quan của tôi. Đây thực sự là cách các số thứ tự hoạt động.)

Lý do bạn thậm chí đặt câu hỏi có lẽ là vì bạn là lập trình viên và nhiều ngôn ngữ lập trình lập chỉ mục mảng và liệt kê các mục từ 0. Lý do cho điều này là trong các ngôn ngữ cấp thấp như C, một mảng thực sự là một con trỏ đến địa chỉ bộ nhớ của mục đầu tiên và chỉ mục là phần bù so với con trỏ này. Vì vậy, array[0]có nghĩa là địa chỉ của mục đầu tiên, array[1]có nghĩa là địa chỉ của mục đầu tiên cộng với kích thước của 1 mục, tức là mục thứ hai, v.v.

Nhiều ngôn ngữ cấp cao hơn không hỗ trợ trực tiếp số học con trỏ đã giữ lại chỉ mục dựa trên 0 để thống nhất và quen thuộc. Ví dụ: tất cả các ngôn ngữ có cú pháp xuất phát từ C - bao gồm JavaScript, mặc dù các mảng trong JavaScript được triển khai theo một cách hoàn toàn khác. Nhưng điều này không hoàn toàn phổ biến - các ngôn ngữ như COBOL, Fortran, Lua và một số cơ bản sử dụng lập chỉ mục dựa trên 1. (Visual Basic tự nhiên chọn điều tồi tệ nhất của cả hai thế giới bằng cách cấu hình nó.) Vì vậy, nó chắc chắn không giống như mọi ngôn ngữ khác sử dụng lập chỉ mục dựa trên 0. Để biết giá trị của nó, XPath và XQuery cũng sử dụng lập chỉ mục dựa trên 1.

Mặc dù hầu hết các lập trình viên sẽ quen thuộc với cả lập chỉ mục dựa trên 1 và 0, nhưng người bình thường sẽ tự nhiên đếm từ 1 và CSS là ngôn ngữ được thiết kế không chỉ cho lập trình viên mà còn cho các nhà thiết kế và chuyên gia đồ họa, do đó, việc chọn lập chỉ mục dựa trên 1 là điều tự nhiên .



1
sẽ rất hữu ích nếu câu trả lời của bạn đề cập rằng bạn tin rằng CSS chủ yếu được sử dụng cho những người không phải là lập trình viên (tốt nhất là sao lưu bằng cách nào đó)
gnat

1
@gnat Có bất cứ nơi nào trong lập trình bất kỳ mục nào mà một đứa trẻ được cho là zeroth không? Vì bộ chọn là con thứ n nên logic của nó bắt đầu từ đầu tiên.
Sami Kuhmonen

1
Bạn có thể xóa mọi thứ trừ đoạn cuối không? Mọi thứ khác là kiến ​​thức phổ biến về SE này. "Trong khi hầu hết các lập trình viên ...... tự nhiên chọn lập chỉ mục dựa trên 1"
0fnt

2
Tôi không đồng ý với câu trả lời của bạn, nhưng nhiều điều chúng tôi tính không bắt đầu từ 1. Bạn 0 tuổi trong năm đầu tiên của cuộc đời - bạn không bắt đầu lúc 1. Ngày không bắt đầu lúc 1:00 sáng - bắt đầu lúc 0:00 sáng Khi tôi đo khoảng cách di chuyển từ nhà tôi, tôi bắt đầu từ 0. Đếm từ số 0 là điều tự nhiên đối với con người như đếm từ một người - điều đó phụ thuộc vào bối cảnh, mặc dù bạn nói đúng rằng chúng ta sẽ không bao giờ nói về đứa con không biết của mình :)
Aaron Rasmussen

6

Từ Đặc tả bộ chọn CSS cấp 3 :

6.6.5.2. : nth-child () giả lớp

Các :nth-child(an+b)ký hiệu pseudo-class đại diện cho một yếu tố mà có an+b-1anh chị em trước khi nó trong cây tài liệu, đối với bất kỳ số nguyên dương hoặc không có giá trị n, và có một yếu tố phụ huynh. Đối với các giá trị bằng ablớn hơn 0, điều này có hiệu quả phân chia con của phần tử thành các nhóm aphần tử (nhóm cuối cùng lấy phần còn lại) và chọn bphần tử thứ của mỗi nhóm. Ví dụ, điều này cho phép các bộ chọn giải quyết mọi hàng khác trong một bảng và có thể được sử dụng để thay thế màu của văn bản đoạn văn trong một chu kỳ bốn. Các giá trị abphải là số nguyên (dương, âm hoặc bằng 0). Chỉ số của con đầu tiên của một phần tử là 1.

Nó đi vào chi tiết hơn rất nhiều với các ví dụ. Dường như tính toán cuối cùng an+bphải tổng thành một số dương.

Khi a= 0, một phần không cần được đưa vào (trừ khi bphần đó đã bị bỏ qua). Khi ankhông được bao gồm và bkhông âm, dấu + trước b(khi được phép) cũng có thể bị bỏ qua. Trong trường hợp này cú pháp đơn giản hóa thành :nth-child(b).

Nếu cả hai abbằng 0, lớp giả biểu thị không có phần tử nào trong cây tài liệu.

Định dạng bổ sung trong đoạn cuối là của tôi để thêm nhấn mạnh.


0

Có lẽ để thống nhất với XPath, một ngôn ngữ xử lý XML / HTML khác. Điều này đặt ra câu hỏi, tại sao XPath sử dụng lập chỉ mục dựa trên 1?

Xem /programming/3319341/why-do-indexes-in-xpath-start-with-1-and-not-0

Các trích dẫn có liên quan (nhưng gây tranh cãi) là:

"... Logic dựa trên 1 là lựa chọn phù hợp cho XPath và XSLT ... vì ngôn ngữ được thiết kế cho người dùng, không dành cho lập trình viên và người dùng vẫn có thói quen lỗi thời này khi đề cập đến chương đầu tiên trong một cuốn sách như Chương một..."

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.