从头开始复习css之2D变换

最近一直在系统的复习前端基础知识, 不复习的时候不知道 一旦系统的复习才知道 原来自己对很多知识还是处于一知半解的地步,好吧 话不多说 开始写吧:

一、 过渡

1.1、 过渡是什么?

首先关于过渡,过渡是一个什么东西呢?我感觉用语言来描述是很苍白的,我们直接来看下面一段代码:

// css
.test {
  width: 200px;
  height: 200px;
  background-color: red;
}
.test:hover {
  height: 400px;
}
// html
<div class="test"></div>

代码的意思是在鼠标放在元素上面的时候,就会改变元素的高度,具体的效果如下:


效果.gif

我们发现:在鼠标hover的时候,元素一瞬间高度变化,紧接着我们在其基础上面增加过渡的代码:

transition: height 2s;

效果如下:

效果.gif

从上面的效果,我们可以看出来没加过渡和加过渡的之后的效果差距,过渡效果就像在变换的过程中增加缓冲效果,也就是说过渡就是元素从一种样式逐渐改变为另一种的效果

1.2、 介绍过渡可选用的属性

那么关于过渡,需要掌握的知识点有哪些呢?

  • transition 简写属性,用于在一个属性中设置四个过渡属性,依次是下面几个元素
  • transition-property 规定应用过渡的 CSS 属性的名称。
  • transition-duration 定义过渡效果花费的时间。默认是 0。
  • transition-timing-function 规定过渡效果的时间曲线。默认是 "ease"
  • transition-delay 规定过渡效果何时开始。默认是 0
1.3、 transition-property

transition-property属性规定应用过渡效果的css属性的名称,当指定css属性值发生改变的时候,过渡效果将会触发。
其可选值是:

  • none:没有属性会触发过渡效果
  • all:所有的属性变化都会触发过渡效果
  • property:定义应用过渡效果的 CSS 属性名称列表,列表以逗号分隔。
1.4、 transition-duration

transition-duration属性规定完成过渡效果需要花费的时间。默认值是0.

1.5、 transition-timing-function

transition-timing-function属性规定过渡效果的速度曲线。其可选值有:

  • linear 规定以相同速度开始至结束的过渡效果(等于 cubic-bezier(0,0,1,1))。
  • **ease ** 规定慢速开始,然后变快,然后慢速结束的过渡效果(cubic-bezier(0.25,0.1,0.25,1))。
  • ease-in 规定以慢速开始的过渡效果(等于 cubic-bezier(0.42,0,1,1))。
  • ease-out 规定以慢速结束的过渡效果(等于 cubic-bezier(0,0,0.58,1))。
  • ease-in-out 规定以慢速开始和结束的过渡效果(等于 cubic-bezier(0.42,0,0.58,1))。
  • cubic-bezier(n,n,n,n) 在 cubic-bezier 函数中定义自己的值。可能的值是 0 至 1 之间的数值。
    这里值得我们注意的是:最后一个速度的值可以在赛贝尔曲线官网上自行选取。
1.6、transition-delay

transition-delay 属性规定过渡效果何时开始。通俗点说就是设置变换的延时时间。

1.7、 来搞个例子吧

说了这么概念性的问题,接下来看一段代码:

// css
        .runn-area{
            background: skyblue;
            padding: 2px 4px
        }
        .runn-area:hover>.test{
            transform: translateX(80px);
        }
        .runn-area:hover>.test3{
            transform: translate(80px,0) rotate(360deg);
        }
        .test {
            width: 12px;
            height: 12px;
            background-color: red;
            transition: height 2s;
            margin-top: 10px;
            color:white;
            font-size: 12px
        
        }
        .test1 {
            transition-property: transform;
            transition-duration: 1s;
            transition-timing-function: ease;
            transition-delay: 0.5s;
        }
        .test2 {
            transition-property: width;
            transition-duration: 1s;
            transition-timing-function: linear;
            transition-delay: 0.5s;
        }
        .test3 {
            transition-property: all;
            transition-duration: 1s;
            transition-timing-function: ease-in-out;
            transition-delay: 0.5s;

        }
        .test4 {
            
            transition-property: transform;
            transition-duration: 1s;
            transition-timing-function: cubic-bezier(0,.67,.87,.06);
            transition-delay: 0.5s;

        }
        .test5 {
            transition-property: transform;
            transition-duration: 1s;
            transition-timing-function: ease-out;
            transition-delay: 0.5s;
        }
// html
    <div class="runn-area">
        <div class="test1 test"></div>
        <div class="test2 test"></div>
        <div class="test3 test"></div>
        <div class="test4 test"></div>
        <div class="test5 test"></div>
    </div>  

效果如下:


效果.gif

上面我们分别用了不同的transition-property给大家一个不一样的速度感受,能让大家更好的去理解transition-property这个属性。值得我们注意的是:test2元素并没有过渡效果,这里我们发现指定的width,而元素产生的变化确实做的平移变换,所以没有了效果。test3既有平移效果,也有旋转效果,如果想有多种效果的话,用空格做分隔,只要transition-property支持该属性就能被触发。

二、 2d变换基础方法

前面在我们的过渡中用到了一个平移的方法,那么我们肯定不能只满足于平移,肯定还想知道更多平面上的变换动画。

2.1、 2d平面基础中有哪些办法:

关于平面2d变换中 主要有一下几个方法:

  • translate:平移
  • scale: 缩放
  • rotate:旋转
  • skew: 倾斜

2.1、 translate

首先关于关于translate这个方法而言,本身就有两个子方法:

  • translateX 这个方法只有一个参数,表示沿x轴的平移量
  • translateY 这个方法也只有一个参数,表示沿y轴的平移量
    translate是上面两个方法的简写形式,可以接收两个参数,前者是x轴的平移量,后者是沿y轴的平移量。如果只传一个值,缺省值默认为0。具体的代码,前面代码、效果已经展示过了我就不多说了。

2.2、 scale

关于scale来说而言,本身也有两个子方法:

  • scaleX:定义 2D 缩放转换,改变元素的宽度。
  • scaleY:定义 2D 缩放转换,改变元素的高度。
    scale是上面两个方法的简写形式,可以接收两个参数,分别代表改变元素的宽度和高度。来看下面一个一段代码:
<div class="test"></div>
        body:hover>.test{
            transform: scale(4,4);
        }
        .test{
            width: 100px;
            height: 100px;
            background-color: red;
            transition: transform 2s
        }
效果.gif

2.3、 rotate

rotate主要用来定义 2D 旋转,在参数中规定角度。修改一下上面的代码

        body:hover>.test{
            transform: rotate(360deg)
        }

效果如下:


效果.gif

2.4、 skew

关于skew来说而言,本身也有两个子方法:

  • skewX:定义 2D 倾斜转换,沿着 X 轴。
  • skewY:定义 2D 倾斜转换,沿着 Y 轴。
    skew是上面两个方法的简写形式,可以接收两个参数,分别代表改变元素的沿着x,y轴的倾斜角度。修改一下上面的代码:
        body:hover>.test{
            transform: skew(60deg,60deg);
        }

效果如下:


效果.gif

这里值得我们的注意的是沿着哪个轴倾斜,就是被倾斜边与坐标轴之间的夹脚的角度。

三、原点位置

我们这里有这样一个需求:就是在我们的旋转操作中,我们不希望从,从元素的中心点开始旋转,这就触发了我们接下来的一个属性:transform-origin。我们还是老样子,修改一下上面的的代码来演示这个属性的作用:

        .test{
            width: 40px;
            height: 40px;
            background-color: red;
            transition: transform 2s;
            transform-origin: 0 0;
        }
        .body:hover>.test{
            transform: rotate(360deg);
            background-color: white;
        }

效果如下:

效果.gif

从上面的效果图我们可以发现,该属性是用来更改一个元素变形的原点。
该元素在平面上可以接收两个值,代表变换的中心点(用x-axis和y-axis来表示),其可选用的格式类型有:
x-axis:定义视图被置于 X 轴的何处。可能的值:
|left|center|right|length|%|默认值50%
y-axis:定义视图被置于 Y 轴的何处。可能的值:
|top|center|bottom|length|%|默认值50%

四、 矩阵变换(matrix)

最后我们来说一说矩阵变换吧,这是一个比较复杂的章节。

4.1、 矩阵变换的原理

首先matrix函数接收6个参数,我们就用a,b,c,f,e,f来指代,将这6个参数组合成矩阵如下:


矩阵

其中矩阵变换的原理是:


矩阵变换的原理

x,y表示变换前元素某一点在局部坐标系中的横纵坐标。x',y' 表示变换后的坐标。其转化的公式为:

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

通过上面的计算方法我们就能计算出a,b,c,d,c,e,f的值 然后填写进去就行了。

4.1、用矩阵变换实现平移变换

问题:我们想让基点为(10px,10px)的元素平移到(30px,30px)。

这里值得我们注意的点就是:让 a=1,b=0,c=0,d=1的情况下,e,f就相当于translate的两个参数。
经过计算 e=20,f=20。

4.2、用矩阵变换实现缩放变换

问题:我们想让元素的宽度成为原来的2倍,宽是原来的3倍?
同样值得我们注意的是:只要让 b = 0,c = 0,e = 0,f = 0,那么 a,d 就相当于scale()的两个参数
经过计算得到 a=2,d=3

4.2、用矩阵变换实现旋转变换

问题:我们想让元素旋转指定度数怎么做?
我们这里的计算公司相当于:

x' =x*cosθ - y*sinθ
y' =  x*sinθ + y*cosθ

值得注意的一点是旋转度数的时候,直接将a = cosθ,b = sinθ,c = - sinθ ,d = cosθ, e = 0,,f = 0

这里值得我们深度深思的是,旋转360度 如何做呢?

4.2、用矩阵变换实现倾斜变换

这个的计算公式相当于
x’ = x + ytanθx
y’ = x
tanθy + y

值得注意的一点是旋转度数的时候,直接将a = 1,b = tanθy,c = tanθx,d = 1, e = 0,,f = 0

4.3、总结

总的来说呢,关于矩阵变换的最佳记忆方式可以用下面的方式来记忆:
a 水平缩放,b 水平倾斜,c 垂直倾斜,d 垂直缩放,e 水平移动,f 垂直移动

说在最后

关于过渡和2d动画这一块,我觉得应该是每个前端工程师必须熟练使用的东西,怎么说呢?现在的app 要想使用户体验更加的友好 最好的方式就是给界面转换、数据加载加上一个缓冲页面 而不是干巴巴的纯数据展示,这样不仅对用户,而且对自己审美也是一种很好的享受。好了 好了,不多说了,终于写完了,都快12点半了,我先睡觉了

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351

推荐阅读更多精彩内容

  • 选择qi:是表达式 标签选择器 类选择器 属性选择器 继承属性: color,font,text-align,li...
    love2013阅读 2,308评论 0 11
  • 选择qi:是表达式 标签选择器 类选择器 属性选择器 继承属性: color,font,text-align,li...
    wzhiq896阅读 1,741评论 0 2
  • 看了很多视频、文章,最后却通通忘记了,别人的知识依旧是别人的,自己却什么都没获得。此系列文章旨在加深自己的印象,因...
    DCbryant阅读 1,858评论 0 4
  • 1 CALayer IOS SDK详解之CALayer(一) http://doc.okbase.net/Hell...
    Kevin_Junbaozi阅读 5,137评论 3 23
  • 这是一篇没有名字的读后感,想写的越多却越不知道从何下笔。 最开始是在得到APP里认识了成甲老师,《成甲说书》...
    茗苑阅读 435评论 0 0