前端开发入门笔记(八)CSS3属性详解:动画详解+Flex布局图文详解+Web字体

简介: 前端开发入门笔记(八)CSS3属性详解:动画详解+Flex布局图文详解+Web字体

参考链接https://web.qianguyihao.com/02-CSS%E5%9F%BA%E7%A1%80/12-CSS3%E5%B1%9E%E6%80%A7%E8%AF%A6%E8%A7%A3%EF%BC%9A%E5%8A%A8%E7%94%BB%E8%AF%A6%E8%A7%A3.html#_3%E3%80%81%E6%97%8B%E8%BD%AC%EF%BC%9Arotate

过渡

transition的中文含义是过渡。过渡是CSS3中具有颠覆性的一个特征,可以实现元素不同状态间的平滑过渡(补间动画),经常用来制作动画效果。

补间动画

补间动画:自动完成从起始状态到终止状态的的过渡。不用管中间的状态。

帧动画:通过一帧一帧的画面按照固定顺序和速度播放。如电影胶片。

参考链接:补间动画基础

过渡

过渡包括以下属性:

  • transition-property: all;如果希望所有的属性都发生过渡,就使用all
  • transition-duration: 1s;过渡的持续时间。
  • transition-timing-function:linear;运动曲线。属性值可以是:
  • linear线性
  • ease减速
  • ease-in加速
  • ease-out减速
  • ease-in-out先加速后减速
  • transition-delay: 1s;过渡延迟。多长时间后再执行这个过渡动画。

上面的四个属性也可以写成综合属性:

transition: 让哪些属性进行过度 过渡的持续时间 运动曲线 延迟时间;

例如:

transition: all 3s linear 0s;

其中,这个属性是尤其需要注意的,不同的属性值有不同的现象。我们来示范一下。

transition-property

如果设置为width,意思是只让盒子的宽度在变化时进行过渡。效果如下:

transition-property: width;

如果设置为all,意思是让盒子的所有属性(包括宽度、背景色等)在变化时都进行过渡。效果如下:

transition-property: all;

案例:小米商品详情

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>CSS 过渡</title>
    <style>
        body {
            margin: 0;
            padding: 0;
            background-color: #eeeeee;
        }
        
        .content {
            width: 800px;
            height: 320px;
            padding-left: 20px;
            margin: 80px auto;
        }
        
        .item {
            width: 230px;
            height: 300px;
            text-align: center;
            margin-right: 20px;
            background-color: #FFF;
            float: left;
            position: relative;
            top: 0;
            overflow: hidden; /* 让溢出的内容隐藏起来。意思是让下方的橙色方形先躲起来 */
            transition: all .5s; /* 从最初到鼠标悬停时的过渡 */
        }
        
        .item img {
            margin-top: 30px;
        }
        
        .item .desc {
            position: absolute;
            left: 0;
            bottom: -80px;
            width: 100%;
            height: 80px;
            background-color: #ff6700;
            transition: all .5s;
        }
        
        /* 鼠标悬停时,让 item 整体往上移动5px,且加一点阴影 */
        .item:hover {
            top: -5px;
            box-shadow: 0 0 15px #AAA;
        }
        
        /* 鼠标悬停时,让下方的橙色方形现身 */
        .item:hover .desc {
            bottom: 0;
        }
    </style>
</head>
<body>
<div class="content">
    <div class="item">
        <img src="./images/1.png" alt="">
    </div>
    <div class="item">
        <img src="./images/2.png" alt="">
        <span class="desc"></span>
    </div>
    <div class="item">
        <img src="./images/3.jpg" alt="">
        <span class="desc"></span>
    </div>
</div>
</body>
</html>

效果如下:

2D 转换

转换是 CSS3 中具有颠覆性的一个特征,可以实现元素的位移、旋转、变形、缩放,甚至支持矩阵方式。转换再配合过渡和动画,可以取代大量早期只能靠 Flash 才可以实现的效果。在 CSS3 当中,通过 转换来实现 2D 转换或者 3D 转换。

transform: transform-functions;

2D 转换

转换是 CSS3 中具有颠覆性的一个特征,可以实现元素的位移、旋转、变形、缩放,甚至支持矩阵方式。

转换再配合过渡和动画,可以取代大量早期只能靠 Flash 才可以实现的效果。

在 CSS3 当中,通过转换来实现 2D 转换或者 3D 转换。transform

2D 转换包括:缩放、移动、旋转。

我们依次来讲解。

1、缩放:scale

格式:

transform: scale(x, y);
transform: scale(2, 0.5);

参数解释:x 表示水平方向的缩放倍数。y 表示垂直方向的缩放倍数。如果只写一个值就是等比例缩放。

取值:大于 1 表示放大,小于 1 表示缩小。不能为百分比。

格式举例:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        .box {
            width: 1000px;
            margin: 100px auto;
        }
        .box div {
            width: 300px;
            height: 150px;
            background-color: pink;
            float: left;
            margin-right: 15px;
            color: white;
            text-align: center;
            font: 400 30px/150px “宋体”;
        }
        .box .box2 {
            background-color: green;
            transition: all 1s;
        }
        .box .box2:hover {
            background-color: yellowgreen;
            transform: scale(2, 0.5);
        }
    </style>
</head>
<body>
<div class="box">
    <div class="box1">1</div>
    <div class="box2">2</div>
    <div class="box3">3</div>
</div>
</body>
</html>

效果:

上图可以看到,给 box1 设置 2D 转换,并不会把兄弟元素挤走。

2、位移:translate

格式:

transform: translate(水平位移, 垂直位移);
transform: translate(-50%, -50%);

参数解释:

参数为百分比,相对于自身移动。

正值:向右和向下。负值:向左和向上。如果只写一个值,则表示水平移动。

格式举例:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        .box {
            width: 1000px;
            margin: 100px auto;
        }
        .box > div {
            width: 300px;
            height: 150px;
            border: 1px solid #000;
            background-color: red;
            float: left;
            margin-right: 30px;
        }
        div:nth-child(2) {
            background-color: pink;
            transition: all 1s;
        }
        div:nth-child(2):hover {
            transform: translate(-50%, -50%);
        }
    </style>
</head>
<body>
<div class="box">
    <div class="box1">1</div>
    <div class="box2">2</div>
    <div class="box3">3</div>
</div>
</body>
</html>

效果:

上图中,因为我在操作的时候,鼠标悬停后,立即进行了略微的移动,所以产生了两次动画。正确的效果应该是下面这样的:

**应用:**让绝对定位中的盒子在父亲里居中

我们知道,如果想让一个标准流中的盒子在父亲里居中(水平方向看),可以将其设置属性 margin: 0 auto

可如果盒子是绝对定位的,此时已经脱标了,如果还想让其居中(位于父亲的正中间),可以这样做:

div {
    width: 600px;
    height: 60px;
    position: absolute;  /* 绝对定位的盒子 */
    left: 50%;           /* 首先,让左边线居中 */
    top: 0;
    margin-left: -300px;  /* 然后,向左移动宽度(600px)的一半 */
}

如上方代码所示,我们先让这个宽度为 600px 的盒子,左边线居中,然后向左移动宽度(600px)的一半,就达到效果了。

现在,我们还可以利用偏移 translate 来做,这也是比较推荐的写法:

div {
    width: 600px;
    height: 60px;
    background-color: red;
    position: absolute;       /* 绝对定位的盒子 */
    left: 50%;               /* 首先,让左边线居中 */
    top: 0;
    transform: translate(-50%);    /* 然后,利用 translate,往左走自己宽度的一半【推荐写法】 */
}

3、旋转:rotate

格式:

transform: rotate(角度);
transform: rotate(45deg);

参数解释:正值顺时针;负值:逆时针。

举例:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        .box {
            width: 200px;
            height: 200px;
            background-color: red;
            margin: 50px auto;
            color: #fff;
            font-size: 50px;
            transition: all 2s; /* 过渡:让盒子在进行 transform 转换的时候,有个过渡期 */
        }
        .box:hover {
            transform: rotate(-405deg); /* 鼠标悬停时,让盒子进行旋转 */
        }
    </style>
</head>
<body>
<div class="box">1</div>
</body>
</html>

效果:

注意,上方代码中,我们给盒子设置了 transform 中的 rotate 旋转,但同时还要给盒子设置 transition 过渡。如果没有这行过渡的代码,旋转会直接一步到位,效果如下:(不是我们期望的效果)

案例1:小火箭

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        html,body{
            height:100%;
        }
        body{
            background-color: #DE8910;
        }
        .rocket{
            position: absolute;
            left:100px;
            top:600px;
            height: 120px;
            transform:translate(-200px ,200px) rotate(45deg);
            transition:all 1s ease-in;
        }
        body:hover .rocket{
            transform:translate(500px,-500px) rotate(45deg);
        }
    </style>
</head>
<body>
    <img  class="rocket" src="images/rocket.png" alt=""/>
</body>
</html>

上方代码中,我们将 transform 的两个小属性合并起来写了。

小火箭图片的网址:http://img.smyhvae.com/20180208-rocket.png

案例2:扑克牌

rotate 旋转时,默认是以盒子的正中心为坐标原点的。如果想改变旋转的坐标原点,可以用 transform-origin 属性。格式如下:

transform-origin: 水平坐标 垂直坐标;
transform-origin: 50px 50px;
transform-origin: center bottom; //旋转时,以盒子底部的中心为坐标原点

我们来看一下 rotate 结合 transform-origin 的用法举例。

代码如下:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        body {
            /*background-color: #eee;*/
        }
        .box {
            width: 300px;
            height: 440px;
            margin: 100px auto;
            position: relative;
        }
        img {
            width: 100%;
            transition: all 1.5s;
            position: absolute; /* 既然扑克牌是叠在一起的,那就都用绝对定位 */
            left: 0;
            top: 0;
            transform-origin: center bottom; /*旋转时,以盒子底部的中心为坐标原点*/
            box-shadow: 0 0 3px 0 #666;
        }
        .box:hover img:nth-child(6) {
            transform: rotate(-10deg);
        }
        .box:hover img:nth-child(5) {
            transform: rotate(-20deg);
        }
        .box:hover img:nth-child(4) {
            transform: rotate(-30deg);
        }
        .box:hover img:nth-child(3) {
            transform: rotate(-40deg);
        }
        .box:hover img:nth-child(2) {
            transform: rotate(-50deg);
        }
        .box:hover img:nth-child(1) {
            transform: rotate(-60deg);
        }
        .box:hover img:nth-child(8) {
            transform: rotate(10deg);
        }
        .box:hover img:nth-child(9) {
            transform: rotate(20deg);
        }
        .box:hover img:nth-child(10) {
            transform: rotate(30deg);
        }
        .box:hover img:nth-child(11) {
            transform: rotate(40deg);
        }
        .box:hover img:nth-child(12) {
            transform: rotate(50deg);
        }
        .box:hover img:nth-child(13) {
            transform: rotate(60deg);
        }
    </style>
</head>
<body>
<div class="box">
    <img src="images/pk1.png"/>
    <img src="images/pk2.png"/>
    <img src="images/pk1.png"/>
    <img src="images/pk2.png"/>
    <img src="images/pk1.png"/>
    <img src="images/pk2.png"/>
    <img src="images/pk1.png"/>
    <img src="images/pk2.png"/>
    <img src="images/pk1.png"/>
    <img src="images/pk2.png"/>
    <img src="images/pk1.png"/>
    <img src="images/pk2.png"/>
    <img src="images/pk1.png"/>
</div>
</body>
</html>

效果如下:

3D 转换

1、旋转:旋转X、旋转Y、旋转Z

3D坐标系(左手坐标系)

如上图所示,伸出左手,让拇指和食指成"L"形,大拇指向右,食指向上,中指指向前方。拇指、食指和中指分别代表X、Y、Z轴的正方向,这样我们就建立了一个左手坐标系。

浏览器的这个平面,是X轴、Y轴;垂直于浏览器的平面,是Z轴。

旋转的方向:(左手法则)

左手握住旋转轴,竖起拇指指向旋转轴的正方向,正向就是其余手指卷曲的方向。

从上面这句话,我们也能看出:所有的3d旋转,对着正方向去看,都是顺时针旋转。

格式:

  • transform: rotateX(360deg); //绕 X 轴旋转360度
  • transform: rotateY(360deg); //绕 Y 轴旋转360度
  • transform: rotateZ(360deg); //绕 Z 轴旋转360度

格式举例:

(1)旋转X 举例:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        .rotateX {
            width: 300px;
            height: 226px;
            margin: 200px auto;
            /* 透视 :加给变换的父盒子*/
            /* 设置的是用户的眼睛距离 平面的距离*/
            /* 透视效果只是视觉上的呈现,并不是正真的3d*/
            perspective: 110px;
        }
        img {
            /* 过渡*/
            transition: transform 2s;
        }
        /* 所有的3d旋转,对着正方向去看,都是顺时针旋转*/
        .rotateX:hover img {
            transform: rotateX(360deg);
        }
    </style>
</head>
<body>
<div class="rotateX">
    <img src="images/x.jpg" alt=""/>
</div>
</body>
</html>

效果:

上方代码中,我们最好加个透视的属性,方能看到3D的效果;没有这个属性的话,图片旋转的时候,像是压瘪了一样。

而且,透视的是要加给图片的父元素 div,方能生效。我们在后面会讲解透视属性。

(2)旋转 Y 举例:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        .rotateY {
            width: 237px;
            height: 300px;
            margin: 100px auto;
            /* 透视 */
            perspective: 150px;
        }
        img {
            transition: all 2s;  /* 过渡 */
        }
        .rotateY:hover img {
            transform: rotateY(360deg);
        }
    </style>
</head>
<body>
<div class="rotateY">
    <img src="images/y.jpg" alt=""/>
</div>
</body>
</html>

效果:

(3)旋转Z 举例:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        .rotateZ {
            width: 330px;
            height: 227px;
            margin: 100px auto;
            /* 透视*/
            perspective: 200px;
        }
        img {
            transition: all 1s;
        }
        .rotateZ:hover img {
            transform: rotateZ(360deg);
        }
    </style>
</head>
<body>
<div class="rotateZ">
    <img src="images/z.jpg" alt=""/>
</div>
</body>
</html>

效果:

案例:百度钱包的水平翻转效果

要实现百度钱包的水平翻转效果,可以使用CSS的transform属性和rotateY函数来实现。以下是一个简单的示例:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>百度钱包水平翻转效果</title>
    <style>
        .flip-container {
            perspective: 1000px;
            margin: 100px auto;
            text-align: center;
        }
        .flip-container:hover .flipper {
            transform: rotateY(180deg);
        }
        .flipper {
            transition: 0.6s;
            transform-style: preserve-3d;
            position: relative;
        }
        .front, .back {
            backface-visibility: hidden;
            position: absolute;
            top: 0;
            left: 0;
        }
        .front {
            z-index: 2;
            background-color: #f1f1f1;
            width: 300px;
            height: 200px;
            line-height: 200px;
        }
        .back {
            transform: rotateY(180deg);
            background-color: #ddd;
            width: 300px;
            height: 200px;
        }
    </style>
</head>
<body>
<div class="flip-container">
    <div class="flipper">
        <div class="front">
            正面内容
        </div>
        <div class="back">
            反面内容
        </div>
    </div>
</div>
</body>
</html>

在上述代码中,我们定义了一个外层容器flip-container,并给它设置了透视效果perspective属性。当鼠标悬停在容器上时,通过设置.flip-container:hover .flipper的样式,来触发翻转效果。

内层容器flipper使用transform: rotateY(180deg)来实现翻转。正面内容使用类名为frontdiv元素表示,反面内容使用类名为backdiv元素表示。通过调整它们的样式,可以设置不同的背景颜色、大小等信息。

你可以将示例代码复制到一个HTML文件中并运行,以查看百度钱包水平翻转效果。

3、透视:perspective

电脑显示屏是一个 2D 平面,图像之所以具有立体感(3D效果),其实只是一种视觉呈现,通过透视可以实现此目的。

透视可以将一个2D平面,在转换的过程当中,呈现3D效果。但仅仅只是视觉呈现出 3d 效果,并不是正真的3d。

格式有两种写法:

  • 作为一个属性,设置给父元素,作用于所有3D转换的子元素
  • 作为 transform 属性的一个值,做用于元素自身。

格式举例:

perspective: 500px;

4、3D呈现(transform-style)

3D元素构建是指某个图形是由多个元素构成的,可以给这些元素的父元素设置来使其变成一个真正的3D图形。属性值可以如下:

transform-style: preserve-3d;     /* 让 子盒子 位于三维空间里 */
transform-style: flat;            /* 让子盒子位于此元素所在的平面内(子盒子被扁平化) */

**案例:**立方体

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        .box {
            width: 250px;
            height: 250px;
            border: 1px dashed red;
            margin: 100px auto;
            position: relative;
            border-radius: 50%;
            /* 让子盒子保持3d效果*/
            transform-style: preserve-3d;
            /*transform:rotateX(30deg) rotateY(-30deg);*/
            animation: gun 8s linear infinite;
        }
        .box > div {
            width: 100%;
            height: 100%;
            position: absolute;
            text-align: center;
            line-height: 250px;
            font-size: 60px;
            color: #daa520;
        }
        .left {
            background-color: rgba(255, 0, 0, 0.3);
            /* 变换中心*/
            transform-origin: left;
            /* 变换*/
            transform: rotateY(90deg) translateX(-125px);
        }
        .right {
            background: rgba(0, 0, 255, 0.3);
            transform-origin: right;
            /* 变换*/
            transform: rotateY(90deg) translateX(125px);
        }
        .forward {
            background: rgba(255, 255, 0, 0.3);
            transform: translateZ(125px);
        }
        .back {
            background: rgba(0, 255, 255, 0.3);
            transform: translateZ(-125px);
        }
        .up {
            background: rgba(255, 0, 255, 0.3);
            transform: rotateX(90deg) translateZ(125px);
        }
        .down {
            background: rgba(99, 66, 33, 0.3);
            transform: rotateX(-90deg) translateZ(125px);
        }
        @keyframes gun {
            0% {
                transform: rotateX(0deg) rotateY(0deg);
            }
            100% {
                transform: rotateX(360deg) rotateY(360deg);
            }
        }
    </style>
</head>
<body>
<div class="box">
    <div class="up">上</div>
    <div class="down">下</div>
    <div class="left">左</div>
    <div class="right">右</div>
    <div class="forward">前</div>
    <div class="back">后</div>
</div>
</body>
</html>

动画

动画是CSS3中具有颠覆性的特征,可通过设置多个节点来精确控制一个或一组动画,常用来实现复杂的动画效果。

1、定义动画的步骤

(1)通过@keyframes定义动画;

(2)将这段动画通过百分比,分割成多个节点;然后各节点中分别定义各属性;

(3)在指定元素里,通过属性调用动画。animation

之前,我们在 js 中定义一个函数的时候,是先定义,再调用:

js 定义函数:
    function fun(){ 函数体 }
 调用:
    fun();

同样,我们在 CSS3 中定义动画的时候,也是先定义,再调用:

定义动画:
    @keyframes 动画名{
        from{ 初始状态 }
        to{ 结束状态 }
    }
 调用:
    animation: 动画名称 持续时间;

其中,animation属性的格式如下:

animation: 定义的动画名称 持续时间  执行次数  是否反向  运动曲线 延迟执行。(infinite 表示无限次)
animation: move1 1s  alternate linear 3;
animation: move2 4s;

定义动画的格式举例:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        .box {
            width: 100px;
            height: 100px;
            margin: 100px;
            background-color: red;
            /* 调用动画*/
            /* animation: 动画名称 持续时间  执行次数  是否反向  运动曲线 延迟执行。infinite 表示无限次*/
            /*animation: move 1s  alternate linear 3;*/
            animation: move2 4s;
        }
        /* 方式一:定义一组动画*/
        @keyframes move1 {
            from {
                transform: translateX(0px) rotate(0deg);
            }
            to {
                transform: translateX(500px) rotate(555deg);
            }
        }
        /* 方式二:定义多组动画*/
        @keyframes move2 {
            0% {
                transform: translateX(0px) translateY(0px);
                background-color: red;
                border-radius: 0;
            }
            25% {
                transform: translateX(500px) translateY(0px);
            }
            /*动画执行到 50% 的时候,背景色变成绿色,形状变成圆形*/
            50% {
                /* 虽然两个方向都有translate,但其实只是Y轴上移动了200px。
                因为X轴的500px是相对最开始的原点来说的。可以理解成此时的 translateX 是保存了之前的位移 */
                transform: translateX(500px) translateY(200px);
                background-color: green;
                border-radius: 50%;
            }
            75% {
                transform: translateX(0px) translateY(200px);
            }
            /*动画执行到 100% 的时候,背景色还原为红色,形状还原为正方形*/
            100% {
                /*坐标归零,表示回到原点。*/
                transform: translateX(0px) translateY(0px);
                background-color: red;
                border-radius: 0;
            }
        }
    </style>
</head>
<body>
<div class="box">
</div>
</body>
</html>

注意好好看代码中的注释。

2、动画属性

我们刚刚在调用动画时,animation属性的格式如下:

动画属性的格式如下:

animation: 定义的动画名称  持续时间  执行次数  是否反向  运动曲线 延迟执行。(infinite 表示无限次)
animation: move1 1s  alternate linear 3;
animation: move2 4s;

可以看出,这里的 animation 是综合属性,接下来,我们把这个综合属性拆分看看。

(1)动画名称:

animation-name: move;

(2)执行一次动画的持续时间:

animation-duration: 4s;

备注:上面两个属性,是必选项,且顺序固定。

(3)动画的执行次数:

animation-iteration-count: 1;       /*iteration的含义表示迭代*/
属性值表示无数次。infinite

(3)动画的方向:

animation-direction: alternate;
属性值:normal 正常,alternative 反向。

(4)动画延迟执行:

animation-delay: 1s;

(5)设置动画结束时,盒子的状态:

animation-fill-mode: forwards;
属性值: forwards:保持动画结束后的状态(默认), backwards:动画结束后回到最初的状态。

(6)运动曲线:

animation-timing-function: ease-in;
属性值可以是:线性缓入-出步骤()等。

注意,如果把属性值写成steps(),则表示动画不是连续执行,而是间断地分成几步执行。我们接下来专门讲一下属性值 steps()

步骤()的效果

我们还是拿上面的例子来举例,如果在调用动画时,我们写成:

animation: move2 4s steps(2);

效果如下:

有了属性值 steps(),我们就可以作出很多不连续地动画效果。比如时钟;再比如,通过多张静态的鱼,作出一张游动的鱼。

steps() 示例:时钟的简易模型

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title></title>
    <style>
        div {
            width: 3px;
            height: 200px;
            background-color: #000;
            margin: 100px auto;
            transform-origin: center bottom;    /* 旋转的中心点是底部 */
            animation: myClock 60s steps(60) infinite;
        }
        @keyframes myClock {
            0% {
                transform: rotate(0deg);
            }
            100% {
                transform: rotate(360deg);
            }
        }
    </style>
</head>
<body>
<div></div>
</body>
</html>

上方代码,我们通过一个黑色的长条div,旋转360度,耗时60s,分成60步完成。即可实现。

效果如下:

Web字体

参考链接:https://web.qianguyihao.com/02-CSS%E5%9F%BA%E7%A1%80/14-CSS3%E5%B1%9E%E6%80%A7%E8%AF%A6%E8%A7%A3%EF%BC%9AWeb%E5%AD%97%E4%BD%93.html#webfont-%E7%9A%84%E4%BD%BF%E7%94%A8%E6%AD%A5%E9%AA%A4

Web 字体是指能够在网页中使用的字体,也被称为网络字体。在过去,网页的字体只有几种预设字体可供选择;但随着 CSS3 的到来,我们可以使用更多的自定义字体来设计网页,从而实现更加个性化的页面布局和设计效果。

以下是与 Web 字体相关的 CSS3 属性:

@font-face

@font-face 是一种 CSS3 规范,用于定义自定义字体,让浏览器能够识别并加载这些字体。使用 @font-face 可以允许开发者在网页中使用非系统预设的字体。

语法:

@font-face {
    font-family: '字体名称';
    src: url('字体文件.woff') format('woff'),
         url('字体文件.ttf') format('truetype');
}

使用 @font-face 可以引入多个版本的字体文件,用于适配不同的浏览器和操作系统。

font-family

font-family 属性用于指定文字展示时所使用的字体名称列表。如果当前字体不存在,则会尝试使用后面的字体。我们可以在 font-family 中添加自定义的字体名称。

语法:

selector { 
    font-family: '字体名称', serif;
}

这里的 serif 是指默认字体,如果前面自定义的字体无法使用时,就会使用默认字体来展示。

font-style

font-style 属性用于指定字体样式,包括 italic(斜体)oblique(倾斜)normal(正常)等。

语法:

selector {
    font-style: italic;
}

font-weight

font-weight 属性用于指定字体的粗细程度,可以设置为数值或关键字。

语法:

selector {
    font-weight: bold;
}

font-size

font-size 属性用于指定字体的大小。

语法:

selector {
    font-size: 16px;
}

font-stretch

font-stretch 属性指定文本的拉伸效果。它可以对大多数字体生效,但并非所有字体都支持。常见的属性值有 ultra-condensed, extra-condensed, condensed, semi-condensed, normal, semi-expanded, expanded, extra-expandedultra-expanded

语法:

selector {
    font-stretch: ultra-expanded;
}

综上所述,通过 Web 字体,我们可以实现对网页字体的自定义设计。使用 @font-face 可以引入自定义字体文件,而其他的属性则用于对字体样式、大小和拉伸效果的设置。

字体的常见格式

不同浏览器所支持的字体格式是不一样的,我们有必要了解一下字体格式的知识。

TrueType格式:(.ttf)

.ttf 字体是Windows和Mac的最常见的字体,是一种RAW格式。

支持这种字体的浏览器有IE9+、Firefox3.5+、Chrome4+、Safari3+、Opera10+、iOS Mobile、Safari4.2+。

OpenType格式:(.otf)

.otf 字体被认为是一种原始的字体格式,其内置在TureType的基础上。

支持这种字体的浏览器有Firefox3.5+、Chrome4.0+、Safari3.1+、Opera10.0+、iOS Mobile、Safari4.2+。

Web Open Font Format格式:(.woff)

woff字体是Web字体中最佳格式,他是一个开放的TrueType/OpenType的压缩版本,同时也支持元数据包的分离。

支持这种字体的浏览器有IE9+、Firefox3.5+、Chrome6+、Safari3.6+、Opera11.1+。

Embedded Open Type格式:(.eot)

.eot字体是IE专用字体,可以从TrueType创建此格式字体,支持这种字体的浏览器有IE4+。

SVG格式:(.svg)

.svg字体是基于SVG字体渲染的一种格式。

支持这种字体的浏览器有Chrome4+、Safari3.1+、Opera10.0+、iOS Mobile Safari3.2+。

总结:

了解了上面的知识后,我们就需要为不同的浏览器准备不同格式的字体。通常我们会通过字体生成工具帮我们生成各种格式的字体,因此无需过于在意字体格式之间的区别。

下载字体的网站推荐:

WebFont 的使用步骤

Flex布局图文详解

前言

CSS3中的 flex 属性,在布局方面做了非常大的改进,使得我们对多个元素之间的布局排列变得十分灵活,适应性非常强。其强大的伸缩性和自适应性,在网页开中可以发挥极大的作用。

flex 初体验

我们先来看看下面这个最简单的布局:

上面这张图中的布局是我们都熟悉的:默认文档流中,在一个父容器里放置多个块级的子元素,那么,这些子元素会默认从上往下排列。

在此基础之上,如果我给父容器仅仅加一个 display: flex属性,此时,这些子元素的布局会摇身一变:

没错,子元素们会在水平方向上,从左至右排列,就是这么神奇。到此为止,你已经掌握了关于 flex 的一半的知识。

flex 布局的优势

  1. flex 布局的子元素不会脱离文档流,很好地遵从了“流的特性”。
    但你如果用 float 来做布局,float 属性的元素会脱离文档流,而且会涉及到各种 BFC、清除浮动的问题。浮动相关的问题,比较麻烦,所以也成了面试必问的经典题目。但有了 flex 布局之后,这些问题都不存在的。
  2. flex 是一种现代的布局方式,是 W3C 第一次提供真正用于布局的 CSS 规范。 flex 非常提供了丰富的属性,非常灵活,让布局的实现更佳多样化,且方便易用。
    flex 唯一的缺点就在于,它不支持低版本的 IE 浏览器。

flex 的兼容性问题

"flex"属性是CSS3中的一个重要特性,全称是Flexible Box,也被称为Flexbox。确实,Flexbox在网页布局方面提供了极大的灵活性和便利性。以下是Flexbox主要的一些特性和优点:

  1. 方向性:Flexbox允许你改变元素的排列方向。例如,你可以让元素从水平方向排列(默认)变为垂直方向,或者反过来。
  2. 伸缩性:Flexbox提供了对元素的伸缩控制。你可以设置元素在容器中的最小和最大尺寸,也可以设置元素在分配多余空间时的增长方式。
  3. 对齐性:Flexbox提供了强大的对齐控制。你可以控制元素在行或列方向上的对齐方式,也可以设置元素如何沿着主轴和交叉轴对齐。
  4. 顺序性:Flexbox允许你改变元素在容器中的顺序,而不必改变它们在HTML代码中的顺序。
  5. 灵活性:Flexbox可以很容易地适应不同的屏幕尺寸和不同的设备。
  6. 无浮动:Flexbox是一种“布局模式”,这意味着它不需要像浮动那样清除浮动,也不需要像表格那样设置宽度和高度。

通过使用Flexbox,开发者可以更加简洁地创建复杂的布局,并且能够更好地控制元素之间的空间和对齐。同时,由于Flexbox是CSS3的一部分,它支持所有现代浏览器,包括IE10及以上版本。

Flexbox布局的主要优点包括:

  1. 灵活性:Flexbox允许在容器内按比例分布剩余的可用空间,这使得实现灵活的布局变得非常容易。
  2. 内容对齐和居中:可以在容器内轻松地对齐内容,包括居中、顶部对齐、底部对齐等,而无需复杂的定位技巧。
  3. 适应不同屏幕尺寸:Flexbox布局非常适合响应式设计,可以根据不同的屏幕尺寸和设备自动调整布局。
  4. 元素的大小控制:可以控制元素的大小,以确保元素具有一致的宽度或高度。
  5. 简单易用:Flexbox的语法相对简单,易于理解和使用。
  6. 自适应性:Flexbox具有较强的自适应性,可以根据不同设备的屏幕尺寸和分辨率自动调整布局。
  7. 支持嵌套:Flexbox支持嵌套,可以实现更加复杂的布局效果。
  8. 弹性高:Flexbox支持内容的自动伸缩和对齐方式的灵活设置,可以在不同的容器尺寸下实现高弹性的布局效果。

需要注意的是,虽然Flexbox布局有很多优点,但在应用过程中需要注意其语法和容器与子元素的关系,以及在旧版浏览器(如IE8及以下版本)中的兼容性问题。

Flexbox布局在响应式设计中具有以下优势:

  1. 灵活的空间分布:Flexbox允许在容器内按比例分布剩余的可用空间,这使得实现灵活的布局变得非常容易,可以根据不同屏幕尺寸和设备自动调整布局。
  2. 内容对齐和居中:Flexbox可以在容器内轻松地对齐内容,包括居中、顶部对齐、底部对齐等,而无需复杂的定位技巧,使得页面中的元素可以灵活地进行对齐和居中。
  3. 适应不同屏幕尺寸:Flexbox布局非常适合响应式设计,可以根据不同的屏幕尺寸和设备自动调整布局,使得页面在不同设备上都能够得到良好的展示效果。
  4. 元素的大小控制:Flexbox可以控制元素的大小,以确保元素具有一致的宽度或高度,也可以根据需要自动调整元素的大小。
  5. 简单易用:相对于CSS Grid布局,Flexbox布局更加简单易用。它使用起来更加直观,不需要过多的代码和配置,适合快速实现简单的布局需求。
  6. 自适应性:Flexbox具有较强的自适应性,可以根据不同设备的屏幕尺寸和分辨率自动调整布局。
  7. 支持嵌套:Flexbox支持嵌套,可以实现更加复杂的布局效果,使得页面的设计更加丰富和灵活。
  8. 弹性高:Flexbox支持内容的自动伸缩和对齐方式的灵活设置,可以在不同的容器尺寸下实现高弹性的布局效果。

综上所述,Flexbox布局在响应式设计中具有灵活、简单、易用、自适应性强等优点,使得页面在不同设备上都能够得到良好的展示效果。

好的,以下是Flexbox布局在响应式设计中更为详细的优点:

  1. 直观和简单:Flexbox提供了一种简单直观的方式来设计页面布局,它通过设置容器和子元素的属性来控制元素的排布和尺寸,使得布局更加简单易用。相对于其他的布局方式,如浮动、定位等,Flexbox的语法更加清晰,易于理解和使用。
  2. 更好的可访问性:Flexbox布局对于视觉障碍的用户更加友好,因为它们遵循语义化的规则,使得屏幕阅读器更容易解析和理解页面内容。
  3. 易于维护:Flexbox的设计使得页面布局更加模块化,可以单独调整和修改每个模块的布局,而不会影响到其他模块。这使得页面维护更加方便,也降低了开发和维护的成本。
  4. 高度自定义:Flexbox提供了大量的属性和值,可以高度自定义布局的各个方面,包括主轴、交叉轴、对齐方式、换行方式等。这使得设计师可以根据具体的需求和设计要求来调整布局,以适应不同的设计场景。
  5. 跨浏览器兼容性:Flexbox布局被大多数现代浏览器所支持,包括IE10及以上版本。这使得使用Flexbox布局的页面在不同的浏览器上都能够得到良好的展示效果,而不需要担心兼容性问题。
  6. 与Grid布局结合使用:虽然Flexbox和CSS Grid都是强大的布局工具,但它们可以结合使用,以实现更加复杂和灵活的布局效果。Flexbox可以作为Grid布局的子元素,以实现特定区域的布局和排布。

综上所述,Flexbox布局在响应式设计中具有许多优点,使得页面布局更加灵活、简单、易于维护和跨浏览器兼容,同时也提高了可访问性和用户体验。

为什么要定义flex属性:

Flex属性是Flexbox布局的核心,它提供了一种简单、灵活的方式来指定容器中子元素的排布和尺寸。具体来说,Flex属性可以控制子元素在容器内的对齐方式、排列方式以及占据的空间比例等。

为什么要使用Flex属性呢?主要有以下几个原因:

  1. 提供更大的灵活性:Flexbox布局允许指定容器中的子元素具有更大的灵活性,可以根据容器和子元素的不同特点进行定制化的布局。这对于需要展示不同内容、不同布局的网页来说非常有帮助。
  2. 简化布局过程:相对于其他的布局方式,如浮动、定位等,Flexbox布局更加简单易用。它通过设置容器和子元素的属性来控制元素的排布和尺寸,使得布局更加直观和简单。
  3. 支持响应式设计:Flexbox布局非常适合响应式设计,可以根据不同的屏幕尺寸和设备自动调整布局。这使得页面在不同设备上都能够得到良好的展示效果,提高了用户体验。
  4. 提高可访问性:Flexbox布局对于视觉障碍的用户更加友好,使得屏幕阅读器更容易解析和理解页面内容,提高了页面的可访问性。

总之,Flex属性是Flexbox布局的重要组成部分,它提供了一种简单、灵活的方式来指定容器中子元素的排布和尺寸,使得页面布局更加灵活、易于维护,并且支持响应式设计和提高可访问性。

以下是几个Flexbox布局的例子:

  1. 将一组元素水平排列:
<div class="container">
  <div class="item">Item 1</div>
  <div class="item">Item 2</div>
  <div class="item">Item 3</div>
</div>

CSS样式:

.container {
  display: flex;      /* 启用Flexbox */
}
.item {
  flex: 1;            /* 所有元素等宽 */
}
  1. 将一组元素垂直排列:
<div class="container">
  <div class="item">Item 1</div>
  <div class="item">Item 2</div>
  <div class="item">Item 3</div>
</div>

CSS样式:

.container {
  display: flex;      /* 启用Flexbox */
  flex-direction: column; /* 元素垂直排列 */
}
  1. 控制元素的对齐方式:
<div class="container">
  <div class="item">Item 1</div>
  <div class="item">Item 2</div>
  <div class="item">Item 3</div>
</div>

CSS样式:

.container {
  display: flex;      /* 启用Flexbox */
  justify-content: center; /* 水平居中 */
  align-items: center;   /* 垂直居中 */
}
  1. 控制元素的换行方式:
<div class="container">
  <div class="item">Item 1</div>
  <div class="item">Item 2</div>
  <div class="item">Item 3</div>
  <div class="item">Item 4</div>
  <div class="item">Item 5</div>
</div>

常见的Flexbox应用场景包括:

  1. 导航菜单和页脚布局:Flexbox可以轻松实现导航菜单和页脚的布局,并能够根据屏幕大小自适应调整。
  2. 列表和卡片布局:无论是水平排列的列表还是垂直排列的卡片,Flexbox都能提供灵活的实现方案。
  3. 表单布局:使用Flexbox可以轻松地将表单元素(如输入框、选择框等)排列成行或列,同时还可以实现元素的自适应大小。
  4. 响应式布局:Flexbox基于CSS3,支持响应式布局。这意味着在不同的设备和屏幕大小下,可以通过简单的媒体查询和Flexbox属性设置实现布局的自适应调整。
  5. 网格布局:通过结合Flexbox的网格系统,可以实现灵活的行列布局,这在构建复杂的网页布局时非常有用。
  6. 水平居中和垂直居中:Flexbox提供了简单的方法来实现元素的水平居中和垂直居中,这在传统CSS布局中往往是比较困难的问题。
目录
相关文章
|
19天前
|
前端开发 JavaScript 安全
前端性能调优:HTTP/2与HTTPS在Web加速中的应用
【10月更文挑战第27天】本文介绍了HTTP/2和HTTPS在前端性能调优中的应用。通过多路复用、服务器推送和头部压缩等特性,HTTP/2显著提升了Web性能。同时,HTTPS确保了数据传输的安全性。文章提供了示例代码,展示了如何使用Node.js创建一个HTTP/2服务器。
33 3
|
16天前
|
监控 前端开发 JavaScript
探索微前端架构:构建可扩展的现代Web应用
【10月更文挑战第29天】本文探讨了微前端架构的核心概念、优势及实施策略,通过将大型前端应用拆分为多个独立的微应用,提高开发效率、增强可维护性,并支持灵活的技术选型。实际案例包括Spotify和Zalando的成功应用。
|
20天前
|
前端开发 JavaScript
Bootstrap Web 前端 UI 框架
Bootstrap 是快速开发 Web 应用程序的前端工具包。
30 3
|
20天前
|
前端开发 安全 应用服务中间件
前端性能调优:HTTP/2与HTTPS在Web加速中的应用
【10月更文挑战第26天】随着互联网的快速发展,前端性能调优成为开发者的重要任务。本文探讨了HTTP/2与HTTPS在前端性能优化中的应用,介绍了二进制分帧、多路复用和服务器推送等特性,并通过Nginx配置示例展示了如何启用HTTP/2和HTTPS,以提升Web应用的性能和安全性。
19 3
|
20天前
|
前端开发 JavaScript API
前端框架新探索:Svelte在构建高性能Web应用中的优势
【10月更文挑战第26天】近年来,前端技术飞速发展,Svelte凭借独特的编译时优化和简洁的API设计,成为构建高性能Web应用的优选。本文介绍Svelte的特点和优势,包括编译而非虚拟DOM、组件化开发、状态管理及响应式更新机制,并通过示例代码展示其使用方法。
34 2
|
21天前
|
开发框架 前端开发 JavaScript
Web前端框架
Web前端框架等名词
16 2
|
17天前
|
前端开发 容器
实现CSS品字布局
【10月更文挑战第27天】
|
21天前
|
监控 前端开发 JavaScript
前端技术探索:构建高效、可维护的Web应用
【10月更文挑战第23天】前端技术探索:构建高效、可维护的Web应用
37 0
|
4月前
|
JavaScript 前端开发 Java
前端网页开发学习(HTML+CSS+JS)有这一篇就够!(二)
前端网页开发学习(HTML+CSS+JS)有这一篇就够!(二)