CSS3知识点总结

盒子模型

在CSS中盒模型被分为两种,第一种是w3c的标准模型,另一种是IE的传统模型,它们相同之处都是对元素计算尺寸的模型,具体说不是对元素的width、height、padding和border以及元素实际尺寸的计算关系,它们不同之处是两者的计算方法不一致。

W3C标准盒模型

外盒尺寸计算(元素空间尺寸)
element空间高度=内容高度+内距+边框+外距
element空间宽度=内容宽度+内距+边框+外距
内盒尺寸计算(元素大小)
element高度=内容高度+内距+边框(height为内容高度)
element宽度=内容宽度+内距+边框(width为内容宽度)

IE传统下盒模型(IE6以下,不包含IE6版本或QuirksMode下IE5.5+)

外盒尺寸计算(元素空间尺寸)
element空间高度=内容高度+外距(height包含了元素内容宽度、边框、内距)
element宽间宽度=内容宽度+外距(width包含了元素内容宽度、边框、内距)
内盒尺寸计算(元素大小)
element高度=内容高度(height包含了元素内容宽度、边框、内距)
element宽度=内容宽度(width包含了元素内容宽度、边框、内距)

CSS3中box-sizing属性

  • content-box
    默认值,其让元素维持W3C的标准盒模型,也就是说元素的宽度和高度(width/height)等于元素边框宽度(border)加上元素内距(padding)加上元素内容宽度或高度(content width/ height),也就是element width/height = border + padding + content width / height
  • border-box
    重新定义CSS2.1中盒模型组成的模式,让元素维持IE传统的盒模型(IE6以下版本和IE6-7怪异模式),也就是说元素的宽度或高度等于元素内容的宽度或高度。从上面盒模型介绍可知,这里的内容宽度或高度包含了元素的border、padding、内容的宽度或高度(此处的内容宽度或高度=盒子的宽度或高度—边框—内距)。

content-box和border-box区别如下图所示:
具体计算

CSS3动画

Animation与Transition的异同

Animation功能与Transition功能相同,都是通过改变元素的属性值来实现动画效果的,他们的区别在于:使用Transition功能时只能通过指定属性的开始值和结束值,然后在这两个属性值之间进行平滑过渡的方式来实现动画效果,因此不能实现比较复杂的动画效果。
Animation功能通过定义多个关键帧以及定义每个关键帧中元素的属性值来实现更为复杂的动画效果
Animation个属性值:
两个必要属性:

  • animation-name 动画名称(关键帧名称)
  • animation-duration 动画持续时间

其他属性值:

  • animation-play-state 播放状态( running 播放 和paused 暂停 ),可以用来控制动画暂停。
  • animation-timing-function 动画运动形式
  • animation-delay 动画延迟
  • animation-iteration-count 重复次数
  • animation-direction 播放前重置(alternate 动画直接从上一次停止的位置开始执行)

CSS3动画小技巧

  • animation-delay 属性值允许负值,使动画跳过指定秒数马上开始
    Demo
    这是一个加载动画的小实例
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>加载动画</title>
    <style type="text/css">
        h1{
        text-align: center;
        font-family: "微软雅黑";
        font-size: 24px;
        }
        .wrap{
            width: 80px;
            height: 50px;
            margin: 100px auto;
        }
        .wrap > div{
            width: 6px;
            height: 100%;
            background: green;
            display: inline-block;
            -webkit-animation: strechdelay 1.2s ease-in-out infinite;
        }
        .wrap .line2{
            /*允许负值,-1.1s使动画马上开始,但跳过1.1秒进入动画*/
            -webkit-animation-delay: -1.1s;
        }
        .wrap .line3{
            -webkit-animation-delay: -1s;
        }
        .wrap .line4{
            -webkit-animation-delay: -0.9s;
        }
        .wrap .line5{
            -webkit-animation-delay: -0.8s;
        }
        @-webkit-keyframes strechdelay{
            0%,40%,100%{
                -webkit-transform: scaleY(.4);
            }
            20%{
                -webkit-transform: scaleY(1);
            }
        }
    </style>
</head>
<body>
    <h1>CSS3加载动画实现</h1>
    <div class="wrap">
        <div class="line1"></div>
        <div class="line2"></div>
        <div class="line3"></div>
        <div class="line4"></div>
        <div class="line5"></div>
    </div>
</body>
</html>

animate和JS结合

我们可以通过监听动画结束事件来对动画结束的操作进行控制

obj.addEventListener('webkitAnimationEnd',fn,false);
obj.addEventListener('animationend',fn,false);

CSS3动画性能的问题

在做CSS3动画的时候,如果使用 gpu 渲染图形,可以减少 cpu 的消耗,提高程序的性能。
当我们使用动画改变图片的left值时候,通常会使用margin-left的属性,但是margin-left属性的时候会触发页面的重绘和重排。当我们使用css3新属性transform 来代替传统的 margin-left 来改变元素位置的时候,不会触发任何的重绘。而且会触发 gpu 来帮助页面的排版。

媒体查询

使用方法:

@media 媒体类型and (媒体特性){你的样式}

1. 最大宽度max-width

max-width是媒体特性中最常用的一个特性,其意思是指媒体类型小于或等于指定的宽度时,样式生效。

@media screen and (max-width:480px){
 .box {
   display:none;
  }
}

上面表示的是:当屏幕小于或等于480px时,页面中的(.box)都将被隐藏。

2.最小宽度min-width

“min-width”与“max-width”相反,指的是媒体类型大于或等于指定宽度时,样式生效。

@media screen and (min-width:900px){
.wrapper{width: 980px;}
}

上面表示的是:当屏幕大于或等于900px时,容器“.wrapper”的宽度为980px。

在移动端的使用

在做移动端开发的时候,为了适配多屏幕。使用rem 单位,然后根据屏幕的尺寸的改变来动态的设置根节点html 的font-size 值。这样可以解决多屏幕适配的问题。

html {
    font-size: 100px;
}
@media (min-width: 320px) {
    html {
       font-size: 100px;
    }
}
@media (min-width: 360px) {
    html {
        font-size: 112.5px;
    }
}

但是这种做法有两个缺点:

  • 适配屏幕的尺寸不是连续的
  • 会在 css 文件中添加大段的这样的查询代码,增加了 css 文件的体积

为解决上述缺点,我们可以通过使用 js 获取移动设备屏幕的宽度,根据设计稿的原型尺寸,动态的计算font-size 的值。

3.多个媒体特性使用

Media Queries可以使用关键词”and”将多个媒体特性结合在一起。也就是说,一个Media Query中可以包含0到多个表达式,表达式又可以包含0到多个关键字,以及一种媒体类型。
当屏幕在600px~900px之间时,body的背景色渲染为“#f5f5f5”,如下所示。

@media screen and (min-width:600px) and (max-width:900px){
  body {background-color:#f5f5f5;}
}

4.设备屏幕的输出宽度Device Width

在智能设备上,例如iPhone、iPad等,还可以根据屏幕设备的尺寸来设置相应的样式(或者调用相应的样式文件)。同样的,对于屏幕设备同样可以使用min/max对应参数,如min-device-width或者max-device-width。

<link rel="stylesheet" media="screen and (max-device-width:480px)" href="iphone.css" />

上面的代码指的是iphone.css样式适用于最大设备宽度为480px,比如说iPhone上的显示,这里的max-device-width所指的是设备的实际分辨率,也就是指可视面积分辨率。

5. not关键词

使用关键词“not”是用来排除某种制定的媒体类型,也就是用来排除符合表达式的设备。换句话说,not关键词表示对后面的表达式执行取反操作,如:

@media not print and (max-width: 1200px){样式代码}

上面代码表示的是:样式代码将被使用在除打印设备和设备宽度小于1200px下所有设备中。

6.only关键词

only用来指定某种特定的媒体类型,可以用来排除不支持媒体查询的浏览器。其实only很多时候是用来对那些不支持Media Query但却支持Media Type的设备隐藏样式表的。其主要有:支持媒体特性的设备,正常调用样式,此时就当only不存在;表示不支持媒体特性但又支持媒体类型的设备,这样就会不读样式,因为其先会读取only而不是screen;另外不支持Media Queries的浏览器,不论是否支持only,样式都不会被采用。如

<linkrel="stylesheet" media="only screen and (max-device-width:240px)" href="android240.css" />

移动端响应适配利器-rem

在CSS3中,可以使用rem单位来定义字体大小。rem字体尺寸单位将根据页面上的根元素(一般指html元素)的字体大小而计算出实际的字体大小,默认字体大小为16个像素。
em单位是根据元素的父元素的字体大小而计算出实际的字体大小,因此,当我们将元素从一个父元素移动到另一个父元素中时可能使得元素的实际字体大小产生变化。
给一个div设置12px的字体大小那么用rem来写就是

div{
font-size: 0.75rem; //12÷16=0.75(rem)
}

使用rem来设置字体大小基本上是这个套路,好处是:如果用户修改了浏览器的默认字体大小,那么使用rem时就可以根据用户的修改来显示。 但是rem不仅可以适用于字体大小设置,同样可以用于width、height、margin这些样式的单位。下面来具体看一下:

rem进行屏幕适配

rem适配的原理:就是我们只需要在设备宽度大小变化的时候,调整html的字体大小,那么页面上所有使用rem单位的元素都会做相应的调整。
一般做移动端适配的方法,有以下几种方式:
- 简单一点的页面,一般高度直接设置成固定值,宽度一般撑满整个屏幕;
- 稍复杂一些的是利用百分比设置元素的大小来进行适配,或者利用flex等css去设置一些需要定制的宽度;
- 再复杂一些的响应式页面,需要利用css3的media query属性来进行适配,大致思路是根据屏幕不同大小,来设置相应的css样式;
上面这些方法解决屏幕适配等问题,下面具体使用下rem:
Demo:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>rem</title>
    <style type="text/css">
    .box{
        width: 10rem;
        height: 10rem;
        margin-left: 5rem;
        margin-top: 5rem;
        background-color: red;
    }
    </style>
</head>
<body>
    <div class="box"></div>
</body>
</html>

这里写图片描述
这是一个div,宽度和高度都用rem进行设置,在浏览器里面是这样显示的, 由上图可以看出,在浏览器里面width和height分别是160px=16px * 10,margin-left和margin-top分别是80px=16px * 5
这里写图片描述
当把浏览器其默认字体修改为20px,div的width和height分别是200px=20px * 10,margin-left和margin-top分别是100px=20px * 5
因此,我们可以通过设置根元素的font-size值来改变自身的值,从而达到我们css样式中的适配效果。

rem数值计算

对于没有使用sass或者less的工程:
为了方便起见,可以将html的font-size设置成100px,这样在写单位时,直接将数值除以100在加上rem的单位就可以了。
也就是说:设置根元素字体大小为100px

html{
    font-size:100px;
}

于是,在整个页面中,就有这样的换算公式 : 1rem = 100px
如果页面中有一个div,宽为100px,高为50px。相应的样式为:

div{
    width:1rem;
    height:0.5rem;
}

对于使用sass的工程:
前端构建中,完全可以利用scss来解决这个问题,例如我们可以写一个scss的function px2rem即:

@function px2rem($px){
    $rem : 37.5px;
    @return ($px/$rem) + rem;
}

这样,在我们写具体数值样式的时候就可以写成:

height: px2rem(200px);
width: px2rem(200px);

对于rem:37.5px是怎么来的,正常情况下默认是16px,这个其实就是页面的基准值,和html的font-size有关。

rem基准值计算

关于rem的基准值,也就是上面那个37.5px其实是根据我们所拿到的视觉稿来决定的,主要有以下几点原因:

  • 由于我们所写出的页面是要在不同的屏幕大小设备上运行的
  • 所以我们在写样式的时候必须要先以一个确定的屏幕来作为参考,这个就由我们拿到的视觉稿来定
  • 假如我们拿到的视觉稿是以iphone6的屏幕为基准设计的
  • iPhone6的屏幕大小是375px
rem = window.innerWidth  / 10

这样计算出来的rem基准值就是37.5(iphone6的视觉稿),这里为什么要除以10呢,其实这个值是随便定义的,因为不想让html的font-size太大,当然也可以选择不除,只要在后面动态js计算时保证一样的值就可以,在这里列举一下其他手机的:
iphone4/5: 320px / 10 = 32px
iphone6: 375px / 10 =37.5px
iphone6plus: 414px / 10 =41.4px

动态设置html的font-size

现在关键问题来了,我们该如何通过不同的屏幕去动态设置html的font-size呢,这里一般分为两种办法

利用css的media query或者calc()来设置

@media (min-device-width : 375px) and (max-device-width : 667px) and (-webkit-min-device-pixel-ratio : 2){
      html{font-size: 37.5px;}
}

根据不同的屏幕大小来进行适配

利用javascript来动态设置

根据我们之前算出的基准值,我们可以利用js动态算出当前屏幕所适配的font-size即:

document.getElementsByTagName('html')[0].style.fontSize = window.innerWidth / 10 + 'px';
$(window).on('resize', function() {
document.getElementsByTagName('html')[0].style.fontSize = window.innerWidth / 10 + 'px';
    })

这里注意:当在使用js来设置时,需要绑定页面的resize事件来达到变化时更新html的font-size。
Demo:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
    <title>rem</title>
    <style type="text/css">
    html{
        font-size: calc(100vw/3.75);
    }
    /*
    100vw:是当前屏幕宽度
    根元素字体大小:代表元素在当前屏幕的宽度
    假设我们拿到的视觉稿是以iphone6的屏幕为基准设计的
    为了保证html的字体大小为100px,我们这样计算:
    100vw/W = 375/100 => W = 100vw/3.75
     */
    .box{
        width: 1rem;
        height: 1rem;
        background-color: red;
    }
    </style>
</head>
<body>
    <div class="box"></div>
    <script type="text/javascript" src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
    <script type="text/javascript">
    document.getElementsByTagName('html')[0].style.fontSize = window.innerWidth / 10 + 'px';
    // console.log(window.innerWidth);
    $(window).on('resize', function() {
    document.getElementsByTagName('html')[0].style.fontSize = window.innerWidth / 10 + 'px';
    })
    </script>
</body>
</html>

需要注意的地方

  • rem的适用性有局限,仅仅只能够用于只在移动端展示的页面。如果你的页面还需要适配到pc端,那么就老老实实的使用px吧。
  • 自己只是用来放在移动端的页面,别人却在pc端打开了,因此可以设置一个html的最大宽度与最小宽度。580px就是手机上浏览器的最大宽度。
html {
   max-width: 580px;
   min-height: 320px;
}
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liujie19901217/article/details/51394046
文章标签: css3
个人分类: CSS3
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭