下拉菜单定位
计算下拉菜单的最佳位置,处理边界情况
实现原理
下拉菜单需要根据触发按钮的位置智能定位,确保菜单完整显示在视口内。
function positionDropdown(trigger, menu) {
const triggerRect = trigger.getBoundingClientRect();
const menuRect = menu.getBoundingClientRect();
// 默认:左上角对齐,显示在按钮下方
let top = triggerRect.bottom + 5;
let left = triggerRect.left;
// 检查是否超出底部
if (top + menuRect.height > window.innerHeight) {
// 改为显示在按钮上方
top = triggerRect.top - menuRect.height - 5;
}
// 检查是否超出右边界
if (left + menuRect.width > window.innerWidth) {
// 右对齐
left = triggerRect.right - menuRect.width;
}
// 检查是否超出左边界
if (left < 0) {
left = 10;
}
menu.style.top = top + 'px';
menu.style.left = left + 'px';
}
示例:智能下拉菜单
点击按钮打开下拉菜单(会自动避开边界)
💡 关键点
下拉菜单会:
1. 默认显示在按钮下方
2. 如果下方空间不足,显示在上方
3. 防止超出左右边界
4. 使用 fixed 定位避免被父容器裁剪
总结
- 使用 getBoundingClientRect() 获取按钮位置
- 计算菜单的初始位置
- 检测四个方向的边界
- 动态调整菜单位置和方向
- 确保菜单始终在视口内可见