CSS3翻转:第一行翻转了-45度,第二行翻转了45度,为什么在视觉上不对称呢,如何让第一行和第二行对称

html-css08

CSS3翻转:第一行翻转了-45度,第二行翻转了45度,为什么在视觉上不对称呢,如何让第一行和第二行对称,第1张

整出来的效果:

我的css代码:

.main {margin: 0 auto padding: 0 width: 60% border: 3px solid #FB3 height: 710px

    position: relative

}

.one{

    height: 6em line-height: 6em

    position: absolute top: 0 left: 0 width: 100%

    -webkit-perspective:150px

    perspective:150px

    -webkit-transform-origin: center top

    transform-origin: center bottom

}

.one>div, .three>div {

    -webkit-transform:rotate3d(1,0,0,-90deg) scaleZ(3)

    transform:rotate3d(1,0,0,-45deg) scaleZ(3)

    perspective:150px

}

.two{

    position: absolute top: 3.55em left: 0

    height: 6em line-height: 6em width: 100%

    -webkit-perspective:150px

    perspective:150px

    -webkit-transform-origin: center bottom

    transform-origin: center top

}

.two>div, .four>div {

    -webkit-transform:rotate3d(1,0,0,45deg) scaleZ(3)

    transform:rotate3d(1,0,0,45deg) scaleZ(3)

    perspective:150px

}

.three{

    height: 6em line-height: 6em

    position: absolute top: 9em left: 0 width: 100%

    -webkit-perspective:150px

    perspective:150px

    -webkit-transform-origin: center top

    transform-origin: center bottom

}

.four{

    height: 6em line-height: 6em

    position: absolute top: 12.5em left: 0 width: 100%

    -webkit-perspective:150px

    perspective:150px

    -webkit-transform-origin: center top

    transform-origin: center bottom

}

.red {background-color: red float: left font-size: 4em width: 25% text-align: center}

.blue {background-color: blue float: left font-size: 4em width: 25% text-align: center}

.green {background-color: green float: left font-size: 4em width: 25% text-align: center}

.yellow {background-color: yellow float: left font-size: 4em width: 25% text-align: center}

1、one,two,three,four这几个div都是舞台,容器元素,所以不在这几个上面应用3d变化。只是设置视角什么的。

他们的子元素设置变化。

2、one,two,这些元素使用了绝对定位。使用绝对定位主要是,大家变换以后中间有空隙,为了消除空隙,使用translate3d对Y进行变换消除空隙应该是不行的,因为变化以后相邻两个图形大小不一致了。当然3D空间中两个不一样大的东西在图片上看起来一样大,应该也是可以的,不过这个就很复杂了吧,只变化Y肯定是不行的。你的不对成应该主要就是因为这个。

3、one,two,这些容器元素我设置了高度,实际上也可以不设置高度,高度主要是用来计算消除空隙的,但是消除多少(也就是每个容器的top应该设置为多少)这个我现在也不会算,图里面是试出来的。不过看你的图没有空隙,你应该有自己的计算方法吧。

试了好久,想的脑袋疼 =。=!

方法:transform:rotate(45deg)

transform是转换的意思,里面有矩阵属性,X,Y,Z轴的变换等。

rotate用的是他的旋转属性45deg,就是旋转45度

例子:

html:<div class="byl"></div>

css:.byl{width:100pxheight:100pxbackground:#ddd-webkit-transform:rotate(45deg)}

css3新增的一个控制元素旋转属性的函数是rotate()[不要怀疑,它的确是一个隐形的函数,他的使用很类似与js中的函数]。

同之前所讲过的translate和scale,他也分为2D和3D的旋转,差别就是Z轴的旋转。

现在我们来看实例,代码如下:

<style>

.demo { margin:100px autowidth:300pxheight:300pxbackground:#edededborder:1px dotted #ff0000position:relative}

.fl { width:300pxheight:145pxbackground:#00cb99}

.fr { width:300pxheight:145pxmargin-top:10pxbackground:#0093b4}

.pa { position:absolutetop:75pxleft:75pxwidth:150pxheight:150pxbackground-color:#f2f2f2}

</style>

<div class="demo">

<div class="fl"></div>

<div class="fr"></div>

<div class="pa"></div>

</div>

demo的div里面有三个div,最终实现的效果如下图:

现在我们对其应用rotate,假设不知道里面可以传入几个值,那我们可以分别试试传入不同数量的值对比效果,给demo加上:

transform:rotate(45deg)(旋转45度,deg是degree的缩写,意为角度;当然这只是一个单位,还有别的单位,但不常用;你也可以直接采用数字而不用单位,这个数字会被自动转换为角度)

效果如下图:

我们再给demo加上:

transform:rotate(45deg,45deg)

会发现没有变化,查看代码知道原来这个属性浏览器没有识别出来,这是为什么呢?

这是因为默认的rotate()只能传入一个旋转角度值,而且默认的角度是以电脑屏幕的基准面,以自己的中心为基准点进行旋转的。说白了他是一个二维的旋转。

那,我么应该怎么rotate进行三维的旋转呢?

很简单我之前又讲到过translate的translate3d这一属性;同样rotate也有rotate3d的旋转属性。

既然是3d,那我们就很自然的知道他有rotateX()/rotateY()/rotateZ(),这三个分支的旋转属性。

现在我们给demo加上

transform:rotate3d(45deg,45deg,0deg)

在浏览器当中我们同样会发现不起效果,原因还是不识别。

其实这就是rotate3d和translate3d,不同的地方,translate3d传入的三个值分别会被解析为XYZ的位移距离,二translate则不会这么解析,官方给出的解析方法是rotate3d(X?,Y?,Z?,angle)也就是你需要对你需要旋转的轴进行判断,如果你要沿着该轴转动那就将该轴的值设置为1,否则为0;然后在后面的angle中设置旋转的角度,需要注意的是,angle只有一个角度值。

所以上面正确的写法是:

transform:rotate3d(1,1,0,45deg)

效果如下图:

分析:

上图画的坐标轴没画好,见谅哈。

横的是X轴,竖的是Y轴,斜线是Z轴(也就是你盯着电脑看视线到电脑这个轴)

rotate的转动基准是以轴来转动的,当多个轴交叠旋转才会形成围绕某个点旋转的效果。

元素默认情况下,他所在的面是Z轴与Y轴所形成的面(或平行面)。当谈围绕X轴转,若传入的为正值,则元素上面会向屏幕里面转动,下面回向屏幕外面转动,也就是向用户转动。其他的几个面也是同样的道理。

现在我们来看沿着单个轴转动的情况,这样会帮助你理解上面这段话。

现在我给demo加上

transform:rotateX(45deg)

有没有发现图象显得没有原来的高了,对比下两边的图象。

其实元素的高度并没有变,而是透视导致。

现象一张纸看他的侧面和看他的正面,所得到的宽度是不一样的。

rotateY()/rotateZ()

这里我就不做介绍了。因为它们的使用和rotateX一样,只是转的角度不同罢了。

好了rotate的初级使用就介绍到这里了。