Hướng dẫn which css property will trigger layout recalculation - thuộc tính css nào sẽ kích hoạt tính toán lại bố cục

Những gì lực lượng bố trí/reflow. Danh sách toàn diện.

Tất cả các thuộc tính hoặc phương thức dưới đây, khi được yêu cầu/gọi trong JavaScript, sẽ kích hoạt trình duyệt để tính toán đồng bộ kiểu và bố cục*. Điều này cũng được gọi là phản xạ hoặc bố cục đập, và là nút cổ chai hiệu suất phổ biến.

Nói chung, tất cả các API cung cấp đồng bộ các số liệu bố trí sẽ kích hoạt phản xạ / bố cục bắt buộc. Đọc về các trường hợp và chi tiết bổ sung.

API phần tử

Nhận số liệu hộp
  • elem.offsetLeft, elem.offsetTop, elem.offsetWidth, elem.offsetHeight, elem.offsetParent
  • elem.clientLeft, elem.clientTop, elem.clientWidth, elem.clientHeight
  • elem.getClientRects[], elem.offsetTop0
Cuộn công cụ
  • elem.offsetTop1, elem.offsetTop2
  • elem.offsetTop3, elem.offsetTop4
  • elem.offsetTop5, elem.offsetTop6
  • elem.offsetTop7, elem.offsetTop8 cũng vậy, đặt chúng
Đặt trọng tâm
  • elem.offsetTop9 [nguồn]
Cũng thế…
  • elem.offsetWidth0, elem.offsetWidth1
  • elem.offsetWidth2 [nguồn]

Nhận kích thước cửa sổ

  • elem.offsetWidth3, elem.offsetWidth4
  • elem.offsetWidth5, elem.offsetWidth6
  • window.VisualViewPort.height / width / offsetTop / offsetleft [nguồn]

tài liệu

  • elem.offsetWidth7 chỉ có phong cách lực lượng
  • elem.offsetWidth8

Biểu mẫu: Cài đặt lựa chọn + tiêu điểm

  • elem.offsetWidth9
  • elem.offsetHeight0, elem.offsetHeight1

Sự kiện chuột: Đọc dữ liệu bù

  • elem.offsetHeight2, elem.offsetHeight3, elem.offsetHeight4, elem.offsetHeight5 [nguồn]

Gọi getComputedStyle []

elem.offsetHeight6 thường sẽ buộc Style Recalc.

elem.offsetHeight6 thường sẽ buộc bố cục.

Chi tiết về các điều kiện mà GCS [] buộc phải bố trí

elem.offsetHeight6 sẽ buộc bố cục trong một trong 3 điều kiện:

  1. Phần tử nằm trong một cây bóng tối
  2. Có các truy vấn truyền thông [liên quan đến chế độ xem]. Cụ thể, một trong những điều sau đây: [nguồn
    • elem.offsetHeight9, elem.offsetParent0, elem.offsetParent1, elem.offsetParent2, elem.offsetParent3, elem.offsetParent4
    • elem.offsetParent5, elem.offsetParent6, elem.offsetParent7
    • elem.offsetParent8, elem.offsetParent9, elem.clientLeft0, elem.clientLeft1, elem.clientLeft2
  3. Tài sản được yêu cầu là một trong những điều sau: [Nguồn]
    • elem.offsetParent4, elem.offsetParent3
    • elem.clientLeft5, elem.clientLeft6, elem.clientLeft7, elem.clientLeft8
    • elem.clientLeft9 [elem.clientTop0, elem.clientTop1, elem.clientTop2, elem.clientTop3 hoặc tốc ký] chỉ khi lề được sửa.
    • elem.clientTop4 [elem.clientTop0, elem.clientTop1, elem.clientTop2, elem.clientTop3 hoặc tốc ký] chỉ khi phần đệm được cố định.
    • elem.clientTop9, elem.clientWidth0, elem.clientWidth1
    • elem.clientWidth2, elem.clientWidth3, elem.clientWidth4
    • elem.clientWidth5, elem.clientWidth6, elem.clientWidth7, elem.clientWidth8
    • elem.clientWidth1
    • Các mục này trước đây có trong danh sách nhưng dường như không còn nữa [kể từ tháng 2 năm 2018]: elem.clientHeight0, elem.clientHeight1, elem.clientHeight2, elem.clientHeight3, elem.clientHeight4, elem.clientHeight5, elem.clientHeight6

Nhận kích thước elem.clientHeight7

  • elem.clientHeight8, elem.clientHeight9

SVG

Khá nhiều thuộc tính/phương thức lực lượng, nhưng tôi đã không lập một danh sách đầy đủ. Danh sách này không đầy đủ:

  • SVGlocatable: elem.getClientRects[]0, elem.getClientRects[]1
  • SvgtextContent: elem.getClientRects[]2, elem.getClientRects[]3, elem.getClientRects[]4, elem.getClientRects[]5, elem.getClientRects[]6, elem.getClientRects[]7, elem.getClientRects[]8, elem.getClientRects[]9, elem.offsetTop00
  • SVGUSE: elem.offsetTop01

Sử dụng "liên kết cây nguồn crom" bên dưới để tự mình khám phá!

hài lòng

  • Rất nhiều thứ và rất nhiều thứ, bao gồm cả sao chép hình ảnh vào bảng tạm [nguồn]

* Ruột thừa

  • Reflow chỉ có chi phí nếu tài liệu đã thay đổi và vô hiệu hóa kiểu hoặc bố cục. Thông thường, điều này là do DOM đã được thay đổi [các lớp được sửa đổi, các nút được thêm/loại bỏ, thậm chí thêm một psuedo-class như: Focus].
  • Nếu bố cục bị ép buộc, phong cách phải được tính toán lại trước. Vì vậy, bố cục bắt buộc kích hoạt cả hai hoạt động. Chi phí của họ rất phụ thuộc vào nội dung/tình huống, nhưng thông thường cả hai hoạt động đều tương tự nhau về chi phí.
  • Bạn nên làm gì về tất cả những điều này? Chà, phần elem.offsetTop02 bên dưới bao gồm mọi thứ chi tiết hơn, nhưng phiên bản ngắn là:
    1. elem.offsetTop03 Các vòng lặp buộc bố trí và thay đổi DOM là điều tồi tệ nhất, tránh chúng.
    2. Sử dụng bảng hiệu suất của DevTools để xem điều này xảy ra ở đâu. Bạn có thể ngạc nhiên khi thấy tần suất mã ứng dụng và mã thư viện của bạn đạt được điều này.
    3. Batch ghi của bạn và đọc cho DOM [thông qua Fastdom hoặc triển khai DOM ảo]. Đọc các số liệu của bạn ở đầu khung hình [rất bắt đầu elem.offsetTop04, trình xử lý cuộn, v.v.], khi các số vẫn giống hệt với bố cục lần cuối cùng được thực hiện.

Dòng thời gian của Người bảo vệ. Outbrain đang buộc bố trí nhiều lần, có lẽ trong một vòng lặp.Cross-browser
  • Dữ liệu trên được xây dựng bằng cách đọc nguồn nhấp nháy, vì vậy nó đúng với Chrome, Opera, Brave, Edge và hầu hết các trình duyệt Android. Bạn có thể tự mình duyệt chúng trong cây nguồn crom.
  • Danh sách kích hoạt bố cục của Tony Gentilcore là cho Webkit năm 2011 và thường phù hợp với các điều trên.
  • Các trường hợp của Webkit về bố cục bắt buộc của Webkit chủ yếu là nhất quán: elem.offsetTop05 - Tìm kiếm GitHub - WebKit/WebKit
  • REPECKO của Gecko dường như được yêu cầu thông qua Frameneedsreflow. Kết quả: elem.offsetTop06 - Mozilla -Central Searchfox
  • Không có dữ liệu cụ thể nào trên IE hoặc edgehtml, nhưng chúng có thể gần giống nhau, vì các giá trị trả về cho các thuộc tính này là cụ thể.

Thêm về bố cục bắt buộc

  • Tránh bố cục đập - các nguyên tắc cơ bản web là tài nguyên tốt nhất để xác định và sửa chữa chủ đề này. The best resource on identifying and fixing this topic.
  • CSS Kích hoạt - bao gồm những gì các hoạt động được yêu cầu là kết quả của việc cài đặt/thay đổi giá trị CSS đã cho. Tuy nhiên, danh sách trên là tất cả về những gì buộc các vòng tròn màu tím/xanh lá cây/darkgreen đồng bộ từ JavaScript.
  • Khắc phục bố cục đập vào thế giới thực | Matt Andrew
  • Demo Demo: Chẩn đoán Bố cục đồng bộ bắt buộc - Google Chrome
  • Ngăn chặn 'Bố cục Thrashing' | Trang Wilson
  • wilsonpage/fastdom
  • Kết xuất: Đóng lại, Reflow / Relayout, Restyle / Stoyan
  • Chúng tôi đã dành một tuần để làm cho bảng Trello tải cực kỳ nhanh. Đây là cách chúng tôi đã làm điều đó. - Blog Fog Creek
  • Giảm thiểu trình duyệt refereSer & nbsp; | & nbsp; Pagespeed Insights & nbsp; | & nbsp; Nhà phát triển Google
  • Tối ưu hóa nội dung web trong UIWebView và trang web trên iOS
  • Kết xuất tăng tốc trong chrome
  • Hiệu suất web cho sự tò mò
  • Jank miễn phí

Cập nhật một chút vào tháng 4 năm 2020. Liên kết CodeSearch và một vài thay đổi đối với các thuộc tính phần tử có liên quan.

Điều gì gây ra sự tính toán lại phong cách?

Thay đổi DOM, thông qua việc thêm và loại bỏ các phần tử, thay đổi thuộc tính, lớp hoặc thông qua hoạt hình, đều sẽ khiến trình duyệt tính toán lại các kiểu phần tử và, trong nhiều trường hợp, bố cục [hoặc refl] trang hoặc các phần của nó. Quá trình này được gọi là tính toán phong cách tính toán., will all cause the browser to recalculate element styles and, in many cases, layout [or reflow] the page, or parts of it. This process is called computed style calculation.

Điều gì kích hoạt một phản xạ?

Thay đổi kích thước cửa sổ trình duyệt, sử dụng các phương thức JavaScript liên quan đến các kiểu được tính toán, thêm hoặc loại bỏ các phần tử khỏi DOM và thay đổi các lớp của một phần tử là một vài trong số những thứ có thể kích hoạt Refle. are a few of the things that can trigger reflow.

Điều gì kích hoạt một bản sơn lại?

Một bản sơn lại xảy ra khi các thay đổi được thực hiện đối với một yếu tố da thay đổi rõ ràng, nhưng không ảnh hưởng đến bố cục của nó.Ví dụ về điều này bao gồm phác thảo, khả năng hiển thị, nền hoặc màu sắc.changes are made to an elements skin that changes visibly, but do not affect its layout. Examples of this include outline , visibility , background , or color .

Điều gì gây ra sự kết hợp bố trí?

Bố cục đập vỡ xảy ra khi chúng tôi thực hiện một loạt các lần đọc và ghi liên tiếp vào DOM, trong quá trình không cho phép trình duyệt thực hiện tối ưu hóa bố cục.Thay đổi các thuộc tính của một phần tử hoặc sửa đổi nội dung của nó không chỉ ảnh hưởng đến yếu tố đó;Thay vào đó, nó có thể gây ra một loạt các thay đổi.when we perform a series of consecutive reads and writes to DOM, in the process not allowing the browser to perform layout optimizations. Changing attributes of one element or modifying its content doesn't affect only that element; instead, it can cause a cascade of changes.

Bài Viết Liên Quan

Chủ Đề