CSS的一些常见技巧

80 阅读7分钟

精灵图

1. 为什么需要精灵图

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

  • 因此,为了有效的减少服务器的接收和发送请求的次数,提高页面的加载速度,提出了CSS精灵技术

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

2. 精灵图的使用

  • 主要针对于背景图片的使用。把多个小图片整合到一张大图中,这个大图称为精灵图

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

  • 移动的距离就是这个目标图片的 x 和 y 坐标,往下往右坐标都是负值

  • 使用切片工具测出小图片的大小和坐标,不给坐标默认是左上角的位置

举个例子:

background: url(图片的位置) no-repeat -128px 0;

字体图标

使用场景:主要用于显示网页中通用、常用的一些小图标
上面说的精灵图有诸多优点,但是缺点也很明显:

  • 图片文件还是比较大的
  • 图片本身放大或缩小会失真
  • 图片一旦制作完成要想更换非常复杂

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

字体图标可以作为前端工程师提供的一种方便高效的图标使用方式,展示的是图标,本质属于字体(可以理解为不会失真,可以变大变小变漂亮...)

优点:

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

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

总结:

  1. 如果遇到一些样式结构比较简单的小图标,就用字体图标
  2. 遇到样式和结构复杂一点的图片,就用精灵图

1. 字体图标的下载

推荐下载网站:

2. 字体图标的引入(到HTML页面中)

  1. font文件夹放到页面根目录下(里面有多个字体文件,这样是为了浏览器的兼容)
  2. 在css样式中全局声明字体:把字体通过CSS引入到页面中,一定注意文字文件路径的问题
@font-face{
    font-family:'icomoon'; 
    ....这个代码要从解压的文件夹的css的文件中复制到有font-display:block;的地方。
}
  1. 双击里面的demo的HTML文件,复制下图类似小框或者前面的编码部分放到元素标签里

image.png

<style>
    span {
        content:'\e900';
        /*content:''*/
    	font-family: 'icomoon';
        font-size: 5px;
        color: pink;
        }	
</style>

<body>
	<span>复制的小图标</span>
</body>

字体图标的追加(添加新的小图标)

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

image.png image.png

CSS三角

        .box1 {
            width: 0;
            height: 0;
            /* border: 10px solid pink; */
            border-top: 10px solid pink;
            border-right: 10px solid red;
            border-bottom: 10px solid blue;
            border-left: 10px solid green;
        }
    <div class="box1"></div>

实现结果: image.png

        .box2 {
            width: 0;
            height: 0;
            border: 10px solid transparent;
            border-left-color: pink;
        }
    <div class="box2"></div>

实现结果:

image.png

案例1:

  <style>
        div{
            position:relative;
            width: 100px;
            height: 50px;
            background-color: green;
            margin: 100px auto;
        }

        span{
            position: absolute;
            left:100px;
            bottom:15px;
            width: 0;
            height: 0;
            
           /*为了浏览器的兼容*/ 
            line-height: 0;
            font-size: 0;
            /*为了浏览器的兼容*/ 
            
            border: 10px solid transparent;
            border-left-color:green;
        }
    </style>
     <div>
        <span></span>
    </div>

实现结果:

image.png

案例2:

 <style>
        .price {
            width: 160px;
            height: 24px;
            line-height: 24px;
            border: 1px solid red;
            margin: 0 auto;
        }

        .miaosha {
            position: relative;
            float: left;
            width: 90px;
            height: 100%;
            background-color: red;
            text-align: center;
            color: #fff;
            font-weight: 700;
        }

        .miaosha i {
            position: absolute;
            right: 0;
            top: 0;

            width: 0;
            height: 0;
            border-color: transparent #fff transparent transparent;
            border-style: solid;
            border-width: 24px 14px 0 0;
        }

        .origin {
            font-size: 12px;
            color: grey;
            text-decoration: line-through;
        }
    </style>
 <div class="price">
        <span class="miaosha">¥1650
            <i></i>
        </span>
        <span class="origin">¥5650</span>
    </div>

实现结果: image.png

CSS用户界面样式

所谓界面样式,就是更改一些用户的操作样式,以便提高用户体验。

  • 更改用户的鼠标样式
  • 表单轮廓
  • 防止表单被拖拽

1. 鼠标样式

li{
    cursor:pointer;
}

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

属性值描述
default小白 默认
pointer小手
move移动
text文本
not-allowed禁止

2. 轮廓线outline

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

input{
	outlinenone;
}

3. 防止文本拖拽resize

也默认有蓝色边框,右下角默认可以拖动。

textarea{
    outlinenone;
    resize:none;
}

tip:

<textarea>这个标签写到一行上,不然光标前会有空格</textarea>

vertical-align属性应用

使用场景:经常用于设置图片或者表单元素行内块元素)和文字垂直对齐
官方解释:用于设置一个元素的垂直对齐方式,但是他只针对行内元素或者行内块元素有效

vertical—align: baseline | top | middle |  bottom
标题描述
baseline默认,元素位置放在父元素的基线上
top把元素的顶端与行中最高元素的顶端对齐
middle把此元素位置放在父元素的中间
bottom把元素的顶端与行中最低的元素的顶端对齐

image-20220804164423347.png

display:inline-block;
vertical-align: middle;

1.图片、表单和文字对齐

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

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

2. 解决图片底部的空白缝隙

空隙是行内块元素和文字基线对齐。 发挥想象~

解决方法:

  • 给图片添加vertical-align:middle | top | bottom等。(提倡使用)
  • 把图片转换为块级元素 display:block;

溢出的文字用省略号显示

1. 单行文本溢出显示省略号

——必须满足三个条件

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

2. 多行文本溢出显示省略号

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

overflow:hidden;
text-overflow:ellipsis;

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

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

常见布局技巧

1. margin负值运用

float: left;/*浮动会让两个盒子贴在一起*/
margin-left: -1px;/*贴在一起的盒子左移1px,就压住左边盒子的右边框*/

如果要上层的盒子在有鼠标经过时有边框,需要提高当前盒子的层级(如果没有定位,则加相对定位(保留位置),如果有定位,则加z-index

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

2. 文字围绕浮动

利用浮动的元素不会压住文字的特性
文字会围绕浮动元素显示

<style>
        * {
            margin: 0;
            padding: 0;
        }

        .box {
            width: 200px;
            height: 70px;
            background-color: pink;
            margin: 100px auto;
            padding:5px;
        }

        .pic {
            float: left;
            width: 60px;
            height: 60px;
            margin-right: 5px;
            /* 图片和文字的距离 */
        }

        .pic img {
            height: 100%;
        }
    </style>
    <div class="box">
        <div class="pic">
            <img src="images/img.png" alt="">
        </div>
        <p>【集锦】xxxxxxxxxxxxxx </p>
    </div>

image.png

3. 行内块的巧妙应用

——页码 行内块元素和行内元素会因为text-align: center; 居中对齐,且有缝隙,行内块本身有大小

<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>
 <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="#" class="elp">...</a>
        <a href="#" class="next">&gt;&gt;下一页</a>
        到第
        <input type="text"><button>确定</button>
    </div>

实现结果: image.png