热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

元素转换Transform

所谓元素转换,其实就是对元素的坐标在二维或三维空间上做矩阵换算。根据换算的结果,又分成了多种转换类型。但无论是哪一种,都不影响元素在页面上的物理空间,只改变元素的视觉效果。也就是说

所谓元素转换,其实就是对元素的坐标在二维或三维空间上做矩阵换算。根据换算的结果,又分成了多种转换类型。但无论是哪一种,都不影响元素在页面上的物理空间,只改变元素的视觉效果。也就是说,比如元素缩放、旋转都不影响周围其他元素的布局。有些开发者喜欢用平移做元素居中效果,其实非常不妥,因为元素原来的物理空间还在那里,控制起来不轻松。

另外,转换属性(transform)只有一个,因此,转换类型不能叠加。也就是说,如果之前做了旋转(rotate),如果再做平移(translate),旋转效果就会消失。如果既想平移,又想旋转,必须使用matrix方法。

设置转换原点

转换原点在缩放、倾斜和旋转中很重要,具体参考各转换。转换原点默认是元素的中心,即transform-origin: 50% 50% 0。

转换矩阵

在二维空间中,转换矩阵是一个3x3矩阵;在三维空间中,是4x4矩阵。下面这个公式左边的2x2矩阵,就是一个转换矩阵,因为是2x2的,所以只能做缩放、旋转、倾斜,不能做平移。因此,实际上,浏览器使用的是3x3或4x4的矩阵。

矩阵右边(x,y)是原坐标,(ax+cy, bx+dy)是转换后的坐标。

技术分享

CSS 2D transforms

Translating –平移

平移和position:relative效果相似,不影响元素的物理空间位置,只影响视觉空间位置,也就是说虽然看起来元素已经离开了原来的位置,但它所占的物理空间依然是原来位置,并且只在原位置上对其他元素有影响。

平移的距离即可以使用像素值,也可使用百分比。如果是百分比,则盒子的宽高(width & height)决定了百分比的最终值,其中,水平位移取决于盒子宽度,垂直位移取决于盒子高度。

transform: translate(50px, 100px);
transform: translateX(50px);
transform: translateY(50%);
transform: translateY(100px);

在不支持的浏览器中,使用position:relative,然后通过top和left即可以调整。

Scaling – 缩放

缩放即指放大缩小,但效果只相当于用放大镜看,元素所占的物理空间依然没有变化。因此,放大或缩小元素,不影响周围其他元素的布局。

当然,放大缩小也是有方向的,因为原点默认是中心点,所以默认是中心向四周放大。如果要修改放大缩小方向,需要修改transform-origin。

如果有一个值为0,等价于设置width或height为0;如果scale只接受了一个参数,表示x和y方向缩放同样倍数。

transform: scale(2.5);
transform: scale(2, 1);
transform: scaleX(2);
transform-origin: left top;

Skewing – 倾斜

倾斜有向X轴倾斜和向Y轴倾斜,其中向X轴倾斜在视觉上是逆时针扭曲,向Y轴倾斜在视觉上是顺时针扭曲。因此,如果X轴和Y轴倾斜角度相同,而正负相反,则等同于旋转(rotate),旋转方向由第一个值决定。

一个维度倾斜的时候,另一个维度的大小保持不变。比如,skew(30deg),表示向X轴方向倾斜30度,但元素的纵轴高度保持不变。

transform: skew(30deg);
transform: skew(30deg, 0);
transform: skew(30deg, -30deg);

注意:倾斜没有3D转换。

Rotating – 旋转

二维旋转其实就是在三维空间上绕Z轴旋转,旋转方向为顺时针方向,原点默认是元素的中心点,因为transform-origin的默认值为transform-origin:50% 50% 0。如果要把左上角设为原点,则应该设置transform-origin为transform-origin: 0 0 0。

transform: rotate(30deg);
CSS 3D transform

以下提到的3D转换,在IE9都不支持。

Translating -平移

3D平移和2D平移没有什么差别,最后一个z轴坐标没有任何影响。注意z轴坐标和z-index完全是两码事,互不影响。

transform: translate3d(50px, 100px, 0);

Scaling - 缩放

3D缩放需要注意的是缩放原点,原点决定了缩放方向,对视觉效果影响很大。

Rotating – 旋转

转换方法rotate3d()、rotateX、rotateY、rotateZ理论上都只使用于三维空间,比如rotateX和roateY在二维空间就中无效。但rotate3d和rotateZ却可以做XY二维空间换算,比如,如果rotate3d(0, 0, 1, 10deg)就可以让元素在二维空间上顺时针旋转10度,同理,rotateZ(10deg)也可以让元素在二维空间上顺时针旋转10度。需要注意的是,X和Y轴不应该有值,否则就是按三维空间计算了,这会导致转换失败。

transform: rotate3d(0, 0, 1, 30deg);

注意:ie9不支持rotate3d、rotateX、rotateY、rotateZ方法。

Perspective - 透视

透视表示z=0平面和用户之间的距离,透视值越大,则离用户越近,看起来也越大;透视值越小,则离用户越远,看起来也要越小。

透视只在三维空间有效,有点像z-index。

transform: perspective(1);
兼容性

早版本的Firefox、Chrome、Opera或IE,分别使用一下前缀兼容:

-moz-transform: rotate(30deg);
-o-transform: rotate(30deg);
-webkit-transform: rotate(30deg);
-ms-transform: rotate(30deg);
transform: rotate(30deg);

IE

IE的BasicImage滤镜支持四个旋转值:0,1, 2, 和 3分别对应0, 90, 180和 270度。

filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);

另外,IE有一个矩阵滤镜,也可以做到CSS的transform效果,具体参考:https://msdn.microsoft.com/en-us/library/ms533014%28VS.85,loband%29.aspx

如果自己算不来,这里还有一个工具可以帮助你计算:http://www.useragentman.com/IETransformsTranslator/。注意,用高版本的IE在兼容模式下不一定能看这些效果,需要真实的该版本IE才能看到。

元素转换-Transform


推荐阅读
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 在project.properties添加#Projecttarget.targetandroid-19android.library.reference.1..Sliding ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 本文介绍了一种解析GRE报文长度的方法,通过分析GRE报文头中的标志位来计算报文长度。具体实现步骤包括获取GRE报文头指针、提取标志位、计算报文长度等。该方法可以帮助用户准确地获取GRE报文的长度信息。 ... [详细]
  • PDF内容编辑的两种小方法,你知道怎么操作吗?
    本文介绍了两种PDF内容编辑的方法:迅捷PDF编辑器和Adobe Acrobat DC。使用迅捷PDF编辑器,用户可以通过选择需要更改的文字内容并设置字体形式、大小和颜色来编辑PDF文件。而使用Adobe Acrobat DC,则可以通过在软件中点击编辑来编辑PDF文件。PDF文件的编辑可以帮助办公人员进行文件内容的修改和定制。 ... [详细]
  • CentOS 6.5安装VMware Tools及共享文件夹显示问题解决方法
    本文介绍了在CentOS 6.5上安装VMware Tools及解决共享文件夹显示问题的方法。包括清空CD/DVD使用的ISO镜像文件、创建挂载目录、改变光驱设备的读写权限等步骤。最后给出了拷贝解压VMware Tools的操作。 ... [详细]
author-avatar
hedongsheng
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有