只要有CSS基础的人肯定都知道,我们可以通过transform中的translate,scale,rotate,skew这些方法来控制元素的平移,缩放,旋转,斜切,其实这些方法呢都是为了便于开发者使用的一个函数;可能大家有时候在用的时候也会有困惑,它们能够改变元素运动,这其中的本质是什么呢?今天我们就来说一说transform: matri()这个东西,如果是2D变换,括号里就是6个值得矩阵,如果是3D变换,括号里就是4*4的16值得矩阵,今天我们就先来看看这个2D变换改变参数达到元素变换的原理。

首先带大家来了解一个概念(实在不喜欢看文字的可以略过这段)

[ 首先我们来说一说何为矩阵,这就要先来扯一扯线性代数的知识了,其实任何一种运动都是在一个特定的空间里进行的,这个空间有它自己特定的运动变换规则,我们的线性空间就属于空间中的一种,线性空间中的运动我们就称之为线性变换,在线性空间里,我们要把一个点运动到任意的另一个点,都可以用线性变换来表示,如何表示呢?当我们在这个线性空间里选择了一个基(所谓基就是能够用来表示空间中所有对象的向量组),那么我们就可以用向量来描述空间中的任何一个对象,然后用矩阵来描述空间中的变换。而使某个对象发生运动的方法就是用代表运动的矩阵乘以代表对象的那个向量。也就是说,在线性空间选定基之后,++向量刻画对象,矩阵刻画对象的运动,用矩阵与向量的乘法施加运动++。]

  • 好了,我们要开始讲重点喽

平移

在CSS3中我们矩阵的原始值是这样的:

transform: matrix(1,0,0,1,0,0);

写成我们数学里矩阵的形式是这样的

这么看起来,我们不太好分辨哪个数字对应的是我们上面写的matrix值里的哪一个,那为了便于描述我们把它写成:

transform: matrix(a,b,c,d,e,f);

那么写成数学矩阵式就是这样的:

根据我们上面说的用矩阵与向量的乘法来施加运动,我们就可以来看一下它到底是怎么运动起来的

(怎么算的?线性代数忘光光的同学看这里,其实只要把前面横着的a,c,e与后面竖着的x,y,1相乘再相加就ok了)

这么一来我们可以得到一个式子就是:

x'=ax+cy+e
y'=bx+dy+f

x'和y'就是我们变换后的水平位置坐标和垂直位置坐标,现在我们想要把元素往x轴的正方向平移10,在y轴方向上不动,反映到方程式里,我们要怎么来实现呢

元素往x轴的正方形平移10,在y轴方向上不动,反映到方程式里:
x'=ax+cy+e ---(x'=ax+cy+e+10)
y'=bx+dy+f (不变) 元素往y轴的正方向平移10,在x轴方向上不动,反映到方程式里:
x'=ax+cy+e (不变)
y'=bx+dy+f ---(y'=bx+dy+f+10) 元素同时往x轴正向和y轴正向移动10个单位 :
我们用css矩阵来写:transform: matrix(1,0,0,1,10,10)--其他数值都不动,e和f分别加10
结论:平移只有跟e和f有关系,跟其他a,b,c,d没有关系,它们该怎么样还是怎么样,e对应x轴的平移,f对应y轴的平移,往正方向平移多少单位就加上多少单位,反之则减去多少个单位。

缩放

平移就是x或者y加减一个常数来得到的,理解了平移之后缩放就很简单了,可不就是x和y的倍数发生了变化么,反映到式子上来那就是系数的变化,那同样道理我们把上面的式子拿过来

x放大2倍 y不变
x'=ax+cy+e---(x'=2ax+cy+e) 就是x的系数增大2倍
y'=bx+dy+f (不变)
y放大2倍 x不变
x'=ax+cy+e (不变)
y'=bx+dy+f---(y'=bx+2dy+f) 就是y的系数增大2倍
x和y都放大2倍,就是x和y的系数都增大2倍
写成矩阵就是:
transform:matrix(2,0,0,2,0,0)
结论:缩放只有跟a和d有关系,跟其他数值都无关,a对应x轴缩放,d对应y轴缩放,缩放多少倍就乘以多少

旋转

相比于平移和缩放,旋转相对来说要复杂点了,当然搞清楚了就没什么难的了

请看

transform:matrix(cosθ,sinθ,-sinθ,cosθ,0,0);

请看实例:

现在我们要让这个元素往顺时针方向旋转45°(sin45°=0.707,cos45°=0.707),那么我们给div加样式如下:

transform: matrix(0.707,0.707,-0.707,0.707,0,0);

看下我们div现在的样子

这个div是不是就按我们预期的一样往顺时针方向转了45°了;

接下来我们把这个旋转放到数学里来看下

那同样的我们把它写成数学里矩阵的形式:

同样的根据矩阵的计算公式,我们可以得到公式:

x'=xcosθ-ysinθ;
y'=xsinθ+ycosθ

现在我们先把公式放在这里,我们来看一下下图的这个正方形,从图中我们可以知道a,b,c,d的坐标分别为:

A(0,1)   B(1,1)   C(1,0)   D(0,0)

当我们让它旋转90°之后,那此时的cos45°就是0 sin45°都为1,分别把A,B,C,D里的x,y代入上面的公式之后我们可以得到:

A'(0.707,0.707)   B'(1.414,0)   C'(0.707,-0.707)   D'(0,0)

现在这个正方形就变成了下图的样子,和我们写代码达到的效果是一样的:

结论:我们要记住初始写法是这样的

transform:matrix(cosθ,sinθ,-sinθ,cosθ,0,0);然后需要旋转多少度就计算出这个度数的cosθ,sinθ就可以达到我们想要的效果啦

对CSS3中的transform:Matrix()矩阵的一些理解的更多相关文章

  1. css笔记——区分css3中的transform transition animation

    出处:http://blog.csdn.net/dyllove98/article/details/8957232   CSS3中和动画有关的属性有三个  transform. transition  ...

  2. CSS3中的transform

    CSS3 转换,我们能够对元素进行移动.缩放.转动.拉长或拉伸. transform 在2D里主要是4个方法.除了rotate 其他都是接受x y值 translate skew rotate sca ...

  3. CSS3中动画transform必须要了解的Skew变化原理

    transform是CSS3中比较安全的动画(对于性能来说),其中有一些动画属性,来执行不同的变化.今天我们来了解skew的变化原理. skew,其实使用的频率不是很高,当然也没有最低.但是往往,一直 ...

  4. CSS3中的transform变形

    在CSS3中,用Transform功能可以实现文字或图像的旋转.缩放.倾斜.移动这四种类型的变形,这四种变形分别使用rotate.scale.skew和translate这四种方法来实现.将这四种变形 ...

  5. css3 transform matrix矩阵的使用

      Transform 执行顺序问题 — 后写先执行 matrix(a,b,c,d,e,f) 矩阵函数 •通过矩阵实现缩放 x轴缩放 a=x*a    c=x*c     e=x*e; y轴缩放 b= ...

  6. css3中trastion,transform,animation基本的了解

    毕业答辩一耽误就是一个月的时间,感觉自己浪费好多时间,而且学习劲头都没有以前的好,学习是个漫长艰苦的事情,也出现了好多问题,希望自己有则改之,无则加冕,曾国藩曾说过:悔者,所以守其缺而禾取求全也.虽然 ...

  7. css3中的transform、transition、translate、animation(@keyframes)的区别

    一.前言 在CSS中,我们经常会使用到transform.transition.translate.animation(@keyframes)这些长得相似,又不好区分的属性(值).每当需要使用它们,都 ...

  8. css3中有关transform的问题

    Transform属性应用于元素的2D或3D转换.这个属性允许你将元素旋转,缩放,移动,倾斜等.

  9. CSS3中的transform转换属性

    属性 transition-property 定义对象中参与过度的属性 transition-delay 延迟 transition-duration 持续时间 transition-timing-f ...

随机推荐

  1. XSS Challenge(1)

    XSS Challenges http://xss-quiz.int21h.jp/ Stage #1 注入alert(document.domain),先试一试输入后会返回什么: 返回在标签中,直接尝 ...

  2. 如何在 Windows Event Log 中查找系统重启的信息

    事件ID:12 事件ID 13: 事件ID 41: 事件ID 6008: 事件ID 1074:事件ID 1074: ========================================== ...

  3. [Qt] QlineEdit 限制输入,例如只能输入整数

    要注意validor的作用域,如果超出作用域,则会无效.例如下面的代码,在UI的类的构造函数里.所以要new一个validtor. QIntValidator *intValidator = new ...

  4. 牛客网练习赛61 A+B

    A.打怪 思路:先判定当小怪的攻击力为0时,你能杀无数只怪,因为小怪A不动你,然后再计算每个小怪最多能给你造成多少伤害(用小怪的血量除以你的攻击力,也就是你砍它几下它会死,你先手,所以小怪肯定比你少砍 ...

  5. 深入理解TCP建立和关闭连接

    建立连接: 理解:窗口和滑动窗口TCP的流量控制TCP使用窗口机制进行流量控制什么是窗口?连接建立时,各端分配一块缓冲区用来存储接收的数据,并将缓冲区的尺寸发送给另一端 接收方发送的确认信息中包含了自 ...

  6. Spring Boot中的Properties

    文章目录 简介 使用注解注册一个Properties文件 使用属性文件 Spring Boot中的属性文件 @ConfigurationProperties yaml文件 Properties环境变量 ...

  7. 为什么LIKELY和UNLIKELY要用两个叹号

    LIKELY和UNLIKELY的一般定义如下: #define LIKELY(x) (__builtin_expect(!!(x),1))#define UNLIKELY(x) (__builtin_ ...

  8. 聊聊flink的BlobStoreService

    序 本文主要研究一下flink的BlobStoreService BlobView flink-release-1.7.2/flink-runtime/src/main/java/org/apache ...

  9. 有赞透明多级缓存解决方案(TMC)设计思路

    引子 TMC 是什么 TMC,即"透明多级缓存(Transparent Multilevel Cache)",是有赞 PaaS 团队给公司内应用提供的整体缓存解决方案. TMC 在 ...

  10. 搭建Springboot+mybatis+redis+druid

    2019独角兽企业重金招聘Python工程师标准>>> 准备工作 JDK:1.8 使用技术:SpringBoot.Dubbo.Mybatis.Druid 开发工具:Intelj ID ...