SnappySnippet
Saya akhirnya menemukan waktu untuk membuat alat ini. Anda dapat menginstal SnappySnippet dari Github. Ini memungkinkan ekstraksi HTML + CSS mudah dari node DOM yang ditentukan (terakhir diperiksa). Selain itu, Anda dapat mengirim kode langsung ke CodePen atau JSFiddle. Nikmati!
Fitur lainnya
- membersihkan HTML (menghapus atribut yang tidak perlu, memperbaiki indentasi)
- mengoptimalkan CSS agar dapat dibaca
- sepenuhnya dapat dikonfigurasi (semua filter dapat dimatikan)
- bekerja dengan
::before
dan ::after
pseudo-elements
- UI yang bagus berkat proyek Bootstrap & Flat-UI
Kode
SnappySnippet adalah open source, dan Anda dapat menemukan kode di GitHub .
Penerapan
Karena saya telah belajar cukup banyak saat membuat ini, saya memutuskan untuk berbagi beberapa masalah yang saya alami dan solusi saya untuk mereka, mungkin seseorang akan menganggapnya menarik.
Upaya pertama - getMatchedCSSRules ()
Pada awalnya saya sudah mencoba mengambil aturan CSS asli (berasal dari file CSS di situs web). Cukup luar biasa, ini berkat sangat sederhana window.getMatchedCSSRules()
, namun, itu tidak berhasil dengan baik. Masalahnya adalah bahwa kami hanya mengambil sebagian dari pemilih HTML dan CSS yang cocok dengan konteks keseluruhan dokumen, yang tidak cocok lagi dalam konteks cuplikan HTML. Karena memilih dan memodifikasi penyeleksi sepertinya bukan ide yang bagus, saya menyerah pada upaya ini.
Upaya kedua - getComputedStyle ()
Kemudian, saya mulai dari sesuatu yang disarankan oleh @CollectiveCognition - getComputedStyle()
. Namun, saya benar-benar ingin memisahkan bentuk CSS HTML daripada mengurutkan semua gaya.
Masalah 1 - memisahkan CSS dari HTML
Solusinya di sini tidak terlalu indah tetapi cukup mudah. Saya telah menetapkan ID untuk semua node di subtree yang dipilih dan menggunakan ID itu untuk membuat aturan CSS yang tepat.
Masalah 2 - menghapus properti dengan nilai default
Menetapkan ID ke node bekerja dengan baik, namun saya menemukan bahwa setiap aturan CSS saya memiliki ~ 300 properti yang membuat keseluruhan CSS tidak dapat dibaca.
Ternyata yang getComputedStyle()
mengembalikan semua kemungkinan properti CSS dan nilai yang dihitung untuk elemen yang diberikan. Beberapa di antaranya kosong, beberapa memiliki nilai default browser. Untuk menghapus nilai default, saya harus mendapatkannya dari browser terlebih dahulu (dan setiap tag memiliki nilai default yang berbeda). Solusinya adalah membandingkan gaya elemen yang berasal dari situs web dengan elemen yang sama dimasukkan ke dalam kosong <iframe>
. Logikanya di sini adalah bahwa tidak ada style sheet di tempat yang kosong <iframe>
, jadi setiap elemen yang saya tambahkan di sana hanya memiliki style browser default. Dengan cara ini saya bisa menyingkirkan sebagian besar properti yang tidak signifikan.
Masalah 3 - hanya menyimpan properti steno
Hal berikutnya yang saya lihat adalah bahwa properti yang memiliki padanan steno setara tidak perlu dicetak (misalnya ada border: solid black 1px
dan kemudian border-color: black;
, border-width: 1px
itd.).
Untuk mengatasi ini, saya cukup membuat daftar properti yang memiliki padanan yang singkat dan menyaringnya dari hasilnya.
Masalah 4 - menghapus properti awalan
Jumlah properti di setiap aturan secara signifikan menurunkan setelah operasi sebelumnya, tapi aku telah menemukan bahwa saya Sill memiliki banyak -webkit-
sifat diawali bahwa saya belum pernah mendengar dari ( -webkit-app-region
? -webkit-text-emphasis-position
?).
Saya bertanya-tanya apakah saya harus menyimpan salah satu dari properti ini karena beberapa di antaranya tampak berguna ( -webkit-transform-origin
, -webkit-perspective-origin
dll.). Saya belum menemukan cara memverifikasi ini, dan karena saya tahu bahwa sebagian besar waktu properti ini hanya sampah, saya memutuskan untuk menghapus semuanya.
Masalah 5 - menggabungkan aturan CSS yang sama
Masalah berikutnya yang saya temukan adalah bahwa aturan CSS yang sama diulang berulang kali (misalnya untuk masing-masing <li>
dengan gaya yang sama persis ada aturan yang sama dalam output CSS dibuat).
Ini hanya masalah membandingkan aturan satu sama lain dan menggabungkan ini yang memiliki set properti dan nilai yang persis sama. Alhasil, bukannya #LI_1{...}, #LI_2{...}
saya dapatkan #LI_1, #LI_2 {...}
.
Masalah 6 - membersihkan dan memperbaiki lekukan HTML
Karena saya senang dengan hasilnya, saya pindah ke HTML. Itu tampak berantakan, sebagian besar karena outerHTML
properti menjaganya tetap diformat persis seperti yang dikembalikan dari server.
Satu-satunya hal yang diambil dari kode HTML outerHTML
adalah pemformatan ulang kode sederhana. Karena ini adalah sesuatu yang tersedia di setiap IDE, saya yakin ada perpustakaan JavaScript yang melakukan hal itu. Dan ternyata saya benar (jquery-clean) . Terlebih lagi, saya mendapatkan ekstra penghapusan atribut yang tidak perlu ( style
, data-ng-repeat
dll.).
Soal 7 - filter melanggar CSS
Karena ada kemungkinan bahwa dalam beberapa keadaan filter yang disebutkan di atas dapat merusak CSS di snippet, saya telah membuat semuanya opsional. Anda dapat menonaktifkannya dari menu Pengaturan .