Element kengligi, balandligi va boshqa geometrik xususiyatlar haqida ma’lumot o’qishga imkon beradigan ko’plab JavaScript xususiyatlari mavjud.
JavaScript da elementlarni ko’chirish yoki joylashtirish paytida bizga ular tez-tez kerak bo’ladi.
Namuna element
Xususiyatlarni namoyish etish uchun namuna element sifatida quyidagini ishlatamiz:
<div id="example">...Matn...</div>
<style>
#example {
width: 300px;
height: 200px;
border: 25px solid #e8c48f;
padding: 20px;
overflow: auto;
}
</style>
Unda chegara, padding va skrolling mavjud. Xususiyatlarning to’liq to’plami. Marjinlar yo’q, chunki ular elementning o’zining qismi emas va ular uchun maxsus xususiyatlar yo’q.
Element quyidagicha ko’rinadi:
Siz hujjatni sandbox da ochishingiz mumkin.
Yuqoridagi rasm elementda skrollbar mavjud bo’lgan eng murakkab holatni ko’rsatadi. Ba’zi brauzerlar (hammasi emas) uni kontent maydonidan olib (yuqorida “kontent kengligi” deb belgilangan) joy ajratadilar.
Shunday qilib, skrollbarsiz kontent kengligi 300px bo’ladi, lekin agar skrollbar 16px keng bo’lsa (kenglik qurilmalar va brauzerlar orasida farq qilishi mumkin), faqat 300 - 16 = 284px qoladi va buni hisobga olishimiz kerak. Shuning uchun ushbu bo’limdagi misollar skrollbar mavjud deb faraz qiladi. Usiz ba’zi hisob-kitoblar oddiyroq.
padding-bottommaydoni matn bilan to’ldirilishi mumkinOdatda paddinglar bizning rasmlarimizda bo’sh ko’rsatiladi, lekin agar elementda juda ko’p matn bo’lsa va u to’lib ketsa, brauzerlar “to’lib ketgan” matnnipadding-bottom da ko’rsatadilar, bu normal holat.
Geometriya
Mana geometrik xususiyatlar bilan umumiy rasm:
Bu xususiyatlarning qiymatlari texnik jihatdan sonlar, lekin bu sonlar “piksellardan” iborat, ya’ni piksel o’lchamlari.
Elementning tashqi qismidan boshlab xususiyatlarni o’rganishni boshlaymiz.
offsetParent, offsetLeft/Top
Bu xususiyatlar kamdan-kam kerak bo’ladi, lekin baribir ular “eng tashqi” geometrik xususiyatlar, shuning uchun ular bilan boshlaymiz.
offsetParent – brauzer rendering paytida koordinatalarni hisoblash uchun foydalanadigan eng yaqin ajdod.
Bu quyidagilardan birining eng yaqin ajdodi:
- CSS-joylashtirilgan (
positionabsolute,relative,fixedyokisticky), yoki <td>,<th>, yoki<table>, yoki<body>.
offsetLeft/offsetTop xususiyatlari offsetParent ning chap yuqori burchagiga nisbatan x/y koordinatalarini beradi.
Quyidagi misolda ichki <div> <main> ni offsetParent sifatida oladi va offsetLeft/offsetTop uning chap yuqori burchagidan (180) siljiydi:
<main style="position: relative" id="main">
<article>
<div id="example" style="position: absolute; left: 180px; top: 180px">...</div>
</article>
</main>
<script>
alert(example.offsetParent.id); // main
alert(example.offsetLeft); // 180 (e'tibor: raqam, "180px" satri emas)
alert(example.offsetTop); // 180
</script>
offsetParent ning null bo’ladigan bir necha holati bor:
- Ko’rsatilmagan elementlar uchun (
display:noneyoki hujjatda yo’q). <body>va<html>uchun.position:fixedbo’lgan elementlar uchun.
offsetWidth/Height
Endi elementning o’ziga o’tamiz.
Bu ikki xususiyat eng oddiy. Ular elementning “tashqi” kengligi/balandligini beradi. Yoki boshqacha aytganda, chegaralar bilan birga to’liq o’lcham.
Bizning namuna elementimiz uchun:
offsetWidth = 390– tashqi kenglik, ichki CSS-kenglik (300px) plus paddinglar (2 * 20px) va chegaralar (2 * 25px) sifatida hisoblanishi mumkin.offsetHeight = 290– tashqi balandlik.
Geometrik xususiyatlar faqat ko’rsatilgan elementlar uchun hisoblanadi.
Agar element (yoki uning ajdodlaridan biri) display:none ga ega bo’lsa yoki hujjatda bo’lmasa, barcha geometrik xususiyatlar nolga teng (offsetParent uchun null).
Masalan, biz element yaratganimizda, lekin uni hali hujjatga qo’ymaganimizda yoki u (yoki uning ajdodi) display:none ga ega bo’lganda offsetParent null va offsetWidth, offsetHeight 0 bo’ladi.
Biz buni element yashirin ekanligini tekshirish uchun ishlatishimiz mumkin:
function isHidden(elem) {
return !elem.offsetWidth && !elem.offsetHeight;
}
E’tibor bering, bunday isHidden ekranda bo’lgan, lekin nol o’lchamga ega elementlar (bo’sh <div> kabi) uchun true qaytaradi.
clientTop/Left
Element ichida chegaralar mavjud.
Ularni o’lchash uchun clientTop va clientLeft xususiyatlari mavjud.
Bizning misolimizda:
clientLeft = 25– chap chegara kengligiclientTop = 25– yuqori chegara kengligi
…Ammo aniq aytganda – bu xususiyatlar chegara kengligi/balandligi emas, balki tashqi tomondan ichki tomonning nisbiy koordinatalari.
Farq nimada?
Bu hujjat o’ngdan chapga (operatsion tizim arab yoki ibroniy tillarida) bo’lganda ko’rinadi. Skrollbar u holda o’ngda emas, balki chapda bo’ladi va keyin clientLeft skrollbar kengligini ham o’z ichiga oladi.
Bu holda clientLeft 25 emas, balki skrollbar kengligi bilan 25 + 16 = 41 bo’ladi.
Mana ibroniycha misol:
clientWidth/Height
Bu xususiyatlar element chegaralari ichidagi maydon o’lchamini beradi.
Ular paddinglar bilan birga kontent kengligini o’z ichiga oladi, lekin skrollbarsiz:
Yuqoridagi rasmda avval clientHeight ni ko’rib chiqaylik.
Gorizontal skrollbar yo’q, shuning uchun bu chegaralar ichidagilarning aniq yig’indisi: CSS-balandlik 200px plus yuqori va pastki paddinglar (2 * 20px) jami 240px.
Endi clientWidth – bu yerda kontent kengligi 300px emas, balki 284px, chunki 16px ni skrollbar egallagan. Demak, yig’indi 284px plus chap va o’ng paddinglar, jami 324px.
Agar paddinglar bo’lmasa, clientWidth/Height aniq kontent maydoni, chegaralar va skrollbar (agar mavjud bo’lsa) ichida.
Shunday qilib, padding bo’lmaganda kontent maydoni o’lchamini olish uchun clientWidth/clientHeight dan foydalanishimiz mumkin.
scrollWidth/Height
Bu xususiyatlar clientWidth/clientHeight ga o’xshaydi, lekin ular skroll qilingan (yashirin) qismlarni ham o’z ichiga oladi:
Yuqoridagi rasmda:
scrollHeight = 723– skroll qilingan qismlar bilan birga kontent maydonining to’liq ichki balandligi.scrollWidth = 324– to’liq ichki kenglik, bu yerda gorizontal skroll yo’q, shuning uchunclientWidthga teng.
Bu xususiyatlarni elementni to’liq kenglik/balandlikgacha kengaytirish uchun ishlatishimiz mumkin.
Masalan:
// elementni to'liq kontent balandligiga kengaytirish
element.style.height = `${element.scrollHeight}px`;
Elementni kengaytirish uchun tugmani bosing:
scrollLeft/scrollTop
scrollLeft/scrollTop xususiyatlari elementning yashirin, skroll qilingan qismining kengligi/balandligi.
Quyidagi rasmda vertikal skrolli blok uchun scrollHeight va scrollTop ni ko’rishimiz mumkin.
Boshqacha qilib aytganda, scrollTop – bu “qancha yuqoriga skroll qilingan”.
scrollLeft/scrollTopni o’zgartirish mumkinBu yerdagi geometrik xususiyatlarning ko’pchiligi faqat o’qish uchun, lekinscrollLeft/scrollTop ni o’zgartirish mumkin va brauzer elementni skroll qiladi.
Agar quyidagi elementni bossangiz, elem.scrollTop += 10 kodi bajariladi. Bu element kontentini 10px pastga skroll qiladi.
Me
1
2
3
4
5
6
7
8
9
scrollTop ni 0 yoki 1e9 kabi katta qiymatga o’rnatish elementni eng yuqoriga/pastga skroll qiladi.
CSS dan kenglik/balandlik olmang
Biz hozirgina DOM elementlarining geometrik xususiyatlarini ko’rib chiqdik, ular kenglik, balandlik olish va masofalarni hisoblash uchun ishlatilishi mumkin.
Ammo Uslublar va sinflar bo’limidan bilganimizdek, biz getComputedStyle yordamida CSS-balandlik va kenglikni o’qiy olamiz.
Unda nima uchun elementning kengligini getComputedStyle bilan o’qimaslik kerak, masalan:
let elem = document.body;
alert( getComputedStyle(elem).width ); // elem uchun CSS kengligini ko'rsatish
Nima uchun geometrik xususiyatlardan foydalanishimiz kerak? Buning ikki sababi bor:
-
Birinchidan, CSS
width/heightboshqa xususiyatga bog’liq:box-sizingCSS kenglik va balandligi “nima ekanligini” belgilaydi. CSS maqsadlari uchunbox-sizingni o’zgartirish bunday JavaScript ni buzishi mumkin. -
Ikkinchidan, CSS
width/heightautobo’lishi mumkin, masalan inline element uchun:<span id="elem">Salom!</span> <script> alert( getComputedStyle(elem).width ); // auto </script>CSS nuqtai nazaridan
width:autojuda normal, lekin JavaScript da bizga hisob-kitoblarda ishlatishimiz mumkin bo’lganpxdagi aniq o’lcham kerak. Demak, bu yerda CSS kengligi foydasiz.
Va yana bir sabab bor: skrollbar. Ba’zan skrollbarsiz yaxshi ishlaydigan kod u bilan xatolikka yo’l qo’yadi, chunki skrollbar ba’zi brauzerlarda kontentdan joy oladi. Shunday qilib, kontent uchun mavjud bo’lgan haqiqiy kenglik CSS kengligidan kamroq. Va clientWidth/clientHeight buni hisobga oladi.
…Ammo getComputedStyle(elem).width bilan vaziyat boshqacha. Ba’zi brauzerlar (masalan, Chrome) skrollbarni minus qilib haqiqiy ichki kenglikni qaytaradi, ba’zilari (masalan, Firefox) esa CSS kengligini (skrollbarni e’tiborsiz qoldiradi). Bunday brauzerlararo farqlar getComputedStyle dan foydalanmaslik va geometrik xususiyatlarga tayanish sababidir.
Agar brauzeringiz skrollbar uchun joy ajratsa (Windows uchun ko’pchilik brauzerlar shunday qiladi), uni quyida sinab ko’rishingiz mumkin.
Matnli element CSS width:300px ga ega.
Desktop Windows OS da Firefox, Chrome, Edge hammasi skrollbar uchun joy ajratadilar. Lekin Firefox 300px ko’rsatadi, Chrome va Edge esa kamroq. Buning sababi Firefox CSS kengligini qaytaradi, boshqa brauzerlar esa “haqiqiy” kenglikni qaytaradi.
E’tibor bering, tasvirlangan farq faqat JavaScript dan getComputedStyle(...).width ni o’qish haqida, vizual jihatdan hamma narsa to’g’ri.
Xulosa
Elementlar quyidagi geometrik xususiyatlarga ega:
offsetParent– eng yaqin joylashtirilgan ajdod yokitd,th,table,body.offsetLeft/offsetTop–offsetParentning chap yuqori chetiga nisbatan koordinatalar.offsetWidth/offsetHeight– chegaralar bilan birga elementning “tashqi” kengligi/balandligi.clientLeft/clientTop– chap yuqori tashqi burchakdan chap yuqori ichki (kontent + padding) burchakgacha bo’lgan masofalar. Chapdan o’ngga OS lar uchun ular har doim chap/yuqori chegaralar kengligi. O’ngdan chapga OS lar uchun vertikal skrollbar chapda joylashgan, shuning uchunclientLeftuning kengligini ham o’z ichiga oladi.clientWidth/clientHeight– paddinglar bilan birga kontentning kengligi/balandligi, lekin skrollbarsiz.scrollWidth/scrollHeight– kontentning kengligi/balandligi,clientWidth/clientHeightkabi, lekin elementning skroll qilingan, ko’rinmaydigan qismini ham o’z ichiga oladi.scrollLeft/scrollTop– elementning chap yuqori burchagidan boshlab skroll qilingan yuqori qismning kengligi/balandligi.
Barcha xususiyatlar faqat o’qish uchun, scrollLeft/scrollTop dan tashqari – ular o’zgartirilsa brauzer elementni skroll qiladi.
export default ({ children }) =>
Izohlar
<code>yorlig'ini ishlating, bir nechta satrlar uchun - ularni<pre>yorlig'i bilan o'rab qo'ying, 10 satrdan ortiq bo'lsa - sandbox (plnkr, jsbin, codepen…)