请查看demo
我有两个div
s,第一个div
用于显示滚动条,第二个div
用于轮换div
的内容
我的问题是,即使内部内容没有溢出,滚动条也会显示。
请检查演示并告诉我这里我做错了什么以及如何克服这个问题或任何其他方法来实现这一目标。
HTML
<div style="width: 1096px; height: 434px; overflow: auto; position: relative; border:solid 5px #555555">
<div id="RotationDiv">
<img style="left: 54px; top: 337px; width: 326px; height: 422px; position: absolute;" src="http://fc01.deviantart.net/fs70/f/2012/304/6/b/walfas_custom___vending_machine_2_by_grayfox5000-d5jljhe.png" />
</div>
</div>
CSS
#RotationDiv {
-ms-transform-origin: 539px 539px;
-webkit-transform-origin: 539px 539px;
width: 434px;
height: 1096px;
overflow: visible;
-ms-transform: rotate(90deg);
-webkit-transform: rotate(90deg);
background-color:Red;
}
答案 0 :(得分:47)
您正在使用transform
,因此它会更改元素的可视格式化模型。
来自MDN:
CSS转换属性允许您修改的坐标空间 CSS视觉格式化模型。使用它,元素可以翻译, 根据设置的值旋转,缩放和倾斜。
来自MDN的一行:
通过修改坐标空间,CSS转换会改变位置 和受影响的内容的形状,而不会破坏正常 文件流程。本指南介绍了使用方法 变换。
来自W3C:2个模块交互
此模块定义了一组影响视觉效果的CSS属性 渲染应用这些属性的元素;这些 在元素的大小和位置之后应用效果 根据[CSS21]中的Visual formatting model。一些 这些属性的值会导致创建containing block和/或创建stacking context。
所以你有一个父元素,其尺寸如下。
width: 1096px;
height: 434px;
现在您正在使用
转换该元素-webkit-transform: rotate(90deg);
所以在这里,元素在视觉上变换,但不是字面上的变换,换句话说,虽然你变换了一个元素,但它在文档上物理上就像静态元素一样,它只是在视觉上转换元素。我将分享一个图表,让你以更好的方式理解......
所以尽管你改变了这样的元素,但是由于你的变换元素的height
仍然占据了垂直空间,它确实在视觉上进行了转换,但并没有字面意思......
那么,现在解决方案是什么?在子元素上使用position: absolute;
,无论如何,您在父元素上使用position: relative;
。
#RotationDiv {
-ms-transform-origin: 539px 539px;
-webkit-transform-origin: 539px 539px;
width: 434px;
height: 1096px;
position: absolute;
overflow: visible;
-ms-transform: rotate(90deg);
-webkit-transform: rotate(90deg);
background-color:Red;
}
让我们有一个测试用例,我的样式如下
.parent .transformed {
height: 200px;
width: 200px;
background: #f00;
-moz-transform: rotate(120deg);
-webkit-transform: rotate(120deg);
transform: rotate(120deg);
-moz-transform-origin: 300px 300px;
-webkit-transform-origin: 300px 300px;
transform-origin: 300px 300px;
}
.parent .static {
background: #00f;
height: 200px;
width: 200px;
}
在这里,我正在转换class
.transformed
transform
的元素,所以如果你看到,元素会position: absolute;
并且我也在修改原点,但是下一个框不会移动up,因为变换后的元素占据了流中的文字空间,它不会像position: absolute;
那样脱离流,但这就是单独的概念。
所以你需要使用div
或你的absolute
仍然会占用垂直空间,因此你会看到滚动条......
正如你评论的那样,是的,IE仍然会显示滚动条,因为位于overflow
的元素仍然存在于相同的维度中,那么这里的锻炼是什么?
答案 1 :(得分:5)
这是因为它仍在使用垂直属性(正如hmore009在评论中所述)。
如果我们看看这里你可以看到它在做什么,所以你知道这是真的。
所以容器的高度和宽度如下:
width: 1096px;
height: 434px;
现在你已经做了正确的事情并将它们交换为转换#RotationDiv
:
width: 434px;
height: 1096px;
如果我们要将容器更改为overflow: hidden;
,这意味着我们无法看到任何额外的高度。
但我想由于某种原因你不想这样做,可能是由于不知道为什么会造成溢出。所以让我们仔细看看发生了什么。
如果我们从#RotationDiv
移除高度,则溢出不再存在。那有点连线不是吗?嗯不,高度被用于变换和垂直高度。
现在,如果我们给#RotationDiv
与容器相同的高度,我们可以看到没有溢出。
现在,如果我们将1px
添加到那个高度上,我们就会开始溢出。嗯,所以高度必须导致这个。即使我们正在改变高度似乎仍然被用于容器中的垂直高度。
我们已经看过一个选项,给容器overflow: hidden;
或完全删除它。这将停止容器内的滚动。
或者您可以获得一个图像编辑器(有一些免费的在线版本)并像这样翻转图像。这样做可以省去很多麻烦。
除此之外,你可以翻转图片只删除#RotationDiv
并给出容器background: red;
我将如何使用转换:
我会取消overflow: auto;
,移除不需要的div
并在img
上设置转换。
取决于你想要的方式,有很多方法。我认为最好的方法是不使用变换,只需使用图像编辑器(例如Photoshop)翻转图像。
答案 2 :(得分:0)
我也遇到了导致溢出的问题
我的问题是水平缩放会导致水平溢出,所以我所做的只是将水平缩放更改为垂直缩放并解决了问题(或绕过问题tbh)
我对这个错误的理解是因为它没有共同的解决方案,因此只需绕过它。