CSS3 calc是怎么实现计算

html-css017

CSS3 calc是怎么实现计算,第1张

1. 执行数学运算

CSS3 的 calc() 函数允许我们在属性值中执行数学操作。例如,我们可以使用 calc() 指定一个元素宽的固定像素值为多个数值的和。示例:

.foo {

width: calc(100px + 50px)

padding: calc(1vw + 1em)

transform: rotate( calc(1turn + 28deg) )

background: hsl(100, calc(3 * 20%), 40%)

font-size: calc(50vw / 3)

}

2. 实现居中效果

使用 calc() 给我们提供另一个垂直居中元素的解决方案。如果我们知道元素的尺寸,一个典型的解决方案是使用负外边距移动自身距离高与宽的一半,如下所示:

.foo {

position: absolute

top: 50%

left: 50%

marging-top: -150px

margin-left: -150px

}

使用 calc() 函数,我们只需要通过 top 与 left 属性便能实现相同的效果:

.foo {

position: absolute

top: calc(50% - 150px)

left: calc(50% - 150px)

}

火狐的介入,已经很少需要这种方法了。不过,一些情况下火狐不能被使用。比如,元素需要定位,这种方法是有用的。

3. 创建根栅格尺寸

使用 rem,calc() 函数能够用来创建一个基于视口的栅格。我们可以设置根元素的字体大小作为视口宽度的一部分。

html {

font-size: calc(100vw / 30)

}

现在,1rem 为视口宽度的 1/30。在页面上的文本,将会根据你的视口自动缩放。换句话说,相同比例的视口总会显示相同的文本数量,不管视口的真实尺寸是多少。

如果我们对非文本使用 rem 设置大小,它们同样遵守这个行为。一个 1rem 宽度的元素总是视口元素宽度的 1/30。

4. 提高计算清晰度

calc()使计算变的清晰。如果你使一组项目为它们父元素容器宽度的 1/6,你可能这么写:

.foo {

width: 16.666666667%

}

然而,它能够使计算清晰并具有可读性:

.foo {

width: calc(100% / 6)

}

使用 calc(),我们还能做很多的事情,它是 CSS 中很有用的新特性之一。

vh: 相对于视窗的高度, 视窗被均分为100单位的vh

vw: 相对于视窗的宽度, 视窗被均分为100单位的vw

vmax: 相对于视窗的宽度或高度中较大的那个。其中最大的那个被均分为100单位的vmax

vmin: 相对于视窗的宽度或高度中较小的那个。其中最小的那个被均分为100单位的vmin

视区:所指为浏览器内部的可视区域大小,

即window.innerWidth/window.innerHeight大小,不包含任务栏标题栏以及底部工具栏的浏览器区域大小。

calc是英文单词calculate(计算)的缩写,是css3的一个新增的功能,用来指定元素的长度。比如说,你可以使用calc()给元素的border、margin、pading、font-size和width等属性设置动态值。为何说是动态值呢?因为我们使用的表达式来得到的值。不过calc()最大的好处就是用在流体布局上,可以通过calc()计算得到元素的宽度。

calc是 css3提供的一个在css文件中计算值的函数:

用于动态计算长度值。

需要注意的是,运算符前后都需要保留一个空格,例如:width: calc(100% - 10px);

任何长度值都可以使用calc()函数进行计算;

calc()函数支持 “+”, “-“, “*”, “/” 运算;

calc()函数使用标准的数学运算优先级规则;

calc(100vh - 10px) 表示整个浏览器窗口高度减去10px的大小

calc(100vw - 10px) 表示整个浏览器窗口宽度减去10px的大小

一般用来设置流式布局宽高,当然,你可以使用calc()给元素的border、margin、pading、font-size和width等属性设置动态值

calc()的兼容性需要注意

css3中的变形

Chrome和safai需前缀加-webkit-,Foxfire需加前缀-moz-

1,旋转 rotate()

div{

width: 300px

height: 300px

transform:rotate(20deg)

}

2,扭曲 skew()

div {

width: 300px

height: 300px

transform:skew(45deg,-10deg)

}

3,缩放 scale()

scale(X,Y)使元素水平方向和垂直方向同时缩放(也就是X轴和Y轴同时缩放)

也可以只缩放 x轴,或只缩放y轴。

div {

width: 200px

height: 200px

background: orange

}

.wrapper div:hover {

opacity: .5

transform: scale(0.8)

}

4,位移 translate()

translate()函数可以将元素向指定的方向移动,类似于position中的relative。

或以简单的理解为,使用translate()函数,可以把元素从原来的位置移动,

而不影响在X、Y轴上的任何Web组件。

5,原点 transform-origin

CSS变形进行的旋转、位移、缩放,扭曲等操作都是以元素自己中心位置进行变形。

但很多时候,我们可以通过transform-origin来对元素进行原点位置改变,使元素

原点不在元素的中心位置,以达到需要的原点位置。

div {

transform: skew(45deg)

transform-origin:top

}

6,过渡

div {

width: 200px

height: 200px

background: red

margin: 20px auto

-webkit-transition-property: all

transition-property: all //指定过渡或动态模拟的css属性 (all是指所有)

-webkit-transition-duration:5s

transition-duration:5s //指定完成过渡的时间

-webkit-transition-timing-function: linear

transition-timing-function: linear//指定过渡的函数 linear/ease/ease-in/ease-out/ease-in-out/cubicbezier(n,n,n,n) n为0-1

-webkit-transition-delay: .18s

transition-delay:.18s //指定开始出现的延迟时间

}

div:hover {

width: 400px

height:400px

}

7,Keyframes被称为关键帧,css3中以“@keyframes”开头,后面紧跟着是动画名称加上一对花括号“{...}”

@keyframes changecolor{

0%{

background: red

}

20%{

background:blue

}

40%{

background:orange

}

60%{

background:green

}

80%{

background:yellow

}

100%{

background: red

}

}

div {

width: 300px

height: 200px

}

div:hover {

animation: changecolor 5s ease-out .2s

}

等价于

div:hover{

animation-name:changecolor

animation-duration:5s

animation-timing-function:ease-out

animation-delay:1

animation-iteration-count:infinite//动画播放次数 整数。

animation-play-state:paused//主要用来控制元素动画的播放状态。

animation-direction:alternate//动画方向,normal每次循环向前,alternate偶次向前,奇数相反。

animation-fill-mode: both//设置动画时间外属性none、forwards、backwords和both

}