javascript - 视口尺寸与“屏幕的可见部分”不匹配
问题描述
我正在尝试创建一个工具提示组件来做出反应,这样当它靠近屏幕一侧时,它会与孩子对齐。我面临的问题是,当我尝试使用“getBoundingClientRect”获取窗口大小(window.innerWidth 和 window.innerHeight)或组件的位置时,它们会给我组件的宽度/高度和位置关于看起来像 div 而不是视口的东西(见附图)
“getBoundingClientRect”给了我相对于中间部分大小的位置。我的工具提示应该在悬停在“悬停在此处查看工具提示”上时显示。目前它说顶部和左侧都是8px。在控制台中,我正在输出组件的 innerHeight、innerWidth 和 getBoundingClientRect 的结果。
这是我用于该职位的代码
useEffect(() => {
const { innerWidth, innerHeight } = window;
const {
top,
bottom,
right,
left,
width
} = reference.current.getBoundingClientRect();
if (position !== 'left' && position !== 'right') {
if (left <= 45 && dataLength > width) {
setLeftOffset(calculateOffset(width, 'left'));
}
if (top <= 45) {
setPosition('bottom');
}
if (right >= innerWidth - 45 && dataLength > width) {
setLeftOffset(-calculateOffset(width, 'right'));
}
if (bottom >= innerHeight - 45) {
setPosition('top');
}
}
// If left or right, need an extra 5px offset
if (position === 'left') setLeftOffset(5);
if (position === 'right') setLeftOffset(-5);
}, [window]);
我只是没有正确理解视口吗?如何获取组件相对于屏幕的实际位置以及可查看内容的实际大小?任何帮助将不胜感激!
解决方案
推荐阅读
- python - 由于 numpy 版本冲突问题,Top2Vec 导入失败
- azure-cosmosdb - 如何手动将预构建 python 包安装到 conda 环境中
- javascript - 如何在 React-Native 中制作弯曲的导航栏?
- momentjs - 如何创建具有特定时间和特定时区(默认本地时区除外)的 momentJS 对象?
- vue.js - 在 vue 中创建轮播指示器
- c# - C# AWS SDK:在 S3 兼容存储中复制文件时出现虚假 409 冲突错误
- django - Django 连接错误 - django.db.utils.OperationalError: FATAL: password authentication failed for user "postgres"
- c++ - 哈希表打印出默认值,但将项目添加到地址边界错误时
- python - 试图创建一个重复函数的函数
- ansible - ansible:成为和成为_ask_pass