[译]5个 CSS 避坑实践

631 阅读3分钟

文章来自 Medium 的一篇文章哦,原文地址: betterprogramming.pub/5-css-pract…

1. 设置 margin 和 padding,然后重置他们

我总是看到一些人给所有元素设置 margin 或者 padding,然后再重置第一或者最后一个元素。其实可以用 1 条规则而不是 2 条规则去实现。可以直接对选中的元素一次完成设置。
使用 nth-child/nth-of-type 选择器和:not() 伪类选择器或者邻接选择器完成。

不要这么做:

.item {
  margin-right: 1.6rem;
}

.item:last-child {
  margin-right: 0;
}

可以

.item:not(:last-child) {
  margin-right: 1.6rem;
}

或者:

.item:nth-child(n+2) {
  margin-left: 1.6rem;
}

或者:

.item + .item {
  margin-left: 1.6rem;
}

2. 没必要为 position: absolute 或 fixed 设置 display:block

你知道吗没必要为 position: absolute 或 fixed 的元素设置 display:block 因为 position: absolute 或 fixed 的元素本身就是 display:block

当然,当你为 inline-*的元素设置 display:block 的时候,他们也会发生相应的变化:inline 或者 inline-block 会变成 block, inline-flex -> flex, inline-grid -> grid, 以及inline-table -> table.

不要这么做

.button::before {
  content: "";
  position: absolute;
  display: block;
}

或者

.button::before {
  content: "";
  position: fixed;
  display: block;
}

可以

.button::before {
  content: "";
  position: absolute;
}

或者

.button::before {
  content: "";
  position: fixed;
}

3. 使用 transform: translate (-50%, -50%) 居中

有一个经常引起很多麻烦的问题。这种情况一直持续到2015年,所有的解决方案都带来了某种困难。我说的是让任意高的元素在两个轴上居中。

特别是,一种解决方案是结合使用绝对定位和 transform 属性。这种技术在基于 chrome 的浏览器中会导致文本模糊问题。

但是在引入 flexbox 之后,在我看来,这种技术就不再重要了。问题是它不能解决文本模糊的问题。更重要的是,它让你使用五个属性。因此,我想分享一个可以将代码减少为两个属性的技巧。

我们可以在flexbox 容器子元素上使用margin: auto,浏览器将元素居中。只需要两个属性就可完成。

不要这么做:

.parent {
  position: relative;
}

.child {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}

可以这么写:

.parent {
  display: flex;
}

.child {
  margin: auto;
}

4. 为 block 的元素设置宽度

我们经常使用 display: flex 创建一个多列网格,并逐渐转换为单列。将多列转为单列布局的时候,一些开发者使用 width: 100% 来实现。我不明白他们为什么这么做,因为多列布局的元素本身就是 block,并不需要额外的样式设置。
因此,我们不需要使用width: 100%,而是应该编写媒体查询,以便 display: flex 仅用于创建多列网格。

不要这么做:

<div class="parent">
  <div class="child">Item 1</div>
  <div class="child">Item 2</div>
  <div class="child">Item 3</div>
  <div class="child">Item 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">Item 1</div>
  <div class="child">Item 2</div>
  <div class="child">Item 3</div>
  <div class="child">Item 4</div>
</div>
@media (min-width: 1024px) {
  .parent {
    display: flex;
    flex-wrap: wrap;
  }

  .child {
    width: 25%;
  }
}

5. 为 flex 元素项设置 display: block

当使用 display: flex 属性的时候,知道这一点很重要:父元素(display: flex )下面的所有子元素都会自动被设置为 display: block

这意味着子元素的display 只会被设置为了 block。相应地,如果您设置inline或inline-block,它将更改为block、inline-flex -> flex、inline-grid -> grid和inline-table -> table。

因此,不用向 display: flex 子元素添加 display: block。浏览器会帮你完成。

不要这么做:

.parent {
  display: flex;
}

.child {
  display: block;
}

可以这么做:

.parent {
  display: flex;
}