我正在制作一个节点编辑器(沿着 UE4 的蓝图或 Blender 的着色器节点)并遇到一个问题,即当绝对定位的节点到达视口边缘时,它们的内部会被挤压。
这是一个关于实际问题的视频:https ://youtu.be/ZglXI7BOx-k (它在边缘之前被挤压的原因是因为我有translate(-50%, -50%)它)
我已经设置了以下简化示例,它仍然演示了问题
<!DOCTYPE html>
<head>
<meta charset="UTF-8">
<title>CSS Squish test</title>
<style>
.wrapper{
position: relative;
width: 500px;
height: 500px;
background: #EEEEEE;
}
.node{
position: absolute;
display: flex;
flex-direction: column;
justify-content: space-between;
background: #AAAAFF;
padding: 4px;
}
.body{
display: flex;
flex-direction: row;
}
.column{
display: flex;
flex-direction: column;
align-items: stretch;
flex-shrink: 0;
}
.entry{
display: flex;
flex-direction: row;
flex-shrink: 0;
}
.left{
justify-content: flex-start;
}
.right{
justify-content: flex-end;
}
</style>
<script>
window.onload = ()=>{
let node = document.getElementById('node');
node.style.left = '0px';
main();
}
function main(){
let node = document.getElementById('node');
let oldPos = parseInt(node.style.left);
node.style.left = (oldPos + 2) + 'px';
requestAnimationFrame(main);
}
</script>
</head>
<body>
<div class="wrapper">
<div id="node" class="node">
<div class="title">Title</div>
<div class="body">
<div class="column" style="background: #AAFFAA">
<div class="entry left">
<div><</div>
<div>Text</div>
</div>
</div>
<div class="column" style="background: #FFAAAA">
<div class="entry right">
<div>Text</div>
<div>></div>
</div>
<div class="entry right">
<div>A whole bunch of text</div>
<div>></div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
由于在实际程序中可以平移视口,如果节点不挤压,我更喜欢它,而是无论它们位于何处都保留其原始大小。我也想这样做而不为节点设置定义的宽度,因为我宁愿有不同大小的节点来根据它们的内容进行调整。
我的假设是让一个元素绝对从页面流中删除它,所以我很困惑为什么它仍在调整它的大小。有关如何解决此问题的任何解决方案?