Alat Petak CSS di DevTools

Changhao Han
Changhao Han

Mengapa kami membuat Alat Petak CSS?

Petak CSS adalah sistem tata letak CSS yang sangat canggih yang memungkinkan developer web membuat tata letak dua dimensi yang kompleks dan menetapkan aturan tentang bagaimana setiap item turunan dalam petak berukuran, disejajarkan, dan diurutkan. CSS Grid diperkenalkan setelah Flexbox menjadi populer, dan jika digabungkan, CSS dapat membantu developer memperoleh desain responsif yang lebih baik tanpa peretasan penyelarasan yang rumit atau tata letak yang dibantu JavaScript.

Sebagai sistem tata letak yang relatif baru, Petak CSS juga sulit untuk dilakukan dengan benar. Sintaksisnya cukup serbaguna (cukup cari contekan petak), ada banyak cara untuk mendapatkan tata letak yang sama, dan ukuran yang fleksibel serta jalur implisit mempersulit untuk memahami mengapa tata letak berfungsi atau tidak berperilaku sebagaimana mestinya. Inilah sebabnya kami menyediakan alat Grid CSS khusus di DevTools, sehingga developer bisa memiliki pemahaman yang lebih baik tentang apa yang dilakukan kode CSS mereka, dan cara mendapatkan tata letak yang tepat.

Desain alat

Upaya bersama antara Chrome dan Edge

Alat Grid CSS menarik perhatian dari Chrome DevTools dan Edge DevTools. Kami memutuskan untuk berkolaborasi dari awal. Kami berbagi sumber daya produk, teknik, dan desain dari kedua tim, dan berkoordinasi setiap minggu untuk mewujudkannya.

Ringkasan fitur

Ada tiga fitur utama untuk alat Petak CSS:

  1. Overlay persisten dengan petak yang membantu informasi dimensi dan pengurutan
  2. Badge di Pohon DOM yang menandai penampung Petak CSS dan mengalihkan overlay Petak
  3. Panel sidebar yang memungkinkan developer mempersonalisasi tampilan overlay DOM (misalnya, mengubah warna dan lebar aturan)
  4. Editor Petak CSS di panel Styles

Selanjutnya, mari kita bahas lebih lanjut.

Overlay persisten petak

Di DevTools, overlay adalah instrumen canggih yang menyediakan informasi tata letak dan gaya dari elemen individual:

ALT_TEXT_HERE

Informasi tambahan ini ditumpangkan di atas elemen minat. Sebelumnya, saat Anda mengarahkan kursor ke atas Grid dengan DevTools terbuka, overlay tersebut menampilkan informasi model kotaknya, tetapi membatasi konten yang menyoroti ke item petak tanpa menjelaskan mengapa hal ini terjadi. Ada dua bagian utama yang ingin kami tambahkan untuk overlay Petak CSS:

  • kami ingin menampilkan informasi yang lebih bermanfaat tentang Petak, misalnya dimensi dan celah yang ditulis
  • kita ingin membuat overlay-nya melekat, sehingga kita dapat melihat beberapa {i>Grid<i} secara bersamaan, dan kita dapat melihat overlay yang memperbarui informasi Grid saat kita mengubah gaya elemen

Mari kita lihat cara kita mencapai keduanya.

Ukuran yang ditulis vs. ukuran yang dikomputasi

Salah satu bagian yang sulit tentang men-debug Petak CSS adalah banyak cara untuk menentukan ukuran jalur petak. Misalnya, Anda dapat menggunakan kombinasi nilai piksel, nilai persentase, pecahan, fungsi berulang, dan fungsi minmax untuk membuat ukuran trek serbaguna:

.grid-cards {
    display: grid;
    width: 200px;
    height: 300px;
    grid-template-rows: 20% 0.3fr 100px minmax(100px, auto);
    grid-template-columns: repeat(3, minmax(200px, 1fr));
}

Namun, akan sulit untuk memetakan ukuran trek yang ditulis ini ke ukuran trek terkomputasi yang telah dihitung browser untuk kami. Untuk menjembatani kesenjangan ini, kami menempatkan dua informasi ini secara berdampingan di overlay:

ALT_TEXT_HERE

String sebelum titik adalah nilai yang ditulis, dan string setelah titik mewakili nilai sebenarnya yang dihitung.

Sebelumnya, DevTools tidak memiliki kemampuan untuk mendapatkan nilai yang ditulis. Secara teori, kita bisa menguraikan sendiri nilai-nilai yang ditulis di DevTools dan menghitungnya sesuai dengan spesifikasi Petak CSS. Ini akan melibatkan banyak skenario rumit, dan pada dasarnya hanya akan menjadi duplikasi dari upaya Blink. Oleh karena itu, dengan bantuan dari tim Gaya Blink, kami mendapatkan API baru dari mesin gaya yang menampilkan “nilai bertingkat”. Nilai menurun adalah nilai efektif akhir, setelah CSS menurun, untuk properti CSS. Ini adalah nilai yang menang setelah mesin gaya menyusun semua stylesheet, tetapi sebelum benar-benar menghitung nilai apa pun, misalnya persentase, pecahan, dll.

Sekarang kami menggunakan API ini untuk menampilkan nilai yang ditulis dalam overlay petak.

Overlay persisten

Sebelum alat CSS Grid, overlay di DevTools cukup jelas: Anda mengarahkan kursor pada elemen, baik di panel DOM Tree DevTools, atau langsung di halaman yang diperiksa, dan Anda akan melihat overlay yang menjelaskan elemen ini. Anda melayang, dan overlay tersebut menghilang. Untuk overlay Petak, kami menginginkan sesuatu yang berbeda: beberapa Petak dapat disorot secara bersamaan, dan overlay Petak dapat tetap aktif sementara overlay on-hover reguler masih berfungsi.

Contoh:

ALT_TEXT_HERE

Namun, overlay di DevTools tidak dirancang dengan mempertimbangkan mekanisme multi-elemen dan persisten (dibuat bertahun-tahun yang lalu). Oleh karena itu, kami harus memfaktorkan ulang desain overlay agar berfungsi. Kami menambahkan GridHighlightTool baru ke dalam rangkaian alat penanda yang sudah ada, yang kemudian berkembang menjadi PersistentTool global untuk menyoroti semua overlay persisten secara bersamaan. Untuk setiap jenis overlay persisten (Grid, Flex, dll.), kami menyimpan kolom konfigurasi masing-masing di dalam alat persisten. Setiap kali penyorot overlay memeriksa apa yang akan digambar, konfigurasi ini juga akan disertakan.

Agar DevTools mengontrol apa yang perlu disorot, kami membuat perintah CDP baru untuk overlay persisten Grid:

# Highlight multiple elements with the CSS Grid overlay.
command setShowGridOverlays
  parameters
    # An array of node identifiers and descriptors for the highlight appearance.
    array of GridNodeHighlightConfig gridNodeHighlightConfigs

dengan setiap GridNodeHighlightConfig berisi informasi tentang node mana yang akan digambar, dan cara menggambarnya. Dengan begitu, kami dapat menambahkan mekanisme persisten multi-item tanpa memutus perilaku pengarahan kursor saat ini.

Badge Petak real-time

Untuk membantu developer mengaktifkan dan menonaktifkan overlay Grid dengan mudah, kami memutuskan untuk menambahkan badge kecil di sebelah container Grid di DOM Tree. Lencana ini juga dapat membantu developer mengidentifikasi penampung Grid di struktur DOM mereka.

ALT_TEXT_HERE

Perubahan pada Hierarki DOM

Karena badge Grid bukan satu-satunya badge yang ingin kami tampilkan di Hierarki DOM, kami ingin membuat penambahan badge semudah mungkin. ElementsTreeElement, class yang bertanggung jawab untuk membuat dan mengelola elemen Pohon DOM individual di DevTools, telah diupdate dengan beberapa metode publik baru untuk mengonfigurasi badge. Jika ada beberapa lencana untuk satu elemen, lencana tersebut akan diurutkan menurut kategori lencana, diikuti dengan nama menurut abjad jika berada dalam kategori yang sama. Kategori yang tersedia termasuk Security, Layout, dll., dan Grid termasuk dalam kategori Layout.

Selain itu, kami memiliki dukungan aksesibilitas bawaan sejak awal. Setiap badge interaktif wajib untuk memberikan aria-label default dan aktif, sedangkan badge hanya baca menggunakan nama badge sebagai aria-label.

Bagaimana cara mendapatkan pembaruan gaya secara real-time?

Banyak perubahan DOM tercermin di DevTools DOM Tree secara real time. Misalnya, node yang baru ditambahkan muncul secara instan di Pohon DOM, dan nama class yang dihapus juga menghilang secara instan. Kami ingin status badge Petak juga mencerminkan informasi terbaru yang sama. Akan tetapi, hal ini terbukti sulit diterapkan karena tidak ada cara bagi DevTools untuk mendapatkan notifikasi saat elemen yang ditampilkan dalam Pohon DOM mendapatkan pembaruan gaya terkomputasi. Satu-satunya cara untuk mengetahui kapan suatu elemen menjadi atau berhenti menjadi container Grid adalah dengan terus-menerus mengkueri browser untuk mengetahui setiap informasi gaya terbaru elemen. Ini akan mahal terlarang.

Untuk memudahkan front end mengetahui saat suatu elemen diperbarui gayanya, kami menambahkan metode CDP baru untuk polling pembaruan gaya. Untuk mendapatkan update gaya node DOM, kita mulai dengan memberi tahu browser mengenai deklarasi CSS apa yang ingin dilacak. Dalam kasus badge Grid, kita akan meminta browser untuk melacak:

{
  "display": "grid",
  "display": "inline-grid",
}

Selanjutnya, kita akan mengirim permintaan polling, dan ketika ada pembaruan gaya yang dilacak untuk node DOM di panel Elemen, browser akan mengirimkan daftar node yang diperbarui ke DevTools dan menyelesaikan permintaan polling yang ada. Setiap kali DevTools ingin diberi tahu untuk pembaruan gaya lagi, DevTools dapat mengirim permintaan polling ini, bukan terus-menerus melakukan polling pada backend dari setiap node. DevTools juga dapat mengubah deklarasi CSS yang sedang dilacak dengan mengirimkan daftar baru ke browser.

Panel tata letak

Meskipun badge Pohon DOM membantu visibilitas Petak CSS, terkadang kita ingin melihat daftar semua Petak CSS pada halaman tertentu, dan mengaktifkan dan menonaktifkan overlay persisten dengan mudah untuk men-debug tata letaknya. Oleh karena itu, kami memutuskan untuk membuat panel sidebar khusus hanya untuk alat tata letak. Ini memberi kita ruang khusus untuk mengumpulkan semua container Grid, dan untuk mengonfigurasi semua opsi untuk overlay Grid. Panel Tata Letak ini juga memungkinkan kita menempatkan alat-alat yang sarat tata letak di masa mendatang (misalnya Flexbox, Kueri container) di sini.

Menemukan elemen menurut gaya yang dihitung

Untuk menampilkan daftar penampung Petak CSS di panel Tata Letak, kita perlu menemukan node DOM berdasarkan gaya yang dihitung. Ini juga ternyata tidak mudah, karena tidak semua node DOM diketahui DevTools saat DevTools terbuka. Sebagai gantinya, DevTools hanya mengetahui subset node kecil, biasanya di tingkat teratas hierarki DOM, hanya untuk memulai Pohon DOM Devtools. Untuk alasan performa, node lain hanya akan diambil jika ada permintaan lebih lanjut. Artinya, kita memerlukan perintah CDP baru untuk mengumpulkan semua node di halaman dan memfilternya menurut gaya komputasinya:

# Finds nodes with a given computed style in a subtree.
experimental command getNodesForSubtreeByStyle
  parameters
    # Node ID pointing to the root of a subtree.
    NodeId nodeId
    # The style to filter nodes by (includes nodes if any of properties matches).
    array of CSSComputedStyleProperty computedStyles
    # Whether or not iframes and shadow roots in the same target should be traversed when returning the
    # results (default is false).
    optional boolean pierce
  returns
    # Resulting nodes.
    array of NodeId nodeIds

Ini memungkinkan frontend DevTools mendapatkan daftar container CSS Grid di halaman, mungkin menembus iframe dan shadow root, serta merendernya di panel Layout.

Kesimpulan

Alat Grid CSS adalah salah satu project alat desain DevTools pertama yang mendukung fitur Platform Web. Alat ini memulai debutnya dengan banyak alat mendasar di DevTools, misalnya overlay persisten, badge Pohon DOM, dan panel Tata Letak, serta membuka jalan untuk alat tata letak mendatang di Chrome DevTools seperti kueri Flexbox dan Container. Ini juga meletakkan fondasi untuk editor Grid dan Flexbox, yang memungkinkan developer mengubah keselarasan Grid dan Flexbox dengan cara yang interaktif. Kita akan membahasnya di masa mendatang.

Mendownload saluran pratinjau

Pertimbangkan untuk menggunakan Chrome Canary, Dev, atau Beta sebagai browser pengembangan default Anda. Saluran pratinjau ini memberi Anda akses ke fitur DevTools terbaru, menguji API platform web tercanggih, dan menemukan masalah di situs Anda sebelum pengguna melakukannya.

Menghubungi tim Chrome DevTools

Gunakan opsi berikut untuk membahas fitur dan perubahan baru di postingan ini, atau hal lain yang terkait dengan DevTools.

  • Kirim saran atau masukan kepada kami melalui crbug.com.
  • Laporkan masalah DevTools menggunakan Opsi lainnya   Lainnya   > Bantuan > Laporkan masalah DevTools di DevTools.
  • Tweet di @ChromeDevTools.
  • Tuliskan komentar di video YouTube Yang baru di DevTools atau video YouTube di DevTools.