CSS -- 06. CSS高阶技巧总结

CSS高阶技巧

1 精灵图(sprites)

1.1 为什么使用精灵图

image-20221212180135122

一个网页中往往会应用很多小的背景图像作为修饰,当网页中的图像过多时,服务器就会频繁地接收和发送请求图片,造成服务器请求压力过大,这将大大降低页面的加载速度。

因此,**为了有效地减少服务器接收和发送请求的次数,提高页面的加载速度,**出现了 CSS 精灵技术(也称CSS Sprites、CSS 雪碧)

核心原理:将网页中的一些小背景图像整合到一张大图中 ,这样服务器只需要一次请求就可以了。

目的:为了有效减少服务器接受和发送请求的次数,提高页面的加载速度

1.2 精灵图的使用

使用精灵图核心:

  1. 精灵技术主要针对于背景图片使用。就是把多个小背景图片整合到一张大图片中。

  2. 这个大图片也称为 sprites 精灵图 或者 雪碧图

  3. 移动背景图片位置, 此时可以使用 background-position

  4. 移动的距离就是这个目标图片的 x 和 y 坐标。注意网页中的坐标有所不同

  5. 因为一般情况下都是往上往左移动,所以数值是负值。

  6. 使用精灵图的时候需要精确测量,每个小背景图片的大小和位置

使用精灵图核心总结:

  1. 精灵图主要针对于小的背景图片使用。

  2. 主要借助于背景位置来实现—background-position 。

  3. 一般情况下精灵图都是负值。(千万注意网页中的坐标: x轴右边走是正值,左边走是负值, y轴同理。)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>精灵图使用</title>
    <style>
        .box1 {
            width: 60px;
            height: 60px;   
            margin: 100px auto;
            background: url(images/sprites.png#pic_center) no-repeat   -182px 0;
        }
        .box2 {
            width: 27px;
            height: 25px;
            /* background-color: pink; */
            margin: 200px;
            background: url(images/sprites.png#pic_center) no-repeat  -155px -106px;
        }
    </style>
</head>
<body>
    <div class="box1"></div>
    <div class="box2"></div>
</body>
</html>

2 字体图标

2.1 字体图标的产生

字体图标使用场景: 主要用于显示网页中通用、常用的一些小图标。

精灵图是有诸多优点的,但是缺点很明显。

  1. 图片文件还是比较大的。

  2. 图片本身放大和缩小会失真。

  3. 一旦图片制作完毕想要更换非常复杂。

此时,有一种技术的出现很好的解决了以上问题,就是字体图标 iconfont

字体图标可以为前端工程师提供一种方便高效的图标使用方式,展示的是图标,本质属于字体

2.2 字体图标的优点

  • 轻量级:一个图标字体要比一系列的图像要小。一旦字体加载了,图标就会马上渲染出来,减少了服务器请求
  • 灵活性:本质其实是文字,可以很随意的改变颜色、产生阴影、透明效果、旋转等
  • 兼容性:几乎支持所有的浏览器,请放心使用

注意:

字体图标不能替代精灵技术,只是对工作中图标部分技术的提升和优化。

总结:

  1. 如果遇到一些结构和样式比较简单的小图标,就用字体图标。

  2. 如果遇到一些结构和样式复杂一点的小图片,就用精灵图

字体图标是一些网页常见的小图标,我们直接网上下载即可

2.3 字体图标的下载

推荐下载网站:

  • icomoon 字库 http://icomoon.io 推荐指数 ★★★★★

    IcoMoon 成立于 2011 年,推出了第一个自定义图标字体生成器,它允许用户选择所需要的图标,使它们成一字型。该字库内容种类繁多,非常全面,唯一的遗憾是国外服务器,打开网速较慢。

  • 阿里 iconfont 字库 http://www.iconfont.cn/ 推荐指数 ★★★★★

    这个是阿里妈妈 M2UX 的一个 iconfont 字体图标字库,包含了淘宝图标库和阿里妈妈图标库。可以使用 AI制作图标上传生成。 重点是,免费

2.4 字体图标的引入

以icomoon为例,在网站上下载完文件后得到一个压缩包,将压缩包解压之后,把里面的fonts文件夹放到页面的根目录下面

image-20221212192839063

fonts中有四个不同的文件,是为了兼容性问题

  1. TureType(.ttf)格式.ttf字体是Windows和Mac的最常见的字体,支持这种字体的浏览器有IE9+、Firefox3.5+、Chrome4+、Safari3+、Opera10+、iOS Mobile、Safari4.2+;

  2. Web Open Font Format(.woff)格式woff字体,支持这种字体的浏览器有IE9+、Firefox3.5+、Chrome6+、Safari3.6+、Opera11.1+;

  3. Embedded Open Type(.eot)格式.eot字体是IE专用字体,支持这种字体的浏览器有IE4+;

  4. SVG(.svg)格式.svg字体是基于SVG字体渲染的一种格式,支持这种字体的浏览器有Chrome4+、Safari3.1+、Opera10.0+、iOS Mobile Safari3.2+;

在 CSS 样式中全局声明字体: 简单理解把这些字体文件通过css引入到我们页面中。一定注意字体文件路径的问题。

这个代码不用背,用的时候拷贝一份就行

/*字体声明*/
@font-face {
    font-family: 'icomoon';
    src: url('fonts/icomoon.eot?7kkyc2');
    src: url('fonts/icomoon.eot?7kkyc2#iefix') format('embedded-opentype'),
        url('fonts/icomoon.ttf?7kkyc2') format('truetype'),
        url('fonts/icomoon.woff?7kkyc2') format('woff'),
        url('fonts/icomoon.svg?7kkyc2#icomoon') format('svg');
    font-weight: normal;
    font-style: normal;
}

然后打开压缩包里面带的demo.html,然后复制后面的图标,在需要用的地方粘贴后设置对应标签的font-family属性,就可以正常显示图标,然后还可以指定font-size, color等属性对图标进行修改

image-20221212193251942

span {
    font-family: 'icomoon';
    font-size: 100px;
    color:pink;
}

2.5 字体图标的追加

如果工作中,原来的字体图标不够用了,我们需要添加新的字体图标到原来的字体文件中。

把压缩包里面的 selection.json 从新上传,然后选中自己想要新的图标,从新下载压缩包,并替换原来的文件即可。

上传后选择yes重新加载

image-20221212193607309

然后继续选择新的图标,选完之后生成新的图标即可,这时候会把上次的图标也包含进来生成一个新的压缩包,解压后用新的fonts文件夹替换原来的fonts文件夹即可

3 CSS三角形

网页中常见一些三角形,使用 CSS 直接画出来就可以,不必做成图片或者字体图标

给每个边框不同的颜色可以看到,每个边框其实都是一个小三角形,那么我们就可以只设置一个或两个边框从而让一个盒子呈现出来三角形的样式

image-20221212212117239

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <meta http-equiv="X-UA-Compatible" content="ie=edge" />
        <title>CSS 三角制作</title>
        <style>
            .box1 {
                width: 0;
                height: 0;
                /* border: 10px solid pink; */
                border-top: 50px solid pink;
                border-right: 50px solid red;
                border-bottom: 50px solid blue;
                border-left: 50px solid green;
            }
        </style>
    </head>
    <body>
        <div class="box1"></div>
    </body>
</html>

我们只需要将边框的颜色设置为透明,然后给其中一个边颜色即可有下面效果

image-20221212212411301

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <meta http-equiv="X-UA-Compatible" content="ie=edge" />
        <title>CSS 三角制作</title>
        <style>
            .box2 {
                width: 0;
                height: 0;
                border: 50px solid transparent;
                border-left-color: pink;
                margin: 100px auto;
            }
        </style>
    </head>
    <body>
        <div class="box2"></div>
    </body>
</html>

类似对话框的效果:

image-20221212212825375

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>京东三角形</title>
        <style>
            .box {
                position: relative;
                width: 300px;
                height: 100px;
                margin: 200px auto;
                background-color: skyblue;
                padding: 10px;
                color: #fff;
            }

            .box span {
                position: absolute;

                width: 0px;
                height: 0px;
                right: -20px;
                top: 20px;
                border: 10px solid transparent;
                border-left-color: skyblue;
            }
        </style>
    </head>
    <body>
        <div class="box">
            <span></span>
            <p>这是段对话,我是说话者,看看效果怎么样,应该还不错</p>
        </div>
    </body>
</html>

4 CSS用户界面样式

4.1 鼠标样式 cursor

设置或检索在对象上移动的鼠标指针采用何种系统预定义的光标形状。

语法:

li {cursor: pointer; }

image-20221212212948201

可以拷贝自己试试效果

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>用户界面样式-鼠标样式</title>
</head>
<body>
    <ul>
        <li style="cursor: default;">我是默认的小白鼠标样式</li>
        <li style="cursor: pointer;">我是鼠标小手样式</li>
        <li style="cursor: move;">我是鼠标移动样式</li>
        <li style="cursor: text;">我是鼠标文本样式</li>
        <li style="cursor: not-allowed;">我是鼠标禁止样式</li>
    </ul>
</body>
</html>

image-20221212213136880

image-20221212213124050

image-20221212213107773

image-20221212213157064

image-20221212213220518

4.2 表单的轮廓线

给表单添加 outline: 0; 或者 outline: none; 样式之后,就可以去掉默认的蓝色边框

input {outline: none; }

4.3 防止拖拽文本域 resize

实际开发中,我们文本域右下角是不可以拖拽的。通过设置为none就可以进制拖曳,右下角的拖曳的地方就会消失

image-20221212213435712

这个是消失前的效果

textarea{ resize: none;}

5 vertical-align属性应用

CSS 的 vertical-align 属性使用场景: 经常用于设置图片或者表单(行内块元素)和文字垂直对齐。

官方解释: 用于设置一个元素的垂直对齐方式,但是它只针对于行内元素或者行内块元素有效。

image-20221212213627418

对于几条线的解释,顶线和底线确定了行高

image-20221212213704539

5.1 图片、表单和文字对齐

图片、表单都属于行内块元素,默认的 vertical-align 是基线对齐。

image-20221212214028320

此时可以给图片、表单这些行内块元素的 vertical-align 属性设置为 middle 就可以让文字和图片垂直居中对齐了。

5.2 解决图片底部默认空白缝隙问题

bug:图片底侧会有一个空白缝隙,原因是行内块元素会和文字的基线对齐。

主要解决方法有两种:

  1. 给图片添加 vertical-align:middle | top| bottom 等。 (提倡使用的)

  2. 把图片转换为块级元素 display: block;

就是因为和文字基线对齐,而基线下面到底线还有一部分距离,导致留有空白距离

6 溢出的文字省略号显示

6.1 单行文本溢出显示省略号

/*1. 先强制一行内显示文本 ( 默认为 normal 表示自动换行)*/
 white-space: nowrap; 
 /*2. 超出的部分隐藏*/
 overflow: hidden;
 /*3. 文字用省略号替代超出的部分*/
 text-overflow: ellipsis;

image-20221212215352728

6.2 多行文本溢出显示省略号

多行文本溢出显示省略号,有较大兼容性问题, 只适合于webKit浏览器或移动端(移动端大部分是webkit内核)

overflow: hidden;
text-overflow: ellipsis;
/* 弹性伸缩盒子模型显示 */
display: -webkit-box;
/* 限制在一个块元素显示的文本的行数 */
-webkit-line-clamp: 2;
/* 设置或检索伸缩盒对象的子元素的排列方式 */
-webkit-box-orient: vertical;

image-20221212215420899

更推荐让后台人员来做这个效果,因为后台人员可以设置显示多少个字,操作更简单。

7 常见的布局技巧

7.1 margin负值运用

当有一系列连续的盒子都有边框的时候,当他紧挨着会导致相邻的边框变成2倍的距离,看着非常的大,这个时候我们可以给右边的盒子添加margin-left: -1px就可以将其向左移动,压住相邻盒子的边框

image-20221212215752884

ul li {
    position: relative;
    float: left;
    list-style: none;
    width: 150px;
    height: 200px;
    border: 1px solid red;
    margin-left: -1px;
}

在float的时候就会紧挨着左边的盒子,再-1就会盖住边框

但是这样做会有个问题,当想添加鼠标移入边框高亮的效果时候会有一条边被盖住,这样看着就非常奇怪

image-20221212220129412

我们可以这样解决:鼠标经过某个盒子的时候,提高当前盒子的层级即可(如果没有有定位,则加相对定位(保留位置),如果有定位,则加z-index)

image-20221212220318992

变为相对定位是因为相对定位会压住其他的标注流盒子,有定位的时候添加z-index就行

ul li:hover {
    /* 1. 如果盒子没有定位,则鼠标经过添加相对定位即可 */
    position: relative;
    border: 1px solid blue;
}
ul li:hover {
    /* 2.如果li都有定位,则利用 z-index提高层级 */
    z-index: 1;
    border: 1px solid blue;
}

7.2 文字围绕浮动元素

巧妙运用浮动元素不会压住文字的特性,可以给图片添加float就可以实现

image-20221212220401957

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>文字围绕浮动元素的妙用</title>
        <style>
            * {
                margin: 0;
                padding: 0;
            }
            .box {
                width: 300px;
                height: 70px;
                background-color: pink;
                margin: 0 auto;
                padding: 5px;
            }
            .pic {
                float: left;
                width: 120px;
                height: 60px;
                margin-right: 5px;
            }
            .pic img {
                width: 100%;
            }
        </style>
    </head>
    <body>
        <div class="box">
            <div class="pic">
                <img src="images/img.png" alt="">
            </div>
            <p>【集锦】热身赛-巴西0-1秘鲁 内马尔替补两人血染赛场</p>
        </div>
    </body>
</html>

7.3 行内块的巧妙运用

居中显示页码块,可以将其转换为行内块元素,然后使用text-align: center;就可以将其居中显示

其实可以用一个div包裹起来,然后给div设置margin: 0px auto;

image-20221212220844977

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>行内块的巧妙运用</title>
        <style>
            * {
                margin: 0;
                padding: 0;
            }
            .box {
                text-align: center;
            }
            .box a {
                display: inline-block;
                width: 36px;
                height: 36px;
                background-color: #f7f7f7;
                border: 1px solid #ccc;
                text-align: center;
                line-height: 36px;
                text-decoration: none;
                color: #333;
                font-size: 14px;
            }
            .box .prev,
            .box .next {
                width: 85px;
            }
            .box .current,
            .box .elp {
                background-color: #fff;
                border: none;
            }
            .box input {
                height: 36px;
                width: 45px;
                border: 1px solid #ccc;
                outline: none;
            }
            .box button {
                width: 60px;
                height: 36px;
                background-color: #f7f7f7;
                border: 1px solid #ccc;

            }
        </style>
    </head>
    <body>
        <div class="box">
            <a href="#" class="prev">&lt;&lt;上一页</a>
            <a href="#" class="current">2</a>
            <a href="#">3</a>
            <a href="#">4</a>
            <a href="#">5</a>
            <a href="#">6</a>
            <a href="#" class="elp">...</a>
            <a href="#" class="next">&gt;&gt;下一页</a>
            到第 
            <input type="text"><button>确定</button>
        </div>
    </body>
</html>

7.4 CSS三角强化

实现如下效果

image-20221212221230362

实现思路,我们只需要拼出右侧的图形,然后将其设置绝对定位放到左边的红色矩形中就可以

image-20221212221248219

我们依然可以通过三角形来实现

.box {
    width: 0px;
    height: 0px;
    border-top: 50px solid pink;
    border-right: 50px solid red;
    border-bottom: 50px solid blue;
    border-left: 50px solid green;
}

首先对于这个代码进行修改,当四个边框一样大的时候,出来的图形就很好理解

image-20221212221739637

当我们将border-top设置为100px的时候,就会变成下面这种情况,可以看到上侧被拉长了,我们需要的图形就是右侧三角形的上半部分,因此我们可以把下边框的宽度设置为0

image-20221212221836821

我们就得到了需要的三角形,将其他两个边框隐藏后就可以得到最后需要的图形

image-20221212221926431

最后生成的图形如下,css代码:

.box {
    width: 0px;
    height: 0px;
    border-top: 100px solid transparent;
    border-right: 50px solid red;
    border-bottom: 0px solid transparent;
    border-left: 0px solid transparent;
}

对其进行简化可以为:

.box {
    width: 0px;
    height: 0px;
    /*顺序仍然是上右下左*/
    border-color: transparent red transparent transparent;
    border-width: 100px 50px 0px 0px;
    border-style: solid;
}

image-20221212221959570

8 CSS初始化

不同浏览器对有些标签的默认值是不同的,为了消除不同浏览器对HTML文本呈现的差异,照顾浏览器的兼容,我们需要对CSS 初始化

简单理解: CSS初始化是指重设浏览器的样式。 (也称为CSS reset

每个网页都必须首先进行 CSS初始化。这里我们以 京东CSS初始化代码为例。

/* 把我们所有标签的内外边距清零 */
* {
    margin: 0;
    padding: 0
}
/* em 和 i 斜体的文字不倾斜 */
em,
i {
    font-style: normal
}
/* 去掉li 的小圆点 */
li {
    list-style: none
}

img {
    /* border 0 照顾低版本浏览器 如果 图片外面包含了链接会有边框的问题 */
    border: 0;
    /* 取消图片底侧有空白缝隙的问题 */
    vertical-align: middle
}

button {
    /* 当我们鼠标经过button 按钮的时候,鼠标变成小手 */
    cursor: pointer
}

a {
    color: #666;
    text-decoration: none
}

a:hover {
    color: #c81623
}

button,
input {
    /* "\5B8B\4F53" 就是宋体的意思 这样浏览器兼容性比较好 */
    font-family: Microsoft YaHei, Heiti SC, tahoma, arial, Hiragino Sans GB, "\5B8B\4F53", sans-serif
}

body {
    /* CSS3 抗锯齿形 让文字显示的更加清晰 */
    -webkit-font-smoothing: antialiased;
    background-color: #fff;
    font: 12px/1.5 Microsoft YaHei, Heiti SC, tahoma, arial, Hiragino Sans GB, "\5B8B\4F53", sans-serif;
    color: #666
}

.hide,
.none {
    display: none
}

/* 清除浮动 */
.clearfix:after {
    visibility: hidden;
    clear: both;
    display: block;
    content: ".";
    height: 0
}

.clearfix {
    *zoom: 1
}

Unicode编码字体:

把中文字体的名称用相应的Unicode编码来代替,这样就可以有效的避免浏览器解释CSS代码时候出现乱码的问题。比如:

  • 黑体 \9ED1\4F53
  • 宋体 \5B8B\4F53
  • 微软雅黑 \5FAE\8F6F\96C5\9ED1
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hydrion-Qlz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值