CSS3之2D与3D变换

Wesley13
• 阅读 586

CSS3之2D与3D变换

目录


  • 关于坐标轴

  • 2D变换

  • translate(x,y)

  • rotate(deg)

  • scale(x,y)

  • skew(xdeg,ydeg)

  • matrix(a,b,c,d,e)

  • 3D变换

  • translate3d(x,y,z)

  • rotate3d(x,y,z,deg)

  • scale3d(x,y,z)

  • matrix3d()

  • perspective

  • perspective-origin

  • backface-visibility

  • 其他属性

  • transform-origin

  • transform-style


css3实现了对元素执行2D平面变换,以及视觉上的3D空间变换,2D变换平时可能用的较多,3D效果也能锦上添花;

关于坐标轴

初中数学的几何学里我们便开始接触坐标轴,最基本的是平面直角坐标系 XoY,然后延伸出空间直角坐标系 XYZ,现在我们来说一下css中的坐标系;

css甚至一下设备相关的开发中,基本都遵循这样一套坐标系:以手机屏幕为例,坐标系圆点位于屏幕最左上角;x轴水平,向右为正方向;y轴垂直,向下为正方向;z轴垂直于整个屏幕平面,向外为正方向,就是屏幕光线射向你眼睛的方向;

如图:

2D变换

包括平移 translate(),旋转 rotate(),缩放 scale(),倾斜 skew(),矩阵 matrix()

translate(x,y)

平移操作,包括 translateX(x)translateY(y),括号内填平移参数值,可以是负值,即反方向;

例如:

  1. div {

  2. /*元素向右平移50px,向下移60px*/

  3. transform: translateX(50px);

  4. transform: translateY(60px);

  5. }

  6. /*简写形式,效果相同*/

  7. div {

  8. transform: translate(50px, 60px);

  9. }

注意 translate()只指定一个值则默认是x轴位移,即水平移动;

rotate(deg)

元素旋转,括号中参数为旋转角度,顺时针为正值,逆时针为负值,单位为 deg,即多少度;

例如:

  1. div {

  2. /* 顺时针旋转30° */

  3. transform: rotate(30deg);

  4. }

scale(x,y)

缩放元素,参数分别为x轴,y轴缩放倍数,包括 scaleX(x)和 scaleY(y),提供一个参数表示按比例缩放;

例如:

  1. div {

  2. /* 横向缩小一半,纵向放大一倍 */

  3. transform: scale(.5, 2);

  4. }

  5. div {

  6. /* 按比例放大3倍 */

  7. transform: scale(3);

  8. }

skew(xdeg,ydeg)

包含 skewX(deg)skewY(deg),表示在水平和垂直方向倾斜的角度;

例如:

  1. div {

  2. transform: skewX(30deg);

  3. transform: skewY(45deg);

  4. }

  5. /* 简写 */

  6. div {

  7. transform: skew(30deg, 45deg);

  8. }

需要注意,如果元素为一个矩形,那么 skewX(30deg)表示矩形顶边固定,底边向右倾斜 30deg; skewY(30deg)表示矩形左边框固定,右边框向下倾斜 30deg

可以根据上面讲的屏幕坐标系来记忆,x轴位于屏幕顶部,方向向右;y轴位于屏幕左部,方向向下;

如果 skew()只指定一个值,默认是水平倾斜

skewX(30deg) 的效果:

skewY(30deg) 的效果:

matrix(a,b,c,d,e)

这是一个综合属性,之前的平移,缩放,旋转,倾斜都能通过这个矩阵函数实现,对,大学里线性代数中的矩阵 T_T;

其实这个函数就是前面四种操作的原理,函数共有六个参数,四种操作都对应不同的参数改变方式,像我们这种非数学专业的就不赘述原理了,前面的操作基本够用了(想寻找刺激就去百度“css matrix”吧)~~;

3D变换

所谓3D就是在前面2D平面上多了一个z轴,方法名也差不多,然后能以分别以三根轴位基准进行变换,实现立体效果;

看一下所有3D操作方法:

translate3d(x,y,z)

结合前面讲的空间坐标系和 x, y, z轴的位置,三个参数分别对应元素在三个坐标轴方向的平移值,也包含三个方法 translateX(x)translateY(y)translateZ(z)

举例:

  1. div {

  2. transform: translateX(50px);

  3. transform: translateY(60px);

  4. transform: translateZ(70px);

  5. }

  6. /* 简写 */

  7. div {

  8. transform: translate3d(50px, 60px, 70px);

  9. }

注意: 关于设置 translateZ(z) 看不出效果的问题,后面说到设置 persoective时会解释;

rotate3d(x,y,z,deg)

参数 x,y,z为空间坐标系的一个坐标位置,然后由原点 (0,0,0)指向这个点形成一个有方向的新轴,数学中称矢量,最后一个参数就是元素围绕刚才所形成的新轴旋转的度数;

也包括 rotateX(deg)rotateY(deg)rotateZ(deg),之前2D的 rotate() 便是这里的 rotateZ()

至于旋转的方向,判断方法类似于物理中的左手定则:角度指定为正的话,左手拇指与四指垂直,拇指指向元素围绕旋转的坐标轴或自定义轴,四指弯曲围绕方向就是旋转方向;

举例:

  1. div {

  2. transform: rotateX(30deg);

  3. transform: rotateY(30deg);

  4. transform: rotataZ(30deg);

  5. }

  6. /* 自定义轴旋转 */

  7. div {

  8. transform: rotate3d(10, 10, 10, 30deg);

  9. }

rotateX(30deg) 的效果:

rotateY(30deg) 的效果:

关于为什么这里的旋转不是想象中的效果,而是缩小,主要是没有设置视点,后面会讲;

scale3d(x,y,z)

元素关于三个轴的缩放比例,包括 scaleX(x)scaleY(y)scaleZ(z),举例:

  1. div {

  2. transform: scaleX(2);

  3. transform: scaleY(2);

  4. transform: scaleZ(2);

  5. }

  6. /* 简写 */

  7. div {

  8. transform: scale3d(2, 2, 2);

  9. }

需要注意这里的 scaleZ(),正常情况下,扩大z轴会是物体变厚,但是css里面呈现的平面元素并没有厚度,所以这里的缩放z轴其实是缩放元素在z轴的坐标,所以要有效果必须要指定 translateZ()的值;

举例:

  1. body {

  2. perspective: 500;

  3. }

  4. div {

  5. /* 必须这个顺序,先缩放后平移,不然无效果 */

  6. transform: scaleZ(2) translateZ(100px);

  7. }

按照上面样式才能看到 scaleZ(2)的效果,因为后面在z轴上移动了 100px,缩放比例为2,最终会移动 200px,屏幕上则表现为元素放大了一下,这是透视效果,就是那个 perspective 值,下面会讲到;

matrix3d()

和前面2D的 matrix()相似,只不过这里括号里的参数有16个,矩阵更加复杂,跳过吧﹋o﹋,有兴趣可以自行百度~~;

perspective

在上面的示例中,有关z轴的平移和缩放通常情况下是看不出效果的,正是缺少这项属性值,叫做 透视,美术或设计中会出现这个词汇,就是实现物体近大远小的效果,远小最终会小到一个点,那就是 透视点, perspective就是用来设置那个点距离元素有多远,一般300~600很体现很好的透视效果,值越小元素透视变形越严重

需要注意的是,这项属性设置在应用透视效果元素的父元素的样式中,才能看出效果,例如:

  1. body {

  2. perspective: 500;

  3. /* 考虑浏览器兼容 */

  4. -webkit-perspective: 500;

  5. }

也可以设置在元素本身,格式为:

  1. div {

  2. transform: perspective(500);

  3. -webkit-transform: perspective(500);

  4. }

rotateX(45deg) 的更真实的效果:

rotateY(45deg) 的效果:

perspective-origin

此项设置透视点的位置,默认在元素几何中心,需要设置的话,格式如下:

  1. body {

  2. /* 默认中心 */

  3. perspective-origin: center center;

  4. /* 左上角 */

  5. perspective-origin: left top;

  6. /* 右边中心 */

  7. perspective-origin: right center;

  8. /* 底部中心 */

  9. perspective-origin: bottom center;

  10. /* 也可以是长度 */

  11. perspective-origin: 30px 40px;

  12. /*最后记得加 -webkit- 兼容 */

  13. }

perspective-origin: left center 的效果:

perspective-origin: right center 的效果:

backface-visibility

翻译过来叫背面是否可见,可以设置 visible和 hidden,默认可见,比如元素正面有文字,设置背面可见,则关于y轴旋转180°后元素内文字变成镜像,否则不会出现;

backface-visibility: visible 的效果:

backface-visibility: hidden 的效果(有旋转,只是背面不可见,则看不见了):

其他属性

transform-origin

设置2D/3D变化的基准,可以是长度值,也可以是 left,right,top,bottom,例如:

  1. div {

  2. /* 关于元素左上角旋转 */

  3. transform-origin: left top;

  4. transform: rotate(30deg);

  5. }

transform-style

设置元素如何在3D空间呈现被嵌套的元素,选择是 flat 和 preserve-3d,默认 flat

这里这么来理解,之前我们对一个元素执行变换时,都是以屏幕所在平面的坐标系在变换,但是元素如果存在子元素的话, transform-style就是用来确定在哪套坐标系上进行变换, flat表示任然以屏幕坐标系为基准, preserve-3d表示以变换后的父元素所在平面的坐标系为基准;

  1. #parent {

  2. transform-style: preserve-3d;

  3. -webkit-transform-style: preserve-3d;

  4. transform: perspective(500) rotateY(45deg);

  5. -webkit-transform: perspective(500) rotateY(45deg);

  6. }

  7. #child {

  8. transform: perspective(500) rotateX(45deg);

  9. -webkit-transform: perspective(500) rotateX(45deg);

  10. }

flat 的效果:

preserve-3d 的效果:

例如,父元素绕x轴旋转了45度,并且设置 transform-style:preserve-3d,而嵌套的子元素只绕y轴旋转45度,那么最终效果就是子元素绕父元素平面的y轴旋转了45度,看起来就像先x轴转45度后y轴转45度的效果;

最后,别忘了为以上所有特性添加浏览器兼容前缀;

顺便附上一个以上功能综合效果的演示页面,请戳下面阅读原文



CSS3之2D与3D变换

本文分享自微信公众号 - 程序骑士(program-knight)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Easter79 Easter79
2年前
swap空间的增减方法
(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
Java获得今日零时零分零秒的时间(Date型)
publicDatezeroTime()throwsParseException{    DatetimenewDate();    SimpleDateFormatsimpnewSimpleDateFormat("yyyyMMdd00:00:00");    SimpleDateFormatsimp2newS
Stella981 Stella981
2年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这