Jebakan properti CSS khusus

Stas Melnikov, penulis kursus HTML Layout HTML, berbicara tentang nuansa yang dapat menyulitkan pekerjaan dengan properti CSS kustom.

Aturan Sintaks Nama Properti Kustom


Kami terbiasa dengan fakta bahwa properti CSS sebaris tidak peka terhadap huruf besar-kecil. Oleh karena itu, metode berikut untuk mendeklarasikan properti border akan memberikan hasil yang sama:

 button { BORDER: 2px solid #800080; } button { border: 2px solid #800080; } 

Properti khusus, sebaliknya, peka terhadap huruf besar-kecil, jadi contoh berikut membuat dua properti khusus yang berbeda:

 button { --NETOLOGY-BRAND-COLOR: #800080; --netology-brand-color: #27ae60;   border: 2px solid var(--NETOLOGY-BRAND-COLOR); color: var(--netology-brand-color); } 



Sekarang bingkai telah menjadi # 800080 (ungu), dan teks telah menjadi # 27ae60 (hijau).

Nilai Valid untuk Properti Kustom


Untuk properti CSS biasa, Anda hanya dapat menetapkan nilai yang diizinkan oleh standar. Menurut standar properti khusus, setiap nilai CSS valid yang ada dapat digunakan sebagai nilai. Misalnya, seperti semua properti khusus berikut:

 .element::before { --color: rgba(0, 0, 0, 1); --hex: #000000; --value: 20px; --number: 3; --text: "Hey, what's up?"; --keyword: currentColor; } 

Misalnya, mari kita mengatur bingkai dengan warna # 800080 untuk tombol:

 button { --netologyBrandColor: #800080; border-width: 2px; border-style: solid; border-color: var(--netologyBrandColor); } 



Selain nilai standar, Anda dapat menetapkan satu properti khusus sebagai nilai untuk yang lain.

 button { --netologyBrandColor: #800080; --buttonBorderColor: var(--netologyBrandColor); border-width: 2px; border-style: solid; border-color: var(--buttonBorderColor); } 

Hasilnya tidak berbeda dari yang sebelumnya, dan tombol masih memiliki bingkai dengan warna # 800080.

Jika properti khusus --netologyBrandColor memiliki nilai yang salah untuk properti border-color , misalnya 18px, maka bingkai akan berubah menjadi hitam.

 button { --netologyBrandColor: 18px;  --buttonBorderColor: var(--netologyBrandColor); border-width: 2px; border-style: solid; border-color: var(--buttonBorderColor); } 



Faktanya adalah bahwa sebelum browser menerapkan nilai properti pengguna untuk properti bawaan, ia akan memeriksa kebenarannya. Jika nilai tersedia untuk properti inline, browser akan menerapkannya. Jika tidak, ini akan menetapkan nilai default untuk properti bawaan.

Dalam kasus kami, 18px adalah nilai yang salah untuk properti border-color bawaan, dan oleh karena itu browser akan menetapkan nilai default, yaitu currentColor . Ini sangat mudah diverifikasi dengan menyetel properti color ke # 800080:

 button { --netologyBrandColor: 18px;  --buttonBorderColor: var(--netologyBrandColor); border-width: 2px; border-style: solid; border-color: var(--buttonBorderColor); color: #800080; } 



Seperti yang Anda lihat, browser menerapkan nilai # 800080 untuk bingkai. Dalam contoh ini, saya menggunakan sintaks lengkap untuk mengatur bingkai. Tapi kita bisa menggunakan yang pendek, yaitu properti border .

 button { --netologyBrandColor: 18px;  --buttonBorderColor: var(--netologyBrandColor); border: 2px solid var(--buttonBorderColor); color: #800080; } 



Di sini kita menunggu nuansa lain. Ada bagian terpisah dalam standar yang menjelaskan perilaku properti khusus dalam situasi seperti itu. Menurutnya, jika properti pengguna memiliki nilai yang salah untuk properti inline, maka properti pengguna ini tidak valid, sehingga browser akan mengabaikan properti inline.

Dalam contoh kami, properti border --buttonBorderColor memiliki salah satu nilai yang disetel ke properti khusus --buttonBorderColor dengan nilai 18px yang tidak valid. Menurut algoritma yang dijelaskan, browser hanya mengabaikan properti border , sehingga elemen kehilangan perbatasan.

Nilai default untuk properti khusus


Ketika kami melihat contoh fungsi var , kami hanya menggunakan satu parameter - nama properti khusus.

 button { --netologyBrandColor: #800080; border: 2px solid var(--netologyBrandColor); color: var(--netologyBrandColor); } button:hover { --netologyBrandColor: #27ae60; } 

Tapi selain itu, fungsi var dapat menerima yang kedua - nilai default. Untuk mendeklarasikan nilai default, Anda harus memberi koma setelah nama properti kustom dan menulis nilai itu sendiri.


Ketika browser menyadari bahwa pengembang belum mendeklarasikan nilai untuk properti kustom, itu menggunakan nilai default. Misalnya, nilai # 800080 (ungu) untuk properti khusus adalah --netologyBrandColor .

 button { border: 2px solid var(--netologyBrandColor, #800080); color: var(--netologyBrandColor, #800080); } button:hover { --netologyBrandColor: #27ae60; } 



Kami melihat bingkai dan teks menjadi ungu. Tetapi jika Anda memindahkan tombol, mereka akan berubah menjadi hijau. Ini menunjukkan bahwa browser menerapkan nilai # 27ae60 ke properti pengguna, sehingga mengganti nilai default.

Tapi ini tidak semua kemungkinan fungsi var . Pada contoh sebelumnya, properti kustom --netologyBrandColor digunakan dua kali, masing-masing, jadi saya menetapkan nilai default dua kali.

Tetapi itu bisa dilakukan secara berbeda. Fungsi var memungkinkan Anda untuk melewati fungsi var lain, sehingga Anda dapat mengatur properti kustom lain sebagai nilai default. Saya akan menulis ulang contoh sebelumnya menggunakan properti khusus --defaultButtonColor :

 button { --defaultButtonColor: #800080; border: 2px solid var(--netologyBrandColor, var(--defaultButtonColor)); color: var(--netologyBrandColor, var(--defaultButtonColor)); } button:hover { --netologyBrandColor: #27ae60; } 

Secara lahiriah, hasilnya tidak akan berubah. Tetapi sekarang untuk mengubah nilai default, Anda perlu melakukan ini hanya di satu tempat, dan tidak di beberapa tempat, seperti sebelumnya.

Warisan sifat khusus


CSS memiliki mekanisme pewarisan yang memungkinkan elemen untuk mewarisi properti dari elemen induk. Dalam hal ini, properti khusus tidak berbeda dari mereka. Sebagai contoh, saya akan menulis kode di mana properti kustom --netologyBrandColor diwarisi dari elemen body induk.

 body { --netologyBrandColor: #800080; } button { border: 2px solid var(--netologyBrandColor); color: var(--netologyBrandColor); } </td></tr> 



Melihat inspektur, Anda dapat melihat tulisan "Warisan dari tubuh", yang menunjukkan kepada kita bahwa properti khusus diambil dari elemen body . Tetapi jika kita menambahkan properti khusus --netologyBrandColor untuk elemen button , maka itu sudah menimpa properti dari elemen body .

 body { --netologyBrandColor: #800080; } button { --netologyBrandColor: #27ae60; border: 2px solid var(--netologyBrandColor); color: var(--netologyBrandColor); } 



Inspektur menunjukkan bahwa properti khusus --netologyBrandColor elemen button menimpa properti --netologyBrandColor , yang kami tentukan untuk elemen body .

Nilai global


Dalam standar CSS, Properti Kustom memperkenalkan pseudo- root khusus yang memungkinkan Anda untuk menentukan properti kustom yang berlaku untuk elemen root dokumen. Misalnya, dalam dokumen HTML untuk elemen html .

 :root { --netologyBrandColor: #800080; } button { border: 2px solid var(--netologyBrandColor); color: var(--netologyBrandColor); } 



Di inspektur, kita dapat melihat bahwa properti khusus yang dideklarasikan diterapkan ke elemen html. Tetapi, di samping dokumen HTML, pseudo- root berfungsi dalam dokumen SVG. Misalnya, saya akan mendeklarasikan properti khusus dalam tag style .

 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 26 28" width="50" height="50">   <style>       :root{           --iconColor: #ffcc00;           --iconStroke: #000000;           --iconStrokeWidth: 2px;       }   </style>   <path stroke="var(--iconStroke)"         stroke-width="var(--iconStrokeWidth)"         fill="var(--iconColor)"         d="M26 10.109c0 .281-.203.547-.406.75l-5.672 5.531 1.344 7.812c.016.109.016.203.016.313 0 .406-.187.781-.641.781a1.27 1.27 0 0 1-.625-.187L13 21.422l-7.016 3.687c-.203.109-.406.187-.625.187-.453 0-.656-.375-.656-.781 0-.109.016-.203.031-.313l1.344-7.812L.39 10.859c-.187-.203-.391-.469-.391-.75 0-.469.484-.656.875-.719l7.844-1.141 3.516-7.109c.141-.297.406-.641.766-.641s.625.344.766.641l3.516 7.109 7.844 1.141c.375.063.875.25.875.719z"/> </svg> 



Dan di sini kita melihat bahwa pseudo- root root telah ditambahkan ke elemen root SVG. Dengan demikian, ini membuktikan bahwa pseudo-class root tidak hanya berlaku untuk tag html , tetapi juga untuk elemen root apa pun.

Kesimpulan


Dalam artikel ini, kami bertemu dengan perangkap properti khusus yang dapat membingungkan. Dan karenanya, kita dapat mulai menggunakannya. Karena itu, pada artikel selanjutnya saya akan berbicara tentang trik praktis yang saya gunakan dalam proyek saya.

Dari para editor


Mata kuliah Netologi dengan topik:

Source: https://habr.com/ru/post/id435654/


All Articles