使用CSS3转换后的溢出行为

时间:2014-01-21 02:39:21

标签: html css3 css-transforms css

请查看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;
}

3 个答案:

答案 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);

所以在这里,元素在视觉上变换,但不是字面上的变换,换句话说,虽然你变换了一个元素,但它在文档上物理上就像静态元素一样,它只是在视觉上转换元素。我将分享一个图表,让你以更好的方式理解......

enter image description here

所以尽管你改变了这样的元素,但是由于你的变换元素的height仍然占据了垂直空间,它确实在视觉上进行了转换,但并没有字面意思......

enter image description here


那么,现在解决方案是什么?在子元素上使用position: absolute;,无论如何,您在父元素上使用position: relative;

Demo

#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;
}

Test Case

在这里,我正在转换class .transformed transform的元素,所以如果你看到,元素会position: absolute;并且我也在修改原点,但是下一个框不会移动up,因为变换后的元素占据了流中的文字空间,它不会像position: absolute;那样脱离流,但这就是单独的概念。

enter image description here

所以你需要使用div或你的absolute仍然会占用垂直空间,因此你会看到滚动条......


Poopy IE兼容解决方案

正如你评论的那样,是的,IE仍然会显示滚动条,因为位于overflow的元素仍然存在于相同的维度中,那么这里的锻炼是什么?

  • 首先,您正在转换要在父容器中设置的元素,同样,您不需要overflow所以第一个问题是,如果您不需要auto为什么要使用hidden?您可以使用hidden

  • 如果不是overflow: hidden;到父级,并且您期望在转换后的元素下面放置一些内容,那么将转换后的元素包装在另一个元素中,并将相同的维度设置为{{1并确保将position: absolute;属性移动到此块。 - Demo

  • 如果还不开心?那为什么transform整个元素?仅transform相关图片 - Demo

答案 1 :(得分:5)

这是因为它仍在使用垂直属性(正如hmore009在评论中所述)。

如果我们看看这里你可以看到它在做什么,所以你知道这是真的。

示例1:

所以容器的高度和宽度如下:

width: 1096px;
height: 434px;

现在你已经做了正确的事情并将它们交换为转换#RotationDiv

width: 434px;
height: 1096px;

如果我们要将容器更改为overflow: hidden;,这意味着我们无法看到任何额外的高度。

DEMO HERE


示例2:

但我想由于某种原因你不想这样做,可能是由于不知道为什么会造成溢出。所以让我们仔细看看发生了什么。

如果我们从#RotationDiv移除高度,则溢出不再存在。那有点连线不是吗?嗯不,高度被用于变换和垂直高度。

DEMO HERE


那么我们怎么知道造成这个的高度呢?

现在,如果我们给#RotationDiv与容器相同的高度,我们可以看到没有溢出。

DEMO HERE

现在,如果我们将1px添加到那个高度上,我们就会开始溢出。嗯,所以高度必须导致这个。即使我们正在改变高度似乎仍然被用于容器中的垂直高度。

DEMO HERE


我们如何解决这个问题?

我们已经看过一个选项,给容器overflow: hidden;或完全删除它。这将停止容器内的滚动。

DEMO HERE

或者您可以获得一个图像编辑器(有一些免费的在线版本)并像这样翻转图像。这样做可以省去很多麻烦。

除此之外,你可以翻转图片只删除#RotationDiv并给出容器background: red;

DEMO HERE

我将如何使用转换:

我会取消overflow: auto;,移除不需要的div并在img上设置转换。

取决于你想要的方式,有很多方法。我认为最好的方法是不使用变换,只需使用图像编辑器(例如Photoshop)翻转图像。

DEMO HERE

答案 2 :(得分:0)

我也遇到了导致溢出的问题

我的问题是水平缩放会导致水平溢出,所以我所做的只是将水平缩放更改为垂直缩放并解决了问题(或绕过问题tbh)

我对这个错误的理解是因为它没有共同的解决方案,因此只需绕过它。