РбагаÑо влаÑÑивоÑÑей JavaScript, ÑÐºÑ Ð´Ð¾Ð·Ð²Ð¾Ð»ÑÑÑÑ Ð½Ð°Ð¼ ÑиÑаÑи ÑнÑоÑмаÑÑÑ Ð¿Ñо ÑиÑинÑ, виÑоÑÑ ÐµÐ»ÐµÐ¼ÐµÐ½Ñа Ñа ÑнÑÑ Ð³ÐµÐ¾Ð¼ÐµÑÑиÑÐ½Ñ Ñ Ð°ÑакÑеÑиÑÑики.
Ðи ÑаÑÑо поÑÑебÑÑмо ÑÑ Ð¿Ñд ÑÐ°Ñ Ð¿ÐµÑемÑÑÐµÐ½Ð½Ñ Ð°Ð±Ð¾ позиÑÑÑÐ²Ð°Ð½Ð½Ñ ÐµÐ»ÐµÐ¼ÐµÐ½ÑÑв в JavaScript.
ÐÑиклад елеменÑа
Як пÑиклад елеменÑа Ð´Ð»Ñ Ð´ÐµÐ¼Ð¾Ð½ÑÑÑаÑÑÑ Ð²Ð»Ð°ÑÑивоÑÑей ми викоÑиÑÑаÑмо наведений нижÑе:
<div id="example">
...ТекÑÑ...
</div>
<style>
#example {
width: 300px;
height: 200px;
border: 25px solid #E8C48F;
padding: 20px;
overflow: auto;
}
</style>
ÐÑн Ð¼Ð°Ñ Ñамки, вÑдÑÑÑпи Ñа пÑокÑÑÑÑваннÑ. Ðовний набÑÑ ÑÑнкÑÑй. ТÑÑ Ð½ÐµÐ¼Ð°Ñ Ð·Ð¾Ð²Ð½ÑÑнÑÑ Ð²ÑдÑÑÑпÑв (margins), оÑкÑлÑки вони не Ñ ÑаÑÑÐ¸Ð½Ð¾Ñ Ñамого елеменÑа, Ñ Ð´Ð»Ñ Ð½Ð¸Ñ Ð½ÐµÐ¼Ð°Ñ ÑпеÑÑалÑÐ½Ð¸Ñ Ð²Ð»Ð°ÑÑивоÑÑей.
ÐÐ»ÐµÐ¼ÐµÐ½Ñ Ð²Ð¸Ð³Ð»ÑÐ´Ð°Ñ Ð¾ÑÑ Ñак:
Ðи можеÑе вÑдкÑиÑи докÑÐ¼ÐµÐ½Ñ Ñ Ð¿ÑÑоÑниÑÑ.
Ðа малÑÐ½ÐºÑ Ð²Ð¸Ñе показаний найÑкладнÑÑий випадок, коли ÐµÐ»ÐµÐ¼ÐµÐ½Ñ Ð¼Ð°Ñ ÑмÑÐ³Ñ Ð¿ÑокÑÑÑки. ÐеÑÐºÑ Ð±ÑаÑзеÑи (не вÑÑ) ÑезеÑвÑÑÑÑ Ð¼ÑÑÑе Ð´Ð»Ñ Ð½Ñого, беÑÑÑи його з вмÑÑÑÑ (познаÑеного виÑе Ñк âcontent widthâ).
Таким Ñином, без ÑмÑги пÑокÑÑÑки ÑиÑина вмÑÑÑÑ ÑÑановила б 300px, але ÑкÑо ÑиÑина ÑмÑги пÑокÑÑÑки 16px (ÑиÑина може вÑдÑÑзнÑÑиÑÑ Ð·Ð°Ð»ÐµÐ¶Ð½Ð¾ вÑд пÑиÑÑÑÐ¾Ñ Ñа бÑаÑзеÑа), Ñо залиÑаÑÑÑÑÑ Ð»Ð¸Ñе 300 - 16 = 284px, Ñ Ð¼Ð¸ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ Ñе вÑаÑ
овÑваÑи. ÐÑÑ ÑÐ¾Ð¼Ñ Ð¿Ñиклади з ÑÑого ÑоздÑÐ»Ñ Ð½Ð°Ð´Ð°Ð½Ñ Ð·Ñ ÑмÑÐ³Ð¾Ñ Ð¿ÑокÑÑÑки. Ðез Ð½ÐµÑ Ð´ÐµÑÐºÑ ÑозÑаÑ
Ñнки бÑдÑÑÑ Ð¿ÑоÑÑÑÑÑ.
padding-bottom (нижнÑй внÑÑÑÑÑнÑй вÑдÑÑÑп) може бÑÑи заповнена ÑекÑÑомÐазвиÑай на наÑиÑ
ÑлÑÑÑÑаÑÑÑÑ
вÑдÑÑÑпи вÑдобÑажаÑÑÑÑÑ Ð¿Ð¾ÑожнÑми, але ÑкÑо в елеменÑÑ Ð·Ð°Ð±Ð°Ð³Ð°Ñо ÑекÑÑÑ Ñ Ð²Ñн пеÑеповнÑÑÑÑÑÑ, Ñо бÑаÑзеÑи показÑÑÑÑ âвипадаÑÑийâ ÑекÑÑ Ð² облаÑÑÑ padding-bottom, Ñ Ñе ноÑмалÑно.
ÐеомеÑÑÑÑ
ÐÑÑ ÑлÑÑÑÑаÑÑÑ Ð· ÑÑÑма геомеÑÑиÑними влаÑÑивоÑÑÑми:
ÐнаÑÐµÐ½Ð½Ñ ÑÐ¸Ñ Ð²Ð»Ð°ÑÑивоÑÑей ÑÐµÑ Ð½ÑÑно Ñ ÑиÑлами, але ÑÑ ÑиÑла Ñ âпÑкÑелÑмиâ, ÑÐ¾Ð¼Ñ Ñе вимÑÑÑÐ²Ð°Ð½Ð½Ñ Ñ Ð¿ÑкÑелÑÑ .
ÐоÑнемо доÑлÑджÑваÑи, поÑинаÑÑи Ð·Ð¾Ð²Ð½Ñ ÐµÐ»ÐµÐ¼ÐµÐ½Ñа.
offsetParent, offsetLeft/Top
Ð¦Ñ Ð²Ð»Ð°ÑÑивоÑÑÑ ÑÑдко поÑÑÑбнÑ, але вÑе ж Ñе âнайбÑлÑÑ Ð·Ð¾Ð²Ð½ÑÑнÑâ геомеÑÑиÑÐ½Ñ Ð²Ð»Ð°ÑÑивоÑÑÑ, ÑÐ¾Ð¼Ñ Ð¹ поÑнемо з Ð½Ð¸Ñ .
У влаÑÑивоÑÑÑ offsetParent знаÑ
одиÑÑÑÑ Ð¿Ñедок елеменÑÑ, Ñкий бÑаÑÐ·ÐµÑ Ð²Ð¸ÐºÐ¾ÑиÑÑовÑÑ Ð´Ð»Ñ Ð¾Ð±ÑиÑÐ»ÐµÐ½Ð½Ñ ÐºÐ¾Ð¾ÑÐ´Ð¸Ð½Ð°Ñ Ð¿Ñд ÑÐ°Ñ Ð²ÑзÑалÑзаÑÑÑ.
ТобÑо найближÑий пÑедок, Ñкий задоволÑнÑÑ Ð½Ð°ÑÑÑпним Ñмовам:
- Ð CSS-позиÑÑонованим (CSS-влаÑÑивÑÑÑÑ
positionÑabsolute,relative,fixedабоsticky), - або
<td>,<th>,<table>, - або
<body>.
ÐлаÑÑивоÑÑÑ offsetLeft/offsetTop надаÑÑÑ ÐºÐ¾Ð¾ÑдинаÑи x/y вÑдноÑно веÑÑ
нÑого лÑвого кÑÑа offsetParent.
У Ð½Ð°Ð²ÐµÐ´ÐµÐ½Ð¾Ð¼Ñ Ð½Ð¸Ð¶Ñе пÑÐ¸ÐºÐ»Ð°Ð´Ñ Ð²Ð½ÑÑÑÑÑнÑй <div> Ð¼Ð°Ñ <main> в ÑкоÑÑÑ offsetParent, а влаÑÑивоÑÑÑ offsetLeft/offsetTop Ñ Ð·ÑÑвами Ñодо веÑÑ
нÑого лÑвого кÑÑа (180):
<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 (звеÑнÑÑÑ ÑвагÑ: ÑиÑло, а не ÑÑдок "180px")
alert(example.offsetTop); // 180
</script>
ÐÑнÑÑ Ð´ÐµÐºÑлÑка випадкÑв, коли offsetParent доÑÑвнÑÑ null:
- ÐÐ»Ñ ÐµÐ»ÐµÐ¼ÐµÐ½ÑÑв, Ñо не вÑдобÑажаÑÑÑÑÑ (
display:noneабо коли його Ð½ÐµÐ¼Ð°Ñ Ñ Ð´Ð¾ÐºÑменÑÑ). - ÐÐ»Ñ ÐµÐ»ÐµÐ¼ÐµÐ½ÑÑв
<body>Ñа<html>. - ÐÐ»Ñ ÐµÐ»ÐµÐ¼ÐµÐ½ÑÑв з
position:fixed.
offsetWidth/Height
Ð¢ÐµÐ¿ÐµÑ Ð¿ÐµÑейдемо до Ñамого елеменÑа.
Ð¦Ñ Ð´Ð²Ñ Ð²Ð»Ð°ÑÑивоÑÑÑ Ñ Ð½Ð°Ð¹Ð¿ÑоÑÑÑÑими. Ðони забезпеÑÑÑÑÑ âзовнÑÑнÑâ ÑиÑинÑ/виÑоÑÑ ÐµÐ»ÐµÐ¼ÐµÐ½Ñа. Ðбо, ÑнÑими Ñловами, його повний ÑозмÑÑ, вклÑÑаÑÑи Ñамки(border).
ÐÐ»Ñ Ð½Ð°Ñого елеменÑа:
offsetWidth = 390â зовнÑÑÐ½Ñ ÑиÑина блокÑ, ÑÑ Ð¼Ð¾Ð¶Ð½Ð° оÑÑимаÑи додаваннÑм внÑÑÑÑÑнÑÐ¾Ñ CSS-ÑиÑини (300px), внÑÑÑÑÑнÑÑ Ð²ÑдÑÑÑпÑв (2 * 20px) Ñа Ñамок (2 * 25px).offsetHeight = 290â зовнÑÑÐ½Ñ Ð²Ð¸ÑоÑа блокÑ.
ÐеомеÑÑиÑÐ½Ñ Ð²Ð»Ð°ÑÑивоÑÑÑ, ÑÐ°ÐºÑ Ñк кооÑдинаÑи Ñа ÑозмÑÑи, обÑиÑлÑÑÑÑÑÑ Ð»Ð¸Ñе Ð´Ð»Ñ Ð²ÑдобÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÐµÐ»ÐµÐ¼ÐµÐ½ÑÑв.
ЯкÑо ÐµÐ»ÐµÐ¼ÐµÐ½Ñ (або бÑдÑ-Ñкий Ñз його пÑедкÑв) Ð¼Ð°Ñ display:none або його Ð½ÐµÐ¼Ð°Ñ Ð² докÑменÑÑ, ÑÐ¾Ð´Ñ Ð²ÑÑ Ð³ÐµÐ¾Ð¼ÐµÑÑиÑÐ½Ñ Ð²Ð»Ð°ÑÑивоÑÑÑ Ð´Ð¾ÑÑвнÑÑÑÑ Ð½ÑÐ»Ñ (або null Ð´Ð»Ñ offsetParent).
ÐапÑиклад, offsetParent доÑÑвнÑÑ null, а offsetWidth, offsetHeight доÑÑвнÑÑÑÑ 0, ÑкÑо ми ÑÑвоÑили елеменÑ, але Ñе не вÑÑавили його в докÑменÑ, або вÑн (або його пÑедок) Ð¼Ð°Ñ display:none.
Ðи можемо викоÑиÑÑаÑи Ñе, Ñоб пеÑевÑÑиÑи, Ñи пÑÐ¸Ñ Ð¾Ð²Ð°Ð½Ð¾ елеменÑ, напÑиклад:
function isHidden(elem) {
return !elem.offsetWidth && !elem.offsetHeight;
}
ÐаÑважимо, Ñо ÑÑнкÑÑÑ isHidden Ñакож повеÑне true Ð´Ð»Ñ ÐµÐ»ÐµÐ¼ÐµÐ½ÑÑв, ÑÐºÑ Ð² пÑинÑÐ¸Ð¿Ñ Ð¿Ð¾ÐºÐ°Ð·ÑÑÑÑÑÑ, але ÑÑ
ÑозмÑÑи доÑÑвнÑÑÑÑ Ð½ÑÐ»Ñ (напÑиклад, поÑÐ¾Ð¶Ð½Ñ <div>).
clientTop/Left
ÐÑдемо далÑ. ÐÑеÑÐµÐ´Ð¸Ð½Ñ ÐµÐ»ÐµÐ¼ÐµÐ½Ñа Ñ Ð½Ð°Ñ Ñ Ñамки (border).
ÐÐ»Ñ ÑÑ
вимÑÑÑÐ²Ð°Ð½Ð½Ñ ÑÑнÑÑÑÑ Ð³ÐµÐ¾Ð¼ÐµÑÑиÑÐ½Ñ Ð²Ð»Ð°ÑÑивоÑÑÑ clientTop Ñа clientLeft.
ÐÐ»Ñ Ð½Ð°Ñого елеменÑа:
clientLeft = 25â ÑиÑина лÑÐ²Ð¾Ñ ÑамкиclientTop = 25â ÑиÑина веÑÑ Ð½ÑÐ¾Ñ Ñамки
â¦Ðле ÑкÑо бÑÑи ÑоÑним â ÑÑ Ð²Ð»Ð°ÑÑивоÑÑÑ Ð½Ðµ ÑиÑина/виÑоÑа Ñамки, а вÑдÑÑÑпи внÑÑÑÑÑнÑÐ¾Ñ ÑаÑÑини елеменÑа вÑд зовнÑÑнÑоÑ.
Яка ÑÑзниÑÑ?
Ðона виникаÑ, коли докÑÐ¼ÐµÐ½Ñ Ð½Ð°Ð¿Ð¸Ñаний ÑпÑава налÑво (опеÑаÑÑйна ÑиÑÑема аÑабÑÑÐºÐ¾Ñ Ð°Ð±Ð¾ ÑвÑиÑом). Ð¢Ð¾Ð´Ñ ÑмÑга пÑокÑÑÑки ÑозÑаÑована не пÑавоÑÑÑ, а лÑвоÑÑÑ, а ÑÐ¾Ð¼Ñ clientLeft Ñакож вклÑÑÐ°Ñ ÑиÑÐ¸Ð½Ñ ÑмÑги пÑокÑÑÑки.
У ÑÑÐ¾Ð¼Ñ Ð²Ð¸Ð¿Ð°Ð´ÐºÑ clientLeft бÑде не 25, бо додаÑÑÑÑÑ ÑиÑина ÑмÑги пÑокÑÑÑки: 25 + 16 = 41.
ÐÑÑ Ð¿Ñиклад на ÑвÑиÑÑ:
clientWidth/Height
Ð¦Ñ Ð²Ð»Ð°ÑÑивоÑÑÑ Ð·Ð°Ð±ÐµÐ·Ð¿ÐµÑÑÑÑÑ ÑозмÑÑ Ð¾Ð±Ð»Ð°ÑÑÑ Ð²ÑеÑÐµÐ´Ð¸Ð½Ñ Ñамок елеменÑа.
Ðони вклÑÑаÑÑÑ ÑиÑÐ¸Ð½Ñ Ð²Ð¼ÑÑÑÑ Ñазом Ñз внÑÑÑÑÑнÑми вÑдÑÑÑпами padding, але без ÑмÑги пÑокÑÑÑки:
Ðа зобÑÐ°Ð¶ÐµÐ½Ð½Ñ Ð²Ð¸Ñе давайÑе ÑпоÑаÑÐºÑ ÑозглÑнемо виÑоÑÑ clientHeight.
ÐÐµÐ¼Ð°Ñ Ð³Ð¾ÑизонÑалÑÐ½Ð¾Ñ ÑмÑги пÑокÑÑÑки, ÑÐ¾Ð¼Ñ Ñе ÑоÑно ÑÑма Ñого, Ñо знаÑ
одиÑÑÑÑ Ð²ÑеÑÐµÐ´Ð¸Ð½Ñ Ð¼ÐµÐ¶ елеменÑа: CSS-виÑоÑа 200px плÑÑ Ð²ÐµÑÑ
нÑй Ñ Ð½Ð¸Ð¶Ð½Ñй вÑдÑÑÑпи (2 * 20px) загалом 240px.
Ð¢ÐµÐ¿ÐµÑ clientWidth â ÑиÑина вмÑÑÑÑ ÑÑÑ Ð´Ð¾ÑÑвнÑÑ Ð½Ðµ 300px, а 284px, ÑÐ¾Ð¼Ñ Ñо 16px Ð·Ð°Ð¹Ð¼Ð°Ñ ÑмÑга пÑокÑÑÑки. Таким Ñином, ÑÑма ÑÑановиÑÑ 284px плÑÑ Ð²ÑдÑÑÑпи лÑвоÑÑÑ Ñ Ð¿ÑавоÑÑÑ, Ñазом 324px.
ЯкÑо Ð½ÐµÐ¼Ð°Ñ Ð²ÑдÑÑÑпÑв padding, Ñо clientWidth/Height в ÑоÑноÑÑÑ ÑÑÐ²Ð½Ñ ÑозмÑÑÑ Ð¾Ð±Ð»Ð°ÑÑÑ Ð²Ð¼ÑÑÑÑ Ð²ÑеÑÐµÐ´Ð¸Ð½Ñ Ñамок за виÑаÑ
ÑваннÑм ÑмÑги пÑокÑÑÑÑÐ²Ð°Ð½Ð½Ñ (ÑкÑо вона Ñ).
Ð¢Ð¾Ð¼Ñ Ð² ÑиÑ
випадкаÑ
, коли ми ÑоÑно знаÑмо, Ñо вÑдÑÑÑпÑв немаÑ, можна викоÑиÑÑовÑваÑи clientWidth/clientHeight Ð´Ð»Ñ Ð¾ÑÑÐ¸Ð¼Ð°Ð½Ð½Ñ ÑозмÑÑÑв внÑÑÑÑÑнÑÐ¾Ñ Ð¾Ð±Ð»Ð°ÑÑÑ Ð²Ð¼ÑÑÑÑ.
scrollWidth/Height
Ð¦Ñ Ð²Ð»Ð°ÑÑивоÑÑÑ ÑÑ
Ð¾Ð¶Ñ Ð½Ð° clientWidth/clientHeight, але вони Ñакож вклÑÑаÑÑÑ Ð¿ÑокÑÑÑÐµÐ½Ñ (пÑиÑ
ованÑ) ÑаÑÑÐ¸Ð½Ñ ÐµÐ»ÐµÐ¼ÐµÐ½Ñа:
Ðа зобÑÐ°Ð¶ÐµÐ½Ð½Ñ Ð²Ð¸Ñе:
scrollHeight = 723â повна внÑÑÑÑÑÐ½Ñ Ð²Ð¸ÑоÑа облаÑÑÑ Ð²Ð¼ÑÑÑÑ, вклÑÑаÑÑи пÑокÑÑÑÐµÐ½Ñ Ð¾Ð±Ð»Ð°ÑÑÑ.scrollWidth = 324â Ñе повна внÑÑÑÑÑÐ½Ñ ÑиÑина, ÑÑÑ Ñ Ð½Ð°Ñ Ð½ÐµÐ¼Ð°Ñ Ð³Ð¾ÑизонÑалÑÐ½Ð¾Ñ Ð¿ÑокÑÑÑки, ÑÐ¾Ð¼Ñ Ð²Ð¾Ð½Ð° доÑÑвнÑÑclientWidth.
Ðи можемо викоÑиÑÑовÑваÑи ÑÑ Ð²Ð»Ð°ÑÑивоÑÑÑ, Ñоб ÑозÑиÑиÑи ÐµÐ»ÐµÐ¼ÐµÐ½Ñ Ð½Ð° вÑÑ ÑиÑинÑ/виÑоÑÑ.
Як ÑÑÑ:
// ÑозгоÑнÑÑи ÐµÐ»ÐµÐ¼ÐµÐ½Ñ Ð½Ð° вÑÑ Ð²Ð¸ÑоÑÑ Ð²Ð¼ÑÑÑÑ
element.style.height = `${element.scrollHeight}px`;
ÐаÑиÑнÑÑÑ ÐºÐ½Ð¾Ð¿ÐºÑ, Ñоб ÑозгоÑнÑÑи елеменÑ:
scrollLeft/scrollTop
ÐлаÑÑивоÑÑÑ scrollLeft/scrollTop Ñе ÑиÑина/виÑоÑа пÑиÑ
ованоÑ, пÑокÑÑÑÐµÐ½Ð¾Ñ ÑаÑÑини елеменÑа.
Ðа малÑÐ½ÐºÑ Ð½Ð¸Ð¶Ñе ми баÑимо scrollHeight Ñа scrollTop Ð´Ð»Ñ Ð±Ð»Ð¾ÐºÑ Ð· веÑÑикалÑÐ½Ð¾Ñ Ð¿ÑокÑÑÑкоÑ.
ÐнÑими Ñловами, scrollTop ознаÑÐ°Ñ âÑкÑлÑки пÑокÑÑÑено вгоÑÑâ.
scrollLeft/scrollTop можна змÑнÑваÑиÐÑлÑÑÑÑÑÑ Ð³ÐµÐ¾Ð¼ÐµÑÑиÑниÑ
влаÑÑивоÑÑей ÑÑÑ Ð´Ð¾ÑÑÑÐ¿Ð½Ñ Ð»Ð¸Ñе Ð´Ð»Ñ ÑиÑаннÑ, але scrollLeft/scrollTop можна змÑнÑваÑи, Ñ Ð±ÑаÑÐ·ÐµÑ Ð¿ÑокÑÑÑиÑÑ ÐµÐ»ÐµÐ¼ÐµÐ½Ñ Ð²ÑдповÑдно до змÑн.
ЯкÑо клаÑнÑÑи на ÐµÐ»ÐµÐ¼ÐµÐ½Ñ Ð½Ð¸Ð¶Ñе, бÑде виконано код elem.scrollTop += 10. Це змÑÑиÑÑ Ð²Ð¼ÑÑÑ ÐµÐ»ÐµÐ¼ÐµÐ½Ñа пÑокÑÑÑиÑиÑÑ Ð½Ð° 10px вниз.
Ðа мене
1
2
3
4
5
6
7
8
9
ÐÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ scrollTop на 0 або навпаки велике знаÑеннÑ, напÑиклад 1e9 змÑÑиÑÑ ÐµÐ»ÐµÐ¼ÐµÐ½Ñ Ð¿ÑокÑÑÑиÑиÑÑ Ð´Ð¾ Ñамого веÑÑ
Ñ/Ð½Ð¸Ð·Ñ Ð²ÑдповÑдно.
Ðе ваÑÑо бÑаÑи ÑиÑинÑ/виÑоÑÑ Ð· CSS
Ðи Ñойно ÑозглÑнÑли геомеÑÑиÑÐ½Ñ Ð²Ð»Ð°ÑÑивоÑÑÑ ÐµÐ»ÐµÐ¼ÐµÐ½ÑÑв DOM, ÑÐºÑ Ð¼Ð¾Ð¶Ð½Ð° викоÑиÑÑовÑваÑи Ð´Ð»Ñ Ð¾ÑÑÐ¸Ð¼Ð°Ð½Ð½Ñ ÑиÑини, виÑоÑи Ñа обÑиÑÐ»ÐµÐ½Ð½Ñ Ð²ÑдÑÑанÑ.
Ðле, Ñк ми знаÑмо з ÑоздÑÐ»Ñ Ð¡ÑÐ¸Ð»Ñ Ñа клаÑи, ми можемо зÑиÑаÑи CSS виÑоÑÑ Ñа ÑиÑÐ¸Ð½Ñ Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ getComputedStyle.
То ÑÐ¾Ð¼Ñ Ð± не пÑоÑиÑаÑи ÑиÑÐ¸Ð½Ñ ÐµÐ»ÐµÐ¼ÐµÐ½Ñа за Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ getComputedStyle, оÑÑ Ñак?
let elem = document.body;
alert( getComputedStyle(elem).width ); // показÑÑ CSS-ÑиÑÐ¸Ð½Ñ elem
Ð§Ð¾Ð¼Ñ Ð¼Ð¸ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ Ð·Ð°Ð¼ÑÑÑÑ ÑÑого викоÑиÑÑовÑваÑи геомеÑÑиÑÐ½Ñ Ð²Ð»Ð°ÑÑивоÑÑÑ? Ð Ð´Ð²Ñ Ð¿ÑиÑини:
-
Ðо-пеÑÑе, CSS
width/heightзалежиÑÑ Ð²Ñд ÑнÑÐ¾Ñ Ð²Ð»Ð°ÑÑивоÑÑÑ:box-sizingÑка визнаÑÐ°Ñ âÑо Ñакеâ ÑиÑина Ñа виÑоÑа CSS. ÐÐ¸Ñ Ð¾Ð´Ð¸ÑÑ, Ñо змÑнаbox-sizing, напÑиклад, Ð´Ð»Ñ Ð·ÑÑÑнÑÑÐ¾Ñ Ð²ÐµÑÑÑки, Ð·Ð»Ð°Ð¼Ð°Ñ Ñакий JavaScript. -
Ðо-дÑÑге, CSS
width/heightможе бÑÑиauto, напÑиклад Ð´Ð»Ñ Ð²Ð±Ñдованого елеменÑа:<span id="elem">ÐÑивÑÑ!</span> <script> alert( getComputedStyle(elem).width ); // auto </script>ÐвÑÑно, з ÑоÑки зоÑÑ CSS,
width:autoÑ Ð°Ð±ÑолÑÑно ноÑмалÑним, але в JavaScript нам поÑÑÑбен ÑоÑний ÑозмÑÑ ÑpxÑкий ми можемо викоÑиÑÑовÑваÑи Ð´Ð»Ñ Ð¾Ð±ÑиÑленÑ. ÐÐ¸Ñ Ð¾Ð´Ð¸ÑÑ, Ñо в ÑÑÐ¾Ð¼Ñ Ð²Ð¸Ð¿Ð°Ð´ÐºÑ ÑиÑина CSS Ð²Ð·Ð°Ð³Ð°Ð»Ñ Ð±ÐµÐ·ÐºÐ¾ÑиÑна.
Ð Ñ Ñе одна пÑиÑина: ÑмÑга пÑокÑÑÑки. ÐÐ½Ð¾Ð´Ñ ÐºÐ¾Ð´, Ñкий добÑе пÑаÑÑÑ Ð±ÐµÐ· ÑмÑги пÑокÑÑÑки, поÑÐ¸Ð½Ð°Ñ Ð¿ÑаÑÑваÑи з помилками, оÑкÑлÑки ÑмÑга пÑокÑÑÑки Ð·Ð°Ð¹Ð¼Ð°Ñ Ð¿ÑоÑÑÑÑ Ñ Ð²Ð¼ÑÑÑÑ Ð² деÑкиÑ
бÑаÑзеÑаÑ
. ÐÑже, ÑеалÑна ÑиÑина, доÑÑÑпна Ð´Ð»Ñ Ð²Ð¼ÑÑÑÑ, менÑа за ÑиÑÐ¸Ð½Ñ CSS. Ð clientWidth/clientHeight вÑаÑ
овÑÑÑÑ Ñе.
â¦Ðле з getComputedStyle(elem).width ÑиÑÑаÑÑÑ ÑнÑа. ÐеÑÐºÑ Ð±ÑаÑзеÑи (напÑиклад, Chrome) повеÑÑаÑÑÑ ÑеалÑÐ½Ñ Ð²Ð½ÑÑÑÑÑÐ½Ñ ÑиÑÐ¸Ð½Ñ Ð±ÐµÐ· ÑмÑги пÑокÑÑÑки, а деÑÐºÑ Ð· ниÑ
(напÑиклад, Firefox) â CSS ÑиÑÐ¸Ð½Ñ (ÑгноÑÑÑ Ð¿ÑокÑÑÑкÑ). Ð¢Ð°ÐºÑ Ð¼Ñж бÑаÑзеÑÐ½Ñ Ð²ÑдмÑнноÑÑÑ Ñ Ð¿ÑиÑÐ¸Ð½Ð¾Ñ Ð½Ðµ викоÑиÑÑовÑваÑи getComputedStyle, а ÑадÑе покладаÑиÑÑ Ð½Ð° геомеÑÑиÑÐ½Ñ Ð²Ð»Ð°ÑÑивоÑÑÑ.
ЯкÑо Ð²Ð°Ñ Ð±ÑаÑÐ·ÐµÑ ÑезеÑвÑÑ Ð¿ÑоÑÑÑÑ Ð´Ð»Ñ ÑмÑги пÑокÑÑÑки (бÑлÑÑÑÑÑÑ Ð±ÑаÑзеÑÑв Ð´Ð»Ñ Windows Ñе ÑоблÑÑÑ), ви можеÑе пеÑевÑÑиÑи Ñе нижÑе.
ÐÐ»ÐµÐ¼ÐµÐ½Ñ Ñз ÑекÑÑом Ð¼Ð°Ñ CSS width:300px.
Ðа компâÑÑеÑÑ Ð² ÐС Windows, Firefox, Chrome, Edge ÑезеÑвÑÑÑÑÑÑ Ð¼ÑÑÑе Ð´Ð»Ñ ÑмÑги пÑокÑÑÑки. Ðле Firefox показÑÑ 300px, а Chrome Ñ Edge â менÑе. Це ÑомÑ, Ñо Firefox повеÑÑÐ°Ñ ÑиÑÐ¸Ð½Ñ CSS, а ÑнÑÑ Ð±ÑаÑзеÑи повеÑÑаÑÑÑ âÑеалÑнÑâ ÑиÑинÑ.
ÐвеÑнÑÑÑ ÑвагÑ, Ñо опиÑана ÑÑзниÑÑ ÑÑоÑÑÑÑÑÑÑ Ð»Ð¸Ñе ÑиÑÐ°Ð½Ð½Ñ getComputedStyle(...).width з JavaScript, вÑзÑалÑно вÑе пÑавилÑно.
ÐÑдÑÑмки
ÐлеменÑи маÑÑÑ Ð½Ð°ÑÑÑÐ¿Ð½Ñ Ð³ÐµÐ¾Ð¼ÐµÑÑиÑÐ½Ñ Ð²Ð»Ð°ÑÑивоÑÑÑ:
offsetParentâ Ñе найближÑий CSS-позиÑÑонований пÑедок або найближÑийtd,th,table,body.offsetLeft/offsetTopâ кооÑдинаÑи вÑдноÑно лÑвого веÑÑ Ð½Ñого кÑÑÑoffsetParent.offsetWidth/offsetHeightâ âзовнÑÑнÑâ ÑиÑина/виÑоÑа елеменÑа, вклÑÑаÑÑи Ñамки.clientLeft/clientTopâ вÑдÑÑÐ°Ð½Ñ Ð²Ñд веÑÑ Ð½Ñого лÑвого зовнÑÑнÑого кÑÑа до веÑÑ Ð½Ñого лÑвого внÑÑÑÑÑнÑого (вмÑÑÑ + вÑдÑÑÑп) кÑÑа. ÐÐ»Ñ ÐС, оÑÑÑнÑÐ¾Ð²Ð°Ð½Ð¾Ñ Ð·Ð»Ñва напÑаво, Ñе завжди ÑиÑина лÑвоÑ/веÑÑ Ð½ÑÐ¾Ñ Ñамки. ÐÐ»Ñ ÐС, оÑÑÑнÑÐ¾Ð²Ð°Ð½Ð¾Ñ ÑпÑава налÑво, веÑÑикалÑна ÑмÑга пÑокÑÑÑки ÑозÑаÑована лÑвоÑÑÑ, ÑомÑclientLeftÑакож вклÑÑÐ°Ñ ÑÑ ÑиÑинÑ.clientWidth/clientHeightâ ÑиÑина/виÑоÑа вмÑÑÑÑ, вклÑÑаÑÑи вÑдÑÑÑпи, але без ÑмÑги пÑокÑÑÑки.scrollWidth/scrollHeightâ ÑиÑина/виÑоÑа вмÑÑÑÑ, Ñк ÑclientWidth/clientHeight, але Ñакож вклÑÑÐ°Ñ Ð¿ÑокÑÑÑÐµÐ½Ñ Ð½ÐµÐ²Ð¸Ð´Ð¸Ð¼Ñ ÑаÑÑÐ¸Ð½Ñ ÐµÐ»ÐµÐ¼ÐµÐ½Ñа.scrollLeft/scrollTopâ ÑиÑина/виÑоÑа пÑокÑÑÑÐµÐ½Ð¾Ñ Ð²ÐµÑÑ Ð½ÑÐ¾Ñ ÑаÑÑини елеменÑа, поÑинаÑÑи з його веÑÑ Ð½Ñого лÑвого кÑÑа.
УÑÑ Ð²Ð»Ð°ÑÑивоÑÑÑ Ð´Ð¾ÑÑÑÐ¿Ð½Ñ Ð»Ð¸Ñе Ð´Ð»Ñ ÑиÑаннÑ, за винÑÑком scrollLeft/scrollTop ÑÐºÑ Ð·Ð¼ÑÑÑÑÑÑ Ð±ÑаÑÐ·ÐµÑ Ð¿ÑокÑÑÑÑваÑи ÐµÐ»ÐµÐ¼ÐµÐ½Ñ Ñ ÑÐ°Ð·Ñ Ð·Ð¼Ñни.
ÐоменÑаÑÑ
<code>, Ð´Ð»Ñ ÐºÑлÑÐºÐ¾Ñ ÑÑдкÑв â обгоÑнÑÑÑ ÑÑ Ñегом<pre>, Ð´Ð»Ñ Ð¿Ð¾Ð½Ð°Ð´ 10 ÑÑдкÑв â викоÑиÑÑовÑйÑе пÑÑоÑниÑÑ (plnkr, jsbin, codepenâ¦)