移动端(六) Element.getBoundingClientRect()

语法
rectObject = object.getBoundingClientRect();

rectObject .left 表示元素的左边距离视口的左边的距离;

rectObject .right 表示元素的右边距离视口的左边的距离

rectObject .top 表示元素的顶边距离视口顶边的距离

rectObject.bottom 表示元素的底部距离视口的顶边的距离

返回值是一个 DOMRect 对象,DOMRect 对象包含了一组用于描述边框的只读属性——left、top、right和bottom,单位为像素。除了 width 和 height 外的属性都是相对于视口的左上角位置而言的。

 

 

 

 

 

// 1. 获取目标元素和图表容器 const targetElement = document.getElementById('draggable-element'); const chartContainer = document.getElementById('echarts-container'); let chartInstance = echarts.init(chartContainer); // 2. 初始化元素位置监听器 function initPositionTracker() { // 使用ResizeObserver监听元素尺寸变化 const resizeObserver = new ResizeObserver(() => updateChartLayout()); resizeObserver.observe(targetElement); // 监听窗口大小变化 window.addEventListener('resize', () => { throttle(updateChartLayout, 200)(); }); // 3. 实现拖拽功能 let isDragging = false; let offsetX, offsetY; targetElement.addEventListener('mousedown', (e) => { isDragging = true; offsetX = e.clientX - targetElement.getBoundingClientRect().left; offsetY = e.clientY - targetElement.getBoundingClientRect().top; targetElement.style.cursor = 'grabbing'; }); document.addEventListener('mousemove', (e) => { if (!isDragging) return; const x = e.clientX - offsetX; const y = e.clientY - offsetY; // 更新元素位置(限制在可视区域内) targetElement.style.left = `${Math.max(0, Math.min(x, window.innerWidth - targetElement.offsetWidth))}px`; targetElement.style.top = `${Math.max(0, Math.min(y, window.innerHeight - targetElement.offsetHeight))}px`; }); document.addEventListener('mouseup', () => { if (isDragging) { isDragging = false; targetElement.style.cursor = 'grab'; updateChartLayout(); // 拖拽结束时更新图表 } }); } // 4. 更新ECharts布局 function updateChartLayout() { // 获取元素相对于视口的位置 const rect = targetElement.getBoundingClientRect(); // 计算新布局参数(示例:将图表置于元素右侧) const newLayout = { left: rect.right + 20, top: rect.top, width: window.innerWidth - rect.right - 40, height: rect.height }; // 更新图表布局 chartInstance.setOption({ grid: newLayout }); // 重绘图表 chartInstance.resize(); } // 5. 节流函数优化性能 function throttle(fn, delay) { let lastCall = 0; return function(...args) { const now = new Date().getTime(); if (now - lastCall < delay) return; lastCall = now; fn.apply(this, args); } } // 初始化 initPositionTracker(); <div class="dashboard"> <!-- 可拖拽控制面板 --> <div id="draggable-element" style="position: absolute; cursor: grab;"> <h3>控制面板</h3> <!-- 控制组件... --> </div> <!-- ECharts容器 --> <div id="echarts-container" style="height: 600px;"></div> </div> <script> // 初始化图表 const option = { grid: { left: 300 }, // 初始布局 xAxis: { type: 'category' }, yAxis: {}, series: [{ type: 'bar', data: [120, 200, 150] }] }; chartInstance.setOption(option); </script>
06-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值