这是显示我的问题的代码
.container {
width: 200px;
height: 200px;
overflow: auto;
}
.child {
width: 400px;
height: 400px;
/* When scaling down, no more X scrolling because size is 200px, but still Y scrolling :( */
transform: scale(0.5);
/* Both axis working the same (no more scrolling) when absolutely positioned */
/* position: absolute; */
}
/* Irrelevant styling */
.container {
border: 2px solid palevioletred;
position: relative;
}
.child {
background-color: pink;
transform-origin: top left;
}
<div class="container">
<div class="child">
Child
</div>
</div>
Try to scroll down or right within the box.
然后我通过变换将孩子缩小,将孩子的大小减半。
我可以稍微理解每个轴的行为,但不能理解为什么它们的行为不同。
理想情况下,我希望Y轴的行为像X轴。
如果我在孩子上设置position:absolute
,则Y轴充当X轴(两个滚动消失)。
.container {
width: 200px;
height: 200px;
overflow: auto;
}
.child {
width: 400px;
height: 400px;
position:absolute;
transform: scale(0.5);
}
/* Irrelevant styling */
.container {
border: 2px solid palevioletred;
position: relative;
}
.child {
background-color: pink;
transform-origin: top left;
}
<div class="container">
<div class="child">
Child
</div>
</div>
Try to scroll down or right within the box.
设置display:inline-block
时也是如此。两个轴的行为相同(两个滚动都不受缩放比例影响)
.container {
width: 200px;
height: 200px;
overflow: auto;
}
.child {
width: 400px;
height: 400px;
display:inline-block;
transform: scale(0.5);
}
/* Irrelevant styling */
.container {
border: 2px solid palevioletred;
position: relative;
}
.child {
background-color: pink;
transform-origin: top left;
}
<div class="container">
<div class="child">
Child
</div>
</div>
Try to scroll down or right within the box.
为什么在最初的情况下,我们有不同的行为?以及为什么在某些情况下比例会改变滚动(当我们使用position:absolute
时),而在其他情况下却没有改变滚动(当我们使用display:inline-block
时)。
请注意,transform
是一种视觉效果,不会影响布局,因此从逻辑上讲,滚动在所有情况下均不应更改。
答案 0 :(得分:2)
我在w3.org website中发现了一些关于可重复溢出的令人困惑的陈述,它们可能解释了为什么实现不一致。由于它是草稿,因此它们看起来更像TODO标记:
问题1:
在滚动模型上存在分歧。 2.1明显定义 您滚动了 content 区域;内容会溢出 内容框,然后将溢出内容框与内容框合并 找到可滚动区域。特别是,这意味着内容 会被起始边填充物抵消,但是如果溢出,它将 将直接到达末端的边缘。这就是Firefox和 IE浏览器。至少有些作者(和规范作者)改为 填充框可以滚动的思维模型,所以当您 滚动到溢出的末尾,有右边/右边的填充。 Chrome / WebKit至少要对块轴执行此操作。他们有点 与内联轴不一致;关于如何有一些奇怪的地方 他们处理线框。
似乎块轴填充可能与Web兼容 荣誉。目前尚不清楚行内轴填充会是多少。进一步 需要实验。
问题2:
这种处理变换的描述是否足够准确?
注意:
可滚动溢出矩形始终是 框自身的坐标系,但在其他坐标系中可能不是矩形的 坐标系由于变换[CSS3-TRANSFORMS]。这表示 滚动条有时在不需要时会出现。
无论如何,似乎我们需要依靠“ position:absolute”作为Chrome的解决方法。或转换容器而不是子容器。甚至创建一个额外的硬币容器级别。
希望有帮助!
答案 1 :(得分:1)
我相信行为上的差异与转换源有关。调整原点以便将子级放置在右侧而不是左侧(并且删除了内联块显示)时,将再次出现水平滚动,并且仅在滚动时才可见该子级(请参见代码段)。由于孩子的default 'static' position(即使不进行转换)也会从容器的顶部显示,这就是为什么它不会像我理解的那样影响垂直滚动的原因。
正如其他人所指出的,关于CSS转换,还有许多艰巨的任务。我不会将其视为错误(尽管我明白您的意思)。也许将来从w3c中可以获得更好的解释/更加清晰。
.container {
width: 200px;
height: 200px;
overflow: auto;
border: 2px solid palevioletred;
position: relative;
}
.child {
width: 400px;
height: 400px;
transform: scale(0.5);
background-color: pink;
transform-origin: top right;
}
<div class="container">
<div class="child">
Child
</div>
</div>
Transform-origin changed to top right (as opposed to top left)