2013-08-30 34 views
6

Tôi đã đọc rất nhiều bài viết về hiệu suất CSS, chẳng hạn như;Tại sao bộ chọn chẳng hạn như [title = "home"] chậm hơn so với sử dụng lớp?

tôi nhận được lý do tại sao selectors như thế này là xấu

#social a { 
} 

Là trình duyệt sẽ đọc một đầu tiên, sau đó bị buộc phải lặp qua tất cả các <a> thẻ trong trang.

Nhưng tại sao bộ chọn chẳng hạn như a [title = "home"] chậm hơn sử dụng lớp?

Tôi giả định rằng trình duyệt tạo một số loại chỉ mục để có thể tìm ra yếu tố nào có một lớp nhất định (đúng?).

Nhưng không nên trình duyệt cũng đã lập chỉ mục những yếu tố nào có thuộc tính nhất định? (chẳng hạn như tiêu đề)?

Câu hỏi của tôi là; tại sao CSS/phần tử tra cứu chậm hơn khi sử dụng các bộ chọn như a [title = "home"] so với sử dụng một lớp ? Trình duyệt sẽ hành động như thế nào để kết quả chậm hơn nhiều?

+0

"Nhưng các trình duyệt không nên cũng đã lập chỉ mục những yếu tố nào có thuộc tính nhất định?" - bạn có nghĩ, điều này có ý nghĩa không? Một lớp học nói điều gì đó như "Này, tôi thuộc loại này, ai cũng có thể làm gì đó với tôi!" trong khi một thuộc tính giữ chỗ chỉ nói "Yo, trình duyệt, hiển thị cho tôi theo cách này và sau đó quên tôi".Và kể từ khi lập chỉ mục mất một thời gian, tôi nghĩ rằng các trình duyệt quyết định lập chỉ mục loại thuộc tính đầu tiên. – contradictioned

+1

FYI, thuật ngữ "bộ chọn phổ quát" cụ thể đề cập đến bộ chọn '*'. 'a [title =" home "]' không phải là một bộ chọn phổ quát; '[title =" home "]' không có 'a', mặt khác, bạn có thể nói sử dụng một bộ chọn phổ biến * ngầm * vì nó tương đương với' * [title = "home"] '. – BoltClock

Trả lời

3

Trình tối ưu hóa trình duyệt tối ưu hóa các trường hợp phổ biến nhất. Vì các lớp được sử dụng rất thường xuyên để phù hợp với các kiểu, chúng phải thực hiện điều này một cách hiệu quả nhất có thể. Khi họ tải trong CSS, họ lập chỉ mục các lớp để làm điều này có thể.

Vì bộ chọn ngẫu nhiên như title="home" không được sử dụng thường xuyên, chúng có thể lấy đi bằng cách thực hiện chúng bằng cách sử dụng tìm kiếm đơn giản hơn. Nó sẽ không có tác động nhiều đến hiệu suất, bởi vì nó hiếm khi được sử dụng.

Các lớp học cũng yêu cầu xử lý đặc biệt trong trình duyệt, bởi vì một phần tử có thể có nhiều lớp, ví dụ: class="foo bar baz". Khi phân tích cú pháp tài liệu, trình duyệt cần chia nhỏ tài liệu này để nó có thể khớp với bất kỳ trình duyệt nào trong số đó đối với bộ chọn CSS.

+0

Vì vậy, câu trả lời của bạn về cơ bản, các trình duyệt hiện đại tạo các chỉ mục cho các lớp, nhưng không phải cho bất kỳ các thuộc tính khác. Do đó sử dụng bất kỳ thuộc tính nào khác hơn thuộc tính lớp sẽ có chậm hơn? – corgrath

+0

Có. Các lớp và ID được sử dụng trong bộ chọn, vì vậy chúng đã được tối ưu hóa cho việc sử dụng đó. – Barmar

+1

Lưu ý rằng vì lý do này, việc sử dụng bộ chọn thuộc tính để khớp với thuộc tính 'class' không được tối ưu hóa. (Ngoài ra, nếu bạn đang sử dụng bộ chọn thuộc tính để khớp với tên lớp, có thể bạn đang cố gắng kết hợp bằng tiêu chí đặc biệt không thể đạt được với bộ chọn lớp.) – BoltClock

0

Benchmark

Kết luận

Trong selector thuộc tính hầu hết trường hợp' với thuộc tính không rõ, ví dụ [a = "b"] 'và' công cụ chọn thuộc tính có thuộc tính đã biết, ví dụ: [title = "a"] 'xuất hiện trong danh mục' 3 tệ nhất '. Thật an toàn khi nói rằng bạn nên tránh những bộ chọn đó.

+0

Tại sao bạn thử nghiệm các phiên bản trình duyệt cũ như vậy? – Barmar

+0

@Barmar: Anh ấy không phải là người đã viết những bài kiểm tra này. Steve Souders đã làm. Bài viết mà biểu đồ được lấy từ được viết cách đây 4 năm. – BoltClock

+0

Cả hai trang thử nghiệm đều không sử dụng các công cụ chọn như 'a [title =" home "]'. – Barmar

Các vấn đề liên quan