今天我要分享的是我总结的一些CSS编程坏习惯。希望你在编写CSS代码时,可以扬长避短,一切顺利。
## 1\. 先给所有元素定义相同的属性,然后重置其中之一
关于这个如何设置一些属性然后再重新设置的问题,让我觉得很纳闷,因为我本身比较倾向于使用简短的CSS。
在元素之间设置边距时很容易出现问题。这个时候大多数人会怎么做呢?首先,他们设置所有元素,然后把第一个或最后一个元素重新设置。
但其实还可以通过选择器,例如`nth-child`/`nth-of-type`选择器,以及`:not()`伪类或者`next-sibling`协调器 (又称为`+`)来实现目标。下面我将用具体的代码示例来说明。
不要这样做:
~~~
.item {
margin-right: 1rem;
}
.item:last-child {
margin-right: 0;
}
~~~
可以这样做:
~~~
.item:not(:last-child) {
margin-right: 1rem;
}
/*或者*/
.item:nth-child(n+2) {
margin-left: 1rem;
}
/*或者*/
.item + .item {
margin-left: 1rem;
}
~~~
## 2\. 给绝对定位或固定定位的元素应用display:block样式
我经常遇到的一个常见错误是添加`display:block`到带有`position: absolute`或`position: fixed`的元素。之所以不应该怎样做,是因为浏览器会自动给带有`position: absolute`或`position: fixed`的元素设置`display:block`样式,并不需要你手动添加。
不要这样做:
~~~
.button::before {
content: "";
display: block;
position: absolute;
}
/*or*/
.button::before {
content: "";
display: block;
position: fixed;
}
~~~
可以这样做:
~~~
.button::before {
content: "";
position: absolute;
}
/*or*/
.button::before {
content: "";
position: fixed;
}
~~~
## 3\. 通过transform: translate(-50%, -50%)方法居中元素
长期以来,一直盛行使用`transform`属性居中元素的方法。我敢打包票正在阅读这篇文章的各位肯定写过`transform: translate(-50%, -50%)`。
在这种方法中,我们必须使用5个属性的集合。但是今天我分享的方法可以将代码减少到两个属性。
不知道大家有没有用过自动边距?据说这是flexbox的主要优势之一。原因就在于它是可以预测的。我们不需要知道元素的宽度和高度即可实现居中。
我们只需要写`margin: auto`即可,浏览器就会在可用空间中居中显示。如果没有可用空间,那么浏览器将准确显示。
不要这样做:
~~~
.parent {
position: relative;
}
.child {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
~~~
可以这样做:
~~~
.parent {
display: flex;
}
.child {
margin: auto;
}
~~~
## 4\. 给块级元素定义width:100%
很多人会选择的一种做法是使用flexbox创建一个可以转换为单列的多列网格。我认为对多列网格使用flexbox是ok的,但是对于创建单列网格则并非如此。
在这种情况下,网格的项通过`width:100%`在父级宽度上延展开来。但是我们忘记了网格的项在默认情况下是以这种方式延伸的块级元素。
因此,我们不需要使用`width:100%`。只要在需要创建多列网格时直接使用flexbox即可。
不要这样做:
~~~
<div class="parent">
<div class="child">1</div>
<div class="child">2</div>
<div class="child">3</div>
<div class="child">4</div>
</div>
~~~
~~~
.parent {
display: flex;
flex-wrap: wrap;
}
.child {
width: 100%;
}
@media (min-width: 1024px) {
.child {
width: 25%;
}
}
~~~
可以这样做:
~~~
<div class="parent">
<div class="child">1</div>
<div class="child">2</div>
<div class="child">3</div>
<div class="child">4</div>
</div>
~~~
~~~
@media (min-width: 1024px) {
.parent {
display: flex;
flex-wrap: wrap;
}
.child {
width: 25%;
}
}
~~~
## 5\. 给flex-items定义display:block
flexbox还有一个重要的功能。当你对元素定义`display:flex`时,那么其所有的子元素(flex-items)都会被定义为block。
这是什么意思?所有`display`属性为`inline`,`inline-block`,`inline-flex`,`inline-grid`或`inline-table`的flex元素都将被更改。`inline`和`inline-block`将更改为`block`,`inline-flex`\->`flex`,`inline-grid`\->`grid`和`inline-table`\->`table`。
因此,避免使用`inline-*`值以使得代码简洁清晰。
不要这样做:
~~~
.parent {
display: flex;
}
.child {
display: block;
}
~~~
可以这样做:
~~~
.parent {
display: flex;
}
~~~
- markdown
- 前端技术
- fiddler抓包
- thingjs项目设计
- 目录结构
- thingjs 模型
- 开发规范
- thingjs引入vuejs
- uniapp性能优化
- 防抖与节流
- uniapp 使用高德地图做路径规划不生效解决方法
- 5个CSS编程坏习惯
- echarts 刮刮乐
- jquery轮播图
- uniapp滚动问题
- 5 个不常提及的 HTML 技巧
- Http 缓存简介
- canvas像素操作
- Chrome 调试技巧
- H5隐藏特性
- vue 实战中的一些小技巧
- vue-video-player组件
- JS循环大总结
- vue自定义指令1
- 剩余运算符,扩展运算符(...)用法
- 后端技术
- 面向对象
- linux
- docker
- centos
- CentOS7安装MySQL
- CentOS7安装php
- 阿里云
- 添加宝塔
- 添加子域名
- ssl证书部署
- Liunx常用的命令
- php
- 项目常见问题总结
- 开发规范
- 9个PHP小技巧
- php生成二维码
- 算法
- 经纬度计算距离
- Kmp算法
- mysql
- 索引
- 索引概述及优势
- 索引结构
- 事务
- mysql 数据库任务计划
- 接口
- RESTful API接口设计标准及规范
- 保证接口的安全
- 了解DOS/DDOS/CSRF/XSS攻击
- 防止攻击
- mongoDB
- 安装
- Docker 安装 MongoDB
- 安装扩展
- docker安装mongodb扩展
- supervisor
- 自动化开发
- 接口字典代码配置
- 建模
- three模型展示
- 应用市场
- 应用宝上架流程
- vivo上架流程
- 华为上架流程
- 小米上架流程
- android 获取应用签名
- git部分
- git 基本操作命令
- git解决冲突
- 打包那些事
- electron
- android系统进程保活
