Як визнаÑиÑи ÑиÑÐ¸Ð½Ñ Ñа виÑоÑÑ Ð²Ñкна бÑаÑзеÑа? Як оÑÑимаÑи Ð¿Ð¾Ð²Ð½Ñ ÑиÑÐ¸Ð½Ñ Ñа виÑоÑÑ Ð´Ð¾ÐºÑменÑа, вклÑÑаÑÑи пÑокÑÑÑÐµÐ½Ñ ÑаÑÑинÑ? Як можна пÑокÑÑÑиÑи ÑÑоÑÑÐ½ÐºÑ Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ JavaScript?
ÐÐ»Ñ ÑÑого ми можемо викоÑиÑÑовÑваÑи коÑеневий ÐµÐ»ÐµÐ¼ÐµÐ½Ñ Ð´Ð¾ÐºÑменÑа document.documentElement, Ñкий вÑдповÑÐ´Ð°Ñ ÑÐµÐ³Ñ <html>. Ðле Ñ Ð´Ð¾Ð´Ð°ÑÐºÐ¾Ð²Ñ Ð¼ÐµÑоди Ñа оÑобливоÑÑÑ, ÑÐºÑ ÑлÑд вÑаÑ
овÑваÑи.
ШиÑина/виÑоÑа вÑкна
Щоб оÑÑимаÑи ÑиÑÐ¸Ð½Ñ Ñа виÑоÑÑ Ð²Ñкна, ми можемо викоÑиÑÑовÑваÑи clientWidth/clientHeight з document.documentElement:
ÐапÑиклад, ÑÑ ÐºÐ½Ð¾Ð¿ÐºÐ° показÑÑ Ð²Ð¸ÑоÑÑ Ð²Ð°Ñого вÑкна:
window.innerWidth/innerHeightÐÑаÑзеÑи Ñакож пÑдÑÑимÑÑÑÑ Ð²Ð»Ð°ÑÑивоÑÑÑ window.innerWidth/innerHeight. ÐаÑебÑо ÑÑ
оже на Ñе, Ñо нам поÑÑÑбно. Ð§Ð¾Ð¼Ñ Ð± ÑÑ
не викоÑиÑÑаÑи?
ЯкÑо Ñ ÑмÑга пÑокÑÑÑки, Ñ Ð²Ð¾Ð½Ð° Ð·Ð°Ð¹Ð¼Ð°Ñ Ð´ÐµÑкий пÑоÑÑÑÑ, Ñо влаÑÑивоÑÑÑ clientWidth/clientHeight нададÑÑÑ ÑиÑинÑ/виÑоÑÑ Ð±ÐµÐ· пÑокÑÑÑки (вÑднÑвÑи ÑÑ). ÐнакÑе кажÑÑи, вони повеÑÑаÑÑÑ ÑиÑинÑ/виÑоÑÑ Ð²Ð¸Ð´Ð¸Ð¼Ð¾Ñ ÑаÑÑини докÑменÑа, доÑÑÑÐ¿Ð½Ð¾Ñ Ð´Ð»Ñ Ð²Ð¼ÑÑÑÑ.
Ð window.innerWidth/innerHeight вклÑÑаÑÑÑ ÑмÑÐ³Ñ Ð¿ÑокÑÑÑки.
ЯкÑо Ñ ÑмÑга пÑокÑÑÑки Ñа вона Ð·Ð°Ð¹Ð¼Ð°Ñ Ð´ÐµÑкий пÑоÑÑÑÑ, Ñо ÑÑ Ð´Ð²Ð° ÑÑдки покажÑÑÑ ÑÑÐ·Ð½Ñ Ð·Ð½Ð°ÑеннÑ:
alert( window.innerWidth ); // повна ÑиÑина вÑкна
alert( document.documentElement.clientWidth ); // ÑиÑина вÑкна мÑнÑÑ ÑмÑга пÑокÑÑÑки
У бÑлÑÑоÑÑÑ Ð²Ð¸Ð¿Ð°Ð´ÐºÑв нам поÑÑÑбна доÑÑÑпна ÑиÑина вÑкна без ÑмÑги пÑокÑÑÑки, Ñоб намалÑваÑи або ÑозÑаÑÑваÑи ÑоÑÑ. Ð¢Ð¾Ð¼Ñ Ð¼Ð¸ маÑмо викоÑиÑÑовÑваÑи documentElement.clientHeight/clientWidth.
DOCTYPE важливийÐвеÑнÑÑÑ ÑвагÑ: геомеÑÑиÑÐ½Ñ Ð²Ð»Ð°ÑÑивоÑÑÑ Ð²ÐµÑÑ
нÑого ÑÑÐ²Ð½Ñ Ð¼Ð¾Ð¶ÑÑÑ Ð¿ÑаÑÑваÑи деÑо ÑнакÑе, ÑкÑо в HTML Ð½ÐµÐ¼Ð°Ñ <!DOCTYPE HTML>. ÐÐ¾Ð¶Ð»Ð¸Ð²Ñ Ð´Ð¸Ð²Ð½Ñ ÑеÑÑ.
У ÑÑÑаÑÐ½Ð¾Ð¼Ñ HTML ми завжди Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ Ð²ÐºÐ°Ð·ÑваÑи DOCTYPE.
ШиÑина/виÑоÑа докÑменÑа
ТеоÑеÑиÑно, оÑкÑлÑки коÑеневим елеменÑом докÑменÑа Ñ document.documentElement, Ñ Ð²Ñн оÑ
оплÑÑ Ð²ÐµÑÑ Ð²Ð¼ÑÑÑ, ми можемо вимÑÑÑÑи повний ÑозмÑÑ Ð´Ð¾ÐºÑменÑа Ñк document.documentElement.scrollWidth/scrollHeight.
Ðле Ð´Ð»Ñ ÑÑого елеменÑа Ð´Ð»Ñ Ð²ÑÑÑÑ ÑÑоÑÑнки ÑÑ Ð²Ð»Ð°ÑÑивоÑÑÑ Ð½Ðµ пÑаÑÑÑÑÑ Ð½Ð°Ð»ÐµÐ¶Ð½Ð¸Ð¼ Ñином. У Chrome/Safari/Opera, ÑкÑо Ð½ÐµÐ¼Ð°Ñ ÑмÑги пÑокÑÑÑки, Ñо documentElement.scrollHeight може бÑÑи навÑÑÑ Ð¼ÐµÐ½Ñим, нÑж documentElement.clientHeight! Ð ÑоÑки зоÑÑ ÐµÐ»ÐµÐ¼ÐµÐ½Ñа Ñе неможлива ÑиÑÑаÑÑÑ.
Щоб надÑйно оÑÑимаÑи Ð¿Ð¾Ð²Ð½Ñ Ð²Ð¸ÑоÑÑ Ð´Ð¾ÐºÑменÑа, ми Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ Ð²Ð·ÑÑи макÑималÑне знаÑÐµÐ½Ð½Ñ Ð· ÑÐ¸Ñ Ð²Ð»Ð°ÑÑивоÑÑей:
let scrollHeight = Math.max(
document.body.scrollHeight, document.documentElement.scrollHeight,
document.body.offsetHeight, document.documentElement.offsetHeight,
document.body.clientHeight, document.documentElement.clientHeight
);
alert('Ðовна виÑоÑа докÑменÑа з пÑокÑÑÑÐµÐ½Ð¾Ñ ÑаÑÑиноÑ: ' + scrollHeight);
Ð§Ð¾Ð¼Ñ Ñак? ÐÑаÑе не запиÑÑйÑе. Ð¦Ñ Ð½ÐµÐ²ÑдповÑдноÑÑÑ Ð¿Ð¾Ñ Ð¾Ð´ÑÑÑ Ñз давнÑÑ ÑаÑÑв, а не з Ð³Ð»Ð¸Ð±Ð¾ÐºÐ¾Ñ Ð»Ð¾Ð³Ñки.
ÐÑÑÐ¸Ð¼Ð°Ð½Ð½Ñ Ð¿Ð¾ÑоÑÐ½Ð¾Ñ Ð¿Ð¾Ð·Ð¸ÑÑÑ Ð¿ÑокÑÑÑки
ÐлеменÑи DOM збеÑÑгаÑÑÑ ÑвÑй поÑоÑний ÑÑан пÑокÑÑÑки Ñ Ð²Ð»Ð°ÑÑивоÑÑÑÑ
scrollLeft/scrollTop.
СÑан пÑокÑÑÑки докÑменÑа мÑÑÑиÑÑÑÑ Ð² document.documentElement.scrollLeft/scrollTop, Ñа пÑаÑÑÑ Ð² бÑлÑÑоÑÑÑ Ð±ÑаÑзеÑÑв, за винÑÑком ÑÑаÑÑÑиÑ
бÑаÑзеÑÑв ÑÑвоÑениÑ
на WebKit, ÑакиÑ
Ñк Safari (помилка 5991), де ми Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ Ð²Ð¸ÐºÐ¾ÑиÑÑовÑваÑи document.body замÑÑÑÑ document.documentElement.
Ðа ÑаÑÑÑ, нам не поÑÑÑбно памâÑÑаÑи пÑо ÑÑ Ð¾ÑобливоÑÑÑ, оÑкÑлÑки пÑокÑÑÑка доÑÑÑпна Ñ ÑпеÑÑалÑниÑ
влаÑÑивоÑÑÑÑ
window.pageXOffset/pageYOffset:
alert('ÐоÑоÑна пÑокÑÑÑка звеÑÑ
Ñ: ' + window.pageYOffset);
alert('ÐоÑоÑна пÑокÑÑÑка злÑва: ' + window.pageXOffset);
Ð¦Ñ Ð²Ð»Ð°ÑÑивоÑÑÑ Ð´Ð¾ÑÑÑÐ¿Ð½Ñ Ð»Ð¸Ñе Ð´Ð»Ñ ÑиÑаннÑ.
window scrollX Ñа scrollYÐ ÑÑÑоÑиÑÐ½Ð¸Ñ Ð¿ÑиÑин Ð¾Ð±Ð¸Ð´Ð²Ñ Ð²Ð»Ð°ÑÑивоÑÑÑ ÑÑнÑÑÑÑ, але вони однаковÑ:
window.pageXOffsetÑ Ð¿ÑевдонÑмомwindow.scrollX.window.pageYOffsetÑ Ð¿ÑевдонÑмомwindow.scrollY.
ÐÑокÑÑÑка: scrollTo, scrollBy, scrollIntoView
ÐÐ»Ñ Ñого, Ñоб пÑокÑÑÑÑваÑи ÑÑоÑÑÐ½ÐºÑ Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ JavaScript, ÑÑ DOM Ð¼Ð°Ñ Ð±ÑÑи повнÑÑÑÑ ÑÑвоÑено.
ÐапÑиклад, ÑкÑо ми ÑпÑобÑÑмо пÑокÑÑÑиÑи ÑÑоÑÑÐ½ÐºÑ Ð² ÐºÐ¾Ð´Ñ ÑкÑипÑа ÑозÑаÑованого в <head>, Ñе не ÑпÑаÑÑÑ.
ÐвиÑÐ°Ð¹Ð½Ñ ÐµÐ»ÐµÐ¼ÐµÐ½Ñи можна пÑокÑÑÑÑваÑи, змÑнÑÑÑи scrollTop/scrollLeft.
Ðи можемо зÑобиÑи Ñе ж Ñаме Ð´Ð»Ñ ÑÑоÑÑнки, викоÑиÑÑовÑÑÑи document.documentElement.scrollTop/scrollLeft (кÑÑм Safari, де замÑÑÑÑ ÑÑого ÑлÑд викоÑиÑÑовÑваÑи document.body.scrollTop/Left).
Також ÑÑнÑÑ Ð¿ÑоÑÑÑÑий Ñа ÑнÑвеÑÑалÑний пÑÐ´Ñ Ñд: ÑпеÑÑалÑÐ½Ñ Ð¼ÐµÑоди window.scrollBy(x,y) Ñ window.scrollTo(pageX,pageY).
-
ÐеÑод
scrollBy(x,y)пÑокÑÑÑÑÑ ÑÑоÑÑÐ½ÐºÑ Ð²ÑдноÑно ÑÑ Ð¿Ð¾ÑоÑÐ½Ð¾Ñ Ð¿Ð¾Ð·Ð¸ÑÑÑ. ÐапÑиклад,scrollBy(0,10)пÑокÑÑÑÑÑ ÑÑоÑÑÐ½ÐºÑ Ð½Ð°10pxвниз.Ðнопка нижÑе демонÑÑÑÑÑ Ñе:
-
ÐеÑод
scrollTo(pageX,pageY)пÑокÑÑÑÑÑ ÑÑоÑÑÐ½ÐºÑ Ð½Ð° абÑолÑÑÐ½Ñ ÐºÐ¾Ð¾ÑдинаÑи, Ñак Ñо веÑÑ Ð½Ñй лÑвий кÑÑ Ð²Ð¸Ð´Ð¸Ð¼Ð¾Ñ ÑаÑÑини мав кооÑдинаÑи(pageX, pageY)вÑдноÑно веÑÑ Ð½Ñого лÑвого кÑÑа докÑменÑа. Це Ñе ж Ñаме, Ñо пÑизнаÑиÑиscrollLeft/scrollTop.Щоб пÑокÑÑÑиÑи до Ñамого поÑаÑкÑ, ми можемо викоÑиÑÑовÑваÑи
scrollTo(0,0).
Ð¦Ñ Ð¼ÐµÑоди пÑаÑÑÑÑÑ Ð´Ð»Ñ Ð²ÑÑÑ Ð±ÑаÑзеÑÑв однаково.
scrollIntoView
ÐÐ»Ñ Ð¿Ð¾Ð²Ð½Ð¾Ñи ÑозглÑнемо Ñе один меÑод: elem.scrollIntoView(top).
Ðиклик elem.scrollIntoView(top) пÑокÑÑÑÑÑ ÑÑоÑÑÐ½ÐºÑ Ñаким Ñином, Ñоб зÑобиÑи elem видимим. ÐÑн Ð¼Ð°Ñ Ð¾Ð´Ð¸Ð½ аÑгÑменÑ:
- ЯкÑо
top=true(Ñипове знаÑеннÑ), Ñо ÑÑоÑÑнка бÑде пÑокÑÑÑена Ñак, ÑобelemзâÑвивÑÑ Ñ Ð²ÐµÑÑ Ð½Ñй ÑаÑÑÐ¸Ð½Ñ Ð²Ñкна. ÐеÑÑ Ð½Ñй кÑай елеменÑа бÑде виÑÑвнÑний з веÑÑ Ð½ÑÐ¾Ñ ÑаÑÑÐ¸Ð½Ð¾Ñ Ð²Ñкна. - ЯкÑо
top=false, Ñо ÑÑоÑÑнка пÑокÑÑÑÑÑÑÑÑÑ Ñак, ÑобelemзâÑвивÑÑ Ð²Ð½Ð¸Ð·Ñ. ÐижнÑй кÑай елеменÑа бÑде виÑÑвнÑний з нижнÑÐ¾Ñ ÑаÑÑÐ¸Ð½Ð¾Ñ Ð²Ñкна.
Ðнопка нижÑе пÑокÑÑÑÑÑ ÑÑоÑÑнкÑ, Ñоб ÑозмÑÑÑиÑи Ñебе Ñ Ð²ÐµÑÑ Ð½Ñй ÑаÑÑÐ¸Ð½Ñ Ð²Ñкна:
Ð ÑÑ ÐºÐ½Ð¾Ð¿ÐºÐ° пÑокÑÑÑÑÑ ÑÑоÑÑнкÑ, Ñоб ÑозмÑÑÑиÑи Ñебе Ñ Ð½Ð¸Ð¶Ð½Ñй ÑаÑÑÐ¸Ð½Ñ Ð²Ñкна:
ÐабоÑона пÑокÑÑÑÑваннÑ
ÐÐ½Ð¾Ð´Ñ Ð½Ð°Ð¼ поÑÑÑбно зÑобиÑи докÑÐ¼ÐµÐ½Ñ âне пÑокÑÑÑÑванимâ. ÐапÑиклад, Ñоб закÑиÑи ÑÑоÑÑÐ½ÐºÑ Ð²ÐµÐ»Ð¸ÐºÐ¸Ð¼ повÑдомленнÑм, Ñке Ð²Ð¸Ð¼Ð°Ð³Ð°Ñ Ð½ÐµÐ³Ð°Ð¹Ð½Ð¾Ñ Ñваги, Ñ Ð¼Ð¸ Ñ Ð¾Ñемо, Ñоб вÑдвÑдÑÐ²Ð°Ñ Ð²Ð·Ð°ÑмодÑÑв з Ñим повÑдомленнÑм, а не з докÑменÑом.
Щоб зÑобиÑи докÑÐ¼ÐµÐ½Ñ Ð½ÐµÐ´Ð¾ÑÑÑпним Ð´Ð»Ñ Ð¿ÑокÑÑÑÑваннÑ, доÑÑаÑнÑо вÑÑановиÑи document.body.style.overflow = "hidden". СÑоÑÑнка âзавмÑеâ Ñ Ð¿Ð¾ÑоÑнÑй позиÑÑÑ Ð¿ÑокÑÑÑÑваннÑ.
СпÑобÑй:
ÐеÑÑа кнопка зÑпинÑÑ Ð¿ÑокÑÑÑкÑ, а дÑÑга вÑдновлÑÑ.
Ðи можемо викоÑиÑÑовÑваÑи ÑÑ ÑÐ°Ð¼Ñ ÑеÑ
нÑкÑ, Ñоб замоÑозиÑи пÑокÑÑÑÐºÑ Ð´Ð»Ñ ÑнÑиÑ
елеменÑÑв, а не лиÑе Ð´Ð»Ñ document.body.
ÐедолÑком ÑÑого меÑÐ¾Ð´Ñ Ñ Ñе, Ñо ÑмÑга пÑокÑÑÑки зникаÑ. ЯкÑо вона займала деÑкий пÑоÑÑÑÑ, Ñо Ñе мÑÑÑе звÑлÑнÑÑÑÑÑÑ, Ñ Ð²Ð¼ÑÑÑ Â«ÑÑÑибаÑ», Ñоб заповниÑи його.
Це виглÑÐ´Ð°Ñ ÑÑоÑ
и дивно, але Ñе можна обÑйÑи, ÑкÑо поÑÑвнÑÑи clientWidth до Ñ Ð¿ÑÑÐ»Ñ Ð·Ð°Ð±Ð¾Ñони пÑокÑÑÑÑваннÑ. ЯкÑо ÑиÑина збÑлÑÑилаÑÑ (ÑмÑга пÑокÑÑÑки зникла), додайÑе padding до document.body замÑÑÑÑ ÑмÑги пÑокÑÑÑки, Ñоб збеÑегÑи ÑиÑÐ¸Ð½Ñ Ð²Ð¼ÑÑÑÑ ÑÐ°ÐºÐ¾Ñ Ð¶.
ÐÑдÑÑмки
РозмÑÑи:
-
ШиÑина/виÑоÑа Ð²Ð¸Ð´Ð¸Ð¼Ð¾Ñ ÑаÑÑини докÑменÑа (ÑиÑина/виÑоÑа облаÑÑÑ Ð²Ð¼ÑÑÑÑ):
document.documentElement.clientWidth/clientHeight -
ШиÑина/виÑоÑа вÑÑого докÑменÑа з пÑокÑÑÑÐµÐ½Ð¾Ñ ÑаÑÑиноÑ:
let scrollHeight = Math.max( document.body.scrollHeight, document.documentElement.scrollHeight, document.body.offsetHeight, document.documentElement.offsetHeight, document.body.clientHeight, document.documentElement.clientHeight );
ÐÑокÑÑÑка:
-
ÐÑоÑиÑаÑи поÑоÑÐ½Ñ Ð¿ÑокÑÑÑкÑ:
window.pageYOffset/pageXOffset. -
ÐмÑниÑи поÑоÑÐ½Ñ Ð¿ÑокÑÑÑкÑ:
window.scrollTo(pageX,pageY)â абÑолÑÑÐ½Ñ ÐºÐ¾Ð¾ÑдинаÑи,window.scrollBy(x,y)â пÑокÑÑÑиÑи вÑдноÑно поÑоÑного мÑÑÑÑ,elem.scrollIntoView(top)â пÑокÑÑÑиÑи, Ñоб зÑобиÑиelemвидимим (виÑÑвнÑÑи з веÑÑ Ð½ÑоÑ/нижнÑÐ¾Ñ ÑаÑÑÐ¸Ð½Ð¾Ñ Ð²Ñкна).
ÐоменÑаÑÑ
<code>, Ð´Ð»Ñ ÐºÑлÑÐºÐ¾Ñ ÑÑдкÑв â обгоÑнÑÑÑ ÑÑ Ñегом<pre>, Ð´Ð»Ñ Ð¿Ð¾Ð½Ð°Ð´ 10 ÑÑдкÑв â викоÑиÑÑовÑйÑе пÑÑоÑниÑÑ (plnkr, jsbin, codepenâ¦)