<!DOCTYPE html> <html lang="en" dir="ltr"> <head> <meta charset="utf-8"> <title></title> <style> * {margin:0;padding:0;} .hline {width:99vw;height:1px;position:absolute;left:0;top:0;} .vline {height:99vh;width:1px;position:absolute;left:0;top:0;} </style> </head> <body style="height:300vh;width:300vw"> <div style="background-color:green;margin:30px;"> B <div id="a" style="background-color:yellow;margin:20px;margin-left:500px;margin-top:1000px;"> A </div> </div> <div id="v1" class="hline" style="background-color:red"></div> <div id="c1" class="hline" style="background-color:blue"></div> <div id="v2" class="vline" style="background-color:red"></div> <div id="c2" class="vline" style="background-color:blue"></div> <script type="text/javascript"> const $ = document.querySelectorAll.bind(document); const on = window.addEventListener.bind(window); const off = window.removeEventListener.bind(window); let v1, c1; let v2, c2; on("DOMContentLoaded", () => { const el = $('#a')[0]; v1 = $('#v1')[0]; c1 = $('#c1')[0]; v2 = $('#v2')[0]; c2 = $('#c2')[0]; on('scroll', () => { const r = updateElViewPosition(document.documentElement, el); console.log(r); }); updateElViewPosition(document.documentElement, el); }); function getElementVerticalViewPosition(parent, el) { const parentSize = parent.getBoundingClientRect(); const elSize = el.getBoundingClientRect(); const viewSizeHalf = parent.clientHeight / 2; const offsetTop = elSize.top - parentSize.top; const scrollCenter = (parent.scrollTop + viewSizeHalf); const elementCenter = (offsetTop + (elSize.height / 2)); const viewPosition = 1 - (Math.min(viewSizeHalf, Math.abs(scrollCenter - elementCenter)) / viewSizeHalf); return { scrollCenter, elementCenter, viewPosition }; } function getElementHorizontalViewPosition(parent, el) { const parentSize = parent.getBoundingClientRect(); const elSize = el.getBoundingClientRect(); const viewSizeHalf = parent.clientWidth / 2; const offsetLeft = elSize.left - parentSize.left; const scrollCenter = (parent.scrollLeft + viewSizeHalf); const elementCenter = (offsetLeft + (elSize.width / 2)); const viewPosition = 1 - (Math.min(viewSizeHalf, Math.abs(scrollCenter - elementCenter)) / viewSizeHalf); return { scrollCenter, elementCenter, viewPosition }; } function updateElViewPosition(parent, el) { const p1 = getElementVerticalViewPosition(parent, el); const p2 = getElementHorizontalViewPosition(parent, el); v1.style.top = p1.scrollCenter +'px'; c1.style.top = p1.elementCenter +'px'; v2.style.left = p2.scrollCenter +'px'; c2.style.left = p2.elementCenter +'px'; console.log('v', p1.viewPosition); console.log('h', p2.viewPosition); } </script> </body> </html>
157800cookie-checkJavascript get elements position relative to view center