css - 颜色选择器弹出窗口超出当前视图
问题描述
如何让我的颜色选择器弹出窗口检测它是否不适合并将其显示在按钮上方?目前它超出了当前视图。我想让它能够检测到它不在当前视图中,而是在按钮上方打开。
这是我到目前为止所拥有的:
const Picker = styled.div`
position: absolute;
display: flex;
flex-direction: row;
align-items: center;
justify-content: flex-start;
`;
const Swatch = styled.div`
width: 28px;
height: 28px;
border-radius: 8px;
border: 3px solid #fff;
box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1), inset 0 0 0 1px rgba(0, 0, 0, 0.1);
cursor: pointer;
`;
const PopOver = styled.div`
position: absolute;
z-index: 100;
top: calc(100% + 2px);
bottom: 20rem;
left: 6rem;
border-radius: 9px;
box-shadow: 0 6px 12px rgba(0, 0, 0, 0.15);
`;
<Picker>
<Label>{label}</Label>
{isOpen && (
<PopOver ref={popover}>
<HexColorPicker color={color} onChange={onChange} />
</PopOver>
)}
<Swatch style={{ backgroundColor: color }} onClick={() => toggle(!isOpen)} />
</Picker>
解决方案
当你打开弹窗时,检查渲染项的y
位置加height
是否大于窗口的screenHeight
. 如果是,请更改 y 位置或添加一个将弹出框置于触发按钮上方的类。
如果在添加弹出框高度之前 y 位置大于 screenHeight,那么您可能需要scrollTop
从 y 位置中减去该值以获得屏幕坐标而不是文档坐标中的适当位置。
推荐阅读
- vue.js - 如何覆盖全局组件的 vuetify 样式
- c# - 在后面的代码中将 DataTemplate 分配给带有视图模型的视图
- visual-studio - 添加 Nuget 包时,添加的内容在哪里?
- openlayers - OpenLayers 概览地图折叠监听器
- reactjs - 切换到初始状态时,react-switch 不会调用 onChange
- c# - 带有动态参数的数据库助手的 c# razor 网页包装器
- mysql - 如何恢复完整的 localhost.sql
- django - DRF 方法序列化器:对象类型
不是 JSON 可序列化的 - javascript - HTML select 正在从后端获取值---如何知道当 select 被填充时,触发了哪个事件
- javascript - 如何仅在手机按住0.5秒后注册键盘键?