我有一个父div,我正在应用-90度的旋转变换。在div中,其中一个孩子不应该变换,我尝试变换:none及其所有变体,但没有任何效果,无论如何都会变换。因此,我必须对子元素应用反向旋转以将其设置为水平。
现在出现的问题是,更改应用了反向旋转的子项的左侧实际上会更改其顶部,并且在使用Firebug更改时,更改顶部会更改其左侧。因此子元素显示在错误的位置。
if(self._sOrientation == "vertical"){
self.RotatePH($thisComp.closest('.ComponentFrame'),"-90deg");
if(self.isIE==false){
self.RotatePH($thisComp.find('.revertTransform'),"90deg");
// $thisComp.find('.revertTransform').css('-moz-transform', 'none');
}
实际上,组件太复杂,无法在堆栈溢出时提供任何可用的代码
修改
我认为第二次旋转应该围绕主要部件的轴而不是围绕自身旋转。是否可以改变旋转轴?
孩子有位置:固定;如果重要
答案 0 :(得分:3)
我创建了Fiddle以更好地了解您的问题,我认为这不是与转换轴相关的事情。
更简单地说,当你改变子元素的顶部或左侧位置时,它会正确地引用它的父元素然后进行转换。
所以你看到的最终效果是当你调整顶部和反面时,对象正在改变它的左侧位置,但事实上并非如此。
我建议你改变你的方法,如果它适用于你的情况,并创建一个false_parent元素,而不是一个孩子(你可以在小提琴中看到)。
//INSTEAD OF THIS APPROACH
<div class="parent">PARENT DIV
<div class="child">CHILD DIV</div>
</div>
//USE THIS APPROACH
<div class="fake_child">CHILD DIV
<div class="fake_parent">PARENT DIV</div>
</div>
CSS
.parent {
width:100px;
margin:3em;
padding:2em;
transform:rotate(45deg);
-ms-transform:rotate(45deg);
/* IE 9 */
-webkit-transform:rotate(45deg);
background-color:rgb(0, 112, 255);
}
.child {
background-color: #fff;
position: absolute;
padding:1em;
transform:rotate(-45deg);
-ms-transform:rotate(-45deg);
-webkit-transform:rotate(-45deg);
}
.fake_child{
width: 100px;
background-color: #fff;
padding: 1em;
margin: 3em;
position: relative;
}
.fake_parent{
position:absolute;
width:100%;
height:200%;
background-color: rgb(0,121,255);
top:0;
left: 0;
transform:rotate(45deg);
-ms-transform:rotate(45deg);
/* IE 9 */
-webkit-transform:rotate(45deg);
z-index: -1;
}
body {
background-color: #ccc;
font-family: Arial, sans-serif;
}
答案 1 :(得分:0)
你不能使用transform-origin(http://css-tricks.com/almanac/properties/t/transform-origin/):
-webkit-transform-origin: center center;
-moz-transform-origin: center center;
-o-transform-origin: center center;
transform-origin: center center;
答案 2 :(得分:0)
我认为第二次旋转应该围绕主要部件的轴而不是围绕自身旋转。是否可以改变旋转轴?
是的,如果您知道父母的宽度(或者孩子宽度与父母宽度的比例,我相信)。您可以使用transform-origin
通过设置transform-origin: hpw hpw
让孩子旋转回原始位置,其中hpw
是父级宽度的一半。
如果我们只旋转了父级,并且子级相对于父级位于(0,0),则子级将最终位于父级的左下角。想象一个盒子的宽度和高度都设置为父级的宽度,并相对于旋转的父级位于(0,0)。 (因此孩子就在这个盒子的左下角。)应该清楚的是,旋转这个盒子会让孩子回到它的原始位置和旋转。
孩子的左上角和左上角仍然是相对于旋转的父级,因此您必须使用left: your_top * -1
和top: your_left
定位孩子。
演示:http://jsfiddle.net/HTCwL/1/
修改:这是一个动画版的演示版,可以让事情更清晰http://jsfiddle.net/HTCwL/2/
相关CSS:
#parent {
width: 150px;
height: 300px;
border: 1px solid blue;
position: relative;
top: 10px; left: 150px;
-webkit-transform: rotate(-90deg);
}
#child {
position: absolute;
width: 100px;
height: 100px;
left: -10px;
top: 150px;
border: 1px solid red;
-webkit-transform: rotate(90deg);
-webkit-transform-origin: 75px 75px;
}
编辑:是的,有固定职位的孩子。来自https://developer.mozilla.org/en-US/docs/Web/CSS/transform,
如果属性的值不同于[...],则对象将充当位置的包含块:它包含的固定元素。
固定元素的包含块通常是html元素(参见http://www.w3.org/wiki/CSS_absolute_and_fixed_positioning#Containing_blocks),但是当固定元素的父元素具有变换集时,它将成为它们的包含块。我不知道有什么方法可以避免这种情况。