发布网友 发布时间:2022-04-23 00:10
共2个回答
懂视网 时间:2022-04-21 12:56
作者:Aaron的博客网址:http://www.cnblogs.com/aaronjs/p/42015.html
--------------------------------------------------------------------------------------------------------------------------------
CSS3我在5年之前就有用了,包括公司项目都一直在很前沿的技术。
最近在写慕课网的七夕主题,用了大量的CSS3动画,但是真的沉淀下来仔细的去深入CSS3动画的各个属性发现还是很深的,这里就写下关于帧动画steps属性的理解
我们知道CSS3的Animation有八个属性
animation-name
animation-duration
animation-delay
animation-iteration-count
animation-direction
animation-play-state
animation-fill-mode
animation-timing-function
其中1-7大多都有介绍,但是animation-timing-function是控制时间的属性
在取值中除了常用到的 三次贝塞尔曲线 以外,还有个让人比较困惑的steps() 函数
animation默认以ease方式过渡,它会在每个关键帧之间插入补间动画,所以动画效果是连贯性的
除了ease,linear、cubic-bezier之类的过渡函数都会为其插入补间。但有些效果不需要补间,只需要关键帧之间的跳跃,这时应该使用steps过渡方式
animation-timing-function 规定动画的速度曲线
以上w3school网站上给的使用方法,但是漏掉一个很重要的steps
简单的来说,我们一直使用animation基本都是实现线性渐变的动画
如
位置在固定的时间从起点到终点
尺寸在固定的时间线性变化
颜色的线性改变等等
看效果线性动画:http://sandbox.runjs.cn/show/5u3ovsfb
截取CSS如下
.test1 { width: 90px; height: 60px; -webkit-animation-name: skyset; -webkit-animation-duration: 2000ms; -webkit-animation-iteration-count: infinite; /*无限循环*/ -webkit-animation-timing-function: linear;}@-webkit-keyframes skyset { 0% { background: red;} 50%{ background: blue} 100% {background: yellow;}}
timing-function:linear 定义的是一个匀速变化的动画,就是在2秒内,从红色过度到蓝色到黄色,是一个很线性的颜色变化
如果要实现帧动画效果而不是线性的变化就需要引入step这个值了,换句话就是没有过渡的效果,而是一帧帧的变化
同样可以看测试帧动画:http://sandbox.runjs.cn/show/t5xqz6i4
理解steps
steps 函数指定了一个阶跃函数
第一个参数指定了时间函数中的间隔数量(必须是正整数)
第二个参数可选,接受 start 和 end 两个值,指定在每个间隔的起点或是终点发生阶跃变化,默认为 end。
step-start等同于steps(1,start),动画分成1步,动画执行时为开始左侧端点的部分为开始;
step-end等同于steps(1,end):动画分成一步,动画执行时以结尾端点为开始,默认值为end。
看看W3C的规范transition-timing-function
steps第一个参数的错误的理解:
steps(5,start)
steps() 第一个参数 number 为指定的间隔数,即把动画分为 n 步阶段性展示,估计大多数人理解就是keyframes写的变化次数
例如:
@-webkit-keyframes circle { 0% {} 25%{} 50%{} 75%{} 100%{}}
我之前也一直认为steps(5,start)中的5 就是指的keyframes中的0% 25% 50% 75% 100% 分成5个间隔等分
为什么会出现这种理解错误,我们看一个例子
keyframes的关键帧是只有2个规则的时候,假如我们有一张400px长度的雪碧图
@-webkit-keyframes circle { 0% {background-position-x:0;} 100%{background-position-x: -400px;}}
此刻设置steps(5,start)那么会发现5张图会出现帧动画的效果,因为steps中的5把 0% ? 100%的规则,内部分成5个等分
实际内部会执行这样一个关键帧效果
@-webkit-keyframes circle { 0% {background-position-x: 0;} 25% {background-position-x: -100px;} 50% {background-position-x:-200px;} 75%{background-position-x: -300px;} 100%{background-position-x: -400px;}}
将这个规则稍微修改下,加入一个50%的状态
@-webkit-keyframes circle { 0% {background-position-x: 0;} 50% {background-position-x: -200px;} 100%{background-position-x: -400px;}}
那么同样用steps(5,start)效果就会乱套
此刻你会很迷惑,所以关键要理解第一个参数的针对点,首先引入一个核心点:
timing-function 作用于每两个关键帧之间,而不是整个动画
那么第一个参数很好理解了,steps的设置都是针对两个关键帧之间的,而非是整个keyframes,所以第一个参数对 ? 次数对应了每次steps的变化
换句话说也是 0-25 之间变化5次,? 25-50之间 变化5次 ,50-75 之间变化5次,以此类推
第二个参数可选,接受 start 和 end 两个值,指定在每个间隔的起点或是终点发生阶跃变化,默认为 end
通过案例看下step-start,step-end的区别
@-webkit-keyframes circle { 0% {background: red} 50%{background: yellow} 100% {background: blue}}
step-start: 黄色与蓝色相互切换
step-end : 红色与黄色相互切换
2个参数都会选择性的跳过前后部分,start跳过0%,end跳过100%
step-start在变化过程中,都是以下一帧的显示效果来填充间隔动画,所以0% 到 50%? 直接就显示了黄色yellow
step-end与上面相反,都是以上一帧的显示效果来填充间隔动画,所以0% 到 50% 直接就显示了红色red
引用w3c的一张step的工作机制图
总结:
steps函数,它可以传入两个参数,第一个是一个大于0的整数,他是将间隔动画等分成指定数目的小间隔动画,然后根据第二个参数来决定显示效果。
第二个参数设置后其实和step-start,step-end同义,在分成的小间隔动画中判断显示效果。可以看出:steps(1, start) 等于step-start,steps(1,end)等于step-end
最核心的一点就是:timing-function 作用于每两个关键帧之间,而不是整个动画。
demo : http://designmodo.com/steps-css-animations/
热心网友 时间:2022-04-21 10:04
主要使用gcc命令以及以下几个参数:
-E Preprocess only; do not compile, assemble or link
-S Compile only; do not assemble or link
-c Compile and assemble, but do not link
-o <file> Place the output into <file>
环境配置好以后,让我们开始c语言的编译之旅吧~
编写c语言源代码
很多linux命令都可以新建一个文件,比如
$ touch test.c
建立一个空白的文件
$ vim test.c
使用vim(文本编辑器)编辑test.c,如果test.c不存在,则创建
$ echo "123" > test.c
通过输出重定向新建一个文件
创建完test.c后,将下面这段Hello World代码写到test.c中(很多方法)
#include <stdio.h>
int main(){
printf("Hello world\n");
return 0;
}
写完之后可以使用ls命令来查看当前目录下的文件,检查test.c是否存在
$ ls
使用cat命令查看test.c中的内容,检查是否写入成功
$ cat test.c
ls-cat
展开头文件(预处理)
$ gcc -E test.c -o test_pre.c
这个命令把源代码test.c中的头文件展开,并把结果输出到test_pre.c
(可以使用cat或者vim命令查看test_pre.c文件中的内容)
per
test_pre.c中的内容是这样的,可以发现原本几行的代码变成了几百行,而且已经见不到include关键字了,取而代之的是一些变量定义的代码,这些代码就是stdio.h中的内容,和stdio.h中头文件展开后的内容。
编译
$ gcc -S test_pre.c -o test_asm.s
这一条命令将上一步预处理过后的源代码编译成为汇编代码
asm
现在看到的是test_asm.s里面的汇编代码。
什么是汇编?
汇编语言是汇编指令集、伪指令集和使用它们规则的统称,使用具有一定含义的符号为助忆符,用指令助忆符、符号地址等组成的符号指令称为汇编格式指令。
简单的可以理解为汇编语言是一本词典,01100101011010这样的二进制字符串是单词,汇编指令是单词的含义。计算机能读懂二进制字符串,而人能读懂的是翻译过来的汇编指令。
汇编
$ gcc -c test_asm.s -o test_obj.o
这一步将test_asm.s汇编成为目标文件,目标文件中存储的就是010101010这样的字符串了,可以用cat命令试试去读取test_obj.o
obj
可以发现打印出来许多不可见的字符,原因是目标文件已经是二进制格式的了,不同于源代码(文本格式)
有关文件的格式可以看下这里的介绍:
http://www.cnblogs.com/zhangjiankun/archive/2011/11/27/2265184.html
链接
链接器负责将程序的目标文件与所需的所有附加的目标文件连接起来,最终生成可执行文件。附加的目标文件包括静态连接库和动态连接库。
这个例子中没有附加的目标文件,所以只需要目标文件做被链接的对象。
有关链接器的详细讲解大家可以看下这里:
https://www.hu.com/question/27386057
$ gcc test_obj.o -o hello
gcc本身可以充当链接器,这里使用gcc命令将目标文件test_obj.o链接成了可执行文件hello
ld
运行程序!
至此,源代码已经经历了预处理、编译、汇编、链接四步成为了可执行文件,现在试着运行一下这个程序吧
$ ./hello
hello
小结
首先我们创建了源文件test.c,然后用gcc -E将源文件中的头文件展开,这一步叫做预处理;
之后通过gcc -S将预处理后的源文件编译了汇编代码,这一步叫做编译;
接着使用gcc -c命令将汇编代码转换成了二进制的目标文件,这一步操作叫做汇编;
目标文件不同于源代码,是二进制格式,是源文件编译过程中产生的中间文件,通过链接器可以将多个目标文件链接成为可执行文件,这一步叫做链接。
源文件->(预处理->编译->汇编->链接)->可执行文件
一般大家所说的c语言编译,其实是上述这四步的简称。