原文地址

  • flexbox 内容换行
  • 间距
  • 长文本内容
  • 防止图像被拉伸或压缩
  • 锁定滚动链接
  • CSS 变量回退
  • 使用固定宽度或高度
  • 被忽略的 background-repeat
  • 垂直方向的媒体查询
  • 使用 justify-content: space-between
  • 图片上的文字
  • 使用 CSS 网格中的固定值需注意
  • 仅在需要时显示滚动条
  • 滚动条装订线
  • CSS flexbox 中的最小内容大小
  • CSS 网格中的最小内容大小
  • 自动适合与自动填充
  • 图片最大宽度
  • 位置:粘性css网格
  • 分组选择器

    内容

    flexbox 内容换行

    当我们使用 flexbox 布局的时候,默认情况下,在容器宽度不够时,可能就会出现这样的情况。
    2022/01/11 用好这 20 个 CSS 技巧快速提升你的技能 - 图1
    这个主要是因为 flex-wrap 的默认值是 nowrap,所以我们需要这样改变一下值。
    1. .options-list {
    2. display: flex;
    3. flex-wrap: wrap;
    4. }

2022/01/11 用好这 20 个 CSS 技巧快速提升你的技能 - 图2

* 间距

设计师在提供的设计稿中,很容易忽略文本在极限情况下与其他元素之间的间距,最终可能会出现这样的情况,文字与 icon 紧挨。
2022/01/11 用好这 20 个 CSS 技巧快速提升你的技能 - 图3
要处理这个情况,就是需要考虑是在文本还是 icon 部分,根据实际情况分析后选择添加 margin 值来增加间距。

  1. .section__title {
  2. margin-right: 1rem;
  3. }

2022/01/11 用好这 20 个 CSS 技巧快速提升你的技能 - 图4
不过这个情况,我一般会考虑在 icon 上加 margin-left,这样的话,在没有 icon 的时候,文字还是可以顶到容器边缘。

* 长文本内容

这个就简单,就是文本过长的处理方式,一般情况下就是换行或者截断并已 … 的形式出现。至于选择什么方式就要看当前页面模块的设计风格来决定了。
文中的处理方式是采用了截断出 … 这种。

  1. .username {
  2. white-space: nowrap;
  3. overflow: hidden;
  4. text-overflow: ellipsis;
  5. }

2022/01/11 用好这 20 个 CSS 技巧快速提升你的技能 - 图5

* 防止图像被拉伸或压缩

这种情况一般是在是图片由用户上传,或者图片未按规定比例使用导致的。
2022/01/11 用好这 20 个 CSS 技巧快速提升你的技能 - 图6
处理方式就是直接使用 object-fit 属性:

  1. .card__thumb {
  2. object-fit: cover;
  3. }

锁定滚动链接

主要出现的情况是在当页面中点击弹出 modal 弹层时,页面内容本身很长的时候。

  1. .modal__content {
  2. overscroll-behavior-y: contain;
  3. overflow-y: auto;
  4. }

overscroll-behavior 虽好,但目前存在很大的兼容性问题。
2022/01/11 用好这 20 个 CSS 技巧快速提升你的技能 - 图7

CSS 变量回退

这个 CSS 变量回退,说白了,其实就是当 CSS 变量值无效时而使用一个“安全值”来保证某个属性值还是可用的。

  1. .message__bubble {
  2. max-width: calc(100% - var(--actions-width, 70px));
  3. }

不过结合小志在做猎头之前写前端页面时的处理方式,可能还会去考虑一下浏览器对 var() 的兼容性问题,那么就会再加上一个属性。不过现在的浏览器来看,好像普遍性不存在这个问题。

  1. .message__bubble {
  2. max-width: 70px;
  3. max-width: var(--actions-width, 70px);
  4. }

使用固定宽度或高度

这个没啥说的,主要就是对内容过长时,溢出容器时的一个保护措施。比如当我们把高度固定为 350px 之后,内容过长就会溢出。
2022/01/11 用好这 20 个 CSS 技巧快速提升你的技能 - 图8
而如果我们把 height 换成 min-height 的话,那情况就有所不同了。
2022/01/11 用好这 20 个 CSS 技巧快速提升你的技能 - 图9
同理,在宽度的处理上也是一样。

被忽略的 background-repeat

在使用背景图的时候,如果没加上 no-repeat 的话,默认就会把背景图平铺开。
2022/01/11 用好这 20 个 CSS 技巧快速提升你的技能 - 图10
所以,随手加上 no-repeat 还是一个好习惯,除非你已知这张背景图是否要平铺。

  1. .hero {
  2. background-image: url('..');
  3. background-repeat: no-repeat;
  4. }

垂直方向的媒体查询

这个场景目前小志在页面中还未见过,一般在中后台页面出现的概率比较多,比如作者提供的页面效果。
2022/01/11 用好这 20 个 CSS 技巧快速提升你的技能 - 图11
左下角是通过 position: sticky; 定位的,可能通过 fixed 定位也是一样吧,然后当浏览器的高度变小的时候,就会叠在左侧的导航上面。
2022/01/11 用好这 20 个 CSS 技巧快速提升你的技能 - 图12
显然,这样的页面效果就不对了。而如果这个时候,通过 @media 方式判断页面高度,在某个安全区外我们才让左下角这部分通过 sticky 来定位。

  1. @media (min-height: 600px) {
  2. .aside__secondary {
  3. position: sticky;
  4. bottom: 0;
  5. }
  6. }

使用 justify-content: space-between

原文中这部分标题是 Using Justify-Content: Space-Between,但看起来更应该是 Using gap。使用什么标题不是关键,这部分主要是提到当使用 justify-content: space-between; 时,如果元素不够,元素与元素之间的间距就会拉长,因为要平均分布元素之间的间距。
比如原本是想要这样的一个效果,间距的值是固定的:
2022/01/11 用好这 20 个 CSS 技巧快速提升你的技能 - 图13
在元素数量足够的情况下,元素与元素之间的间距还是比较理想的,通过下面这个 CSS 处理方式:

  1. .wrapper {
  2. display: flex;
  3. flex-wrap: wrap;
  4. justify-content: space-between;
  5. }

但,元素的数量总是会不足的时候,那么就会这样了。
2022/01/11 用好这 20 个 CSS 技巧快速提升你的技能 - 图14
可见,其实并不是想要平均分布,而只是想要在最大的极限情况下和内容不足的时候,元素之间的间距是可控的。一般来说,这个处理方式挺多的,用 margin 之类的也是可以处理,不过目前有一个兼容性并不是十分好的 gap 能完美解决这个问题。

  1. .wrapper {
  2. display: flex;
  3. flex-wrap: wrap;
  4. gap: 1rem;
  5. }

2022/01/11 用好这 20 个 CSS 技巧快速提升你的技能 - 图15

* 图片上的文字

用户体验上的一个细节处理问题,如果在图片上有文案,但图片没加载出来,或者加载失败的时候,添加一个背景色,以保证图片加载失败的情况下,文字与背景能区分开。
2022/01/11 用好这 20 个 CSS 技巧快速提升你的技能 - 图16

使用 CSS 网格中的固定值需注意

grid 网格布局现在开始慢慢被关注了,grid 与 flex 一样都可以做自适应的效果,也可以使用固定值的情况。在使用固定值的时候,最好是通过 @media 判断一下宽度,以便于满足最小宽度时的处理。

  1. @media (min-width: 600px) {
  2. .wrapper {
  3. display: grid;
  4. grid-template-columns: 250px 1fr;
  5. gap: 1rem;
  6. }
  7. }

不过一般这种情况下,可能就直接改变页面布局了,感觉作者在这个方面上担忧是多余的。或者主要是自己未遇到过他所遇到的场景吧。

仅在需要时显示滚动条

这个没啥说的,一般大家都是把 scroll 设置为 auto。不过在个别情况下,可能这个 auto 会让元素的宽度变小,然后导致内容或者布局出现一点小瑕疵。

  1. .element {
  2. overflow-y: auto;
  3. }

滚动条装订线

这个所谓的装订线,主要就是 scrollbar-gutter 属性,保留滚动条的空间。在上面那个 overflow 例子中提到,如果设置为 auto 的时候,可能会导致页面布局出现非意料的情况,那么 scrollbar-gutter 就可以处理这个问题了。
兼容性还是一个不可避免的话题。
假设不考虑兼容性的问题,那么我们就可以使用这个方法保留滚动条的空间。

  1. .element {
  2. scrollbar-gutter: stable;
  3. }

2022/01/11 用好这 20 个 CSS 技巧快速提升你的技能 - 图17

* CSS flexbox 中的最小内容大小

在使用 flex 布局的时候,很有可能其中某个 item 的文本内容很长,最终导致没有换行而溢出容器之外。
2022/01/11 用好这 20 个 CSS 技巧快速提升你的技能 - 图18
这种情况也并不是说没有可能,就算是使用 overflow-wrap: break-word; 也不会有效果,那么这个时候需要加上 min-width: 0; 来处理。

  1. .card__title {
  2. overflow-wrap: break-word;
  3. min-width: 0;
  4. }

2022/01/11 用好这 20 个 CSS 技巧快速提升你的技能 - 图19
对于这点,小志心中有一个疑惑,为什么要考虑使用 overflow-wrap 的方式,而不使用 word-wrap 或者 word-break 呢?
通过 demo 对比之后发现,效果上 word-break: break-word; 与上述的例子是相同的结果,仅仅只是从文字换行的 demo 效果来看。但从 MDN 中对这两个属性的介绍来看,还是有区别的。

  • word-breakThe word-break CSS property sets whether line breaks appear wherever the text would otherwise overflow its content box.
    2022/01/11 用好这 20 个 CSS 技巧快速提升你的技能 - 图20
  • overflow-wrapThe overflow-wrap CSS property applies to inline elements, setting whether the browser should insert line breaks within an otherwise unbreakable string to prevent text from overflowing its line box.
    2022/01/11 用好这 20 个 CSS 技巧快速提升你的技能 - 图21

    CSS 网格中的最小内容大小

    与 flexbox 类似,CSS 网格的子项有一个默认的最小内容大小,即 auto,这意味着,如果存在大于网格项的元素,它将溢出。
    2022/01/11 用好这 20 个 CSS 技巧快速提升你的技能 - 图22 ```css @media (min-width: 1020px) { .wrapper { display: grid; grid-template-columns: 1fr 248px; grid-gap: 40px; } }

.carousel { display: flex; overflow-x: auto; }

  1. 对于网格这块,了解的不够深入,直接延用作者的意思就是将 grid-template-columns 的值改变一下,改为:minmax(0, 1fr) 248px 就可以得到下面这个效果。<br />![](https://cdn.nlark.com/yuque/0/2022/webp/21425465/1641868845701-1d5eb019-4f69-49fb-82c3-f1997172888f.webp#clientId=u80534cf8-66ac-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=u0e350632&margin=%5Bobject%20Object%5D&originHeight=457&originWidth=732&originalType=url&ratio=1&rotation=0&showTitle=false&status=done&style=none&taskId=u05a10bfa-504a-4c3e-97e8-4ef31d87e02&title=)
  2. <a name="Va08w"></a>
  3. ### 自动适合与自动填充
  4. 当时看到效果图的时候,我还以为是 flex 布局中的情况,结果是 grid 网格布局中使用的情况。<br />![](https://cdn.nlark.com/yuque/0/2022/webp/21425465/1641868845812-a2a860cf-2add-4e61-a2c6-932b4aa588d7.webp#clientId=u80534cf8-66ac-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=u6455bd3e&margin=%5Bobject%20Object%5D&originHeight=371&originWidth=732&originalType=url&ratio=1&rotation=0&showTitle=false&status=done&style=none&taskId=udbcb872a-8654-45ae-9e43-29220c5ac9f&title=)<br />在使用 grid 布局时,如果是这样写,利用 auto-fit 的话,就会是上面这个效果,item 不够时会被拉长。
  5. ```css
  6. .wrapper {
  7. display: grid;
  8. grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
  9. grid-gap: 1rem;
  10. }

而如果改为 auto-fill 的话就是下面这个效果。
2022/01/11 用好这 20 个 CSS 技巧快速提升你的技能 - 图23
对于 auto-fit 和 auto-fill 的区别可以看这张图。
2022/01/11 用好这 20 个 CSS 技巧快速提升你的技能 - 图24

* 图片最大宽度

作者建议可以在 reset 部分中对 img 加上最大宽度的设置,但没说具体是为什么。个人猜想是考虑图片在容器中的展示吧,同时还有一个 object-fit 属性。😆

  1. img {
  2. max-width: 100%;
  3. object-fit: cover;
  4. }

位置:粘性css网格

在使用 CSS 网格布局时,如果子元素使用了 position: sticky 的话,由于网格子元素的默认对齐方式是 stretch,所以会被拉伸。
2022/01/11 用好这 20 个 CSS 技巧快速提升你的技能 - 图25
而其实我们想要的是,左侧边栏并非拉伸效果的,所以,需要通过 align-self: start; 改变一下子元素自身的对齐方式。

  1. aside {
  2. align-self: start;
  3. position: sticky;
  4. top: 1rem;
  5. }

这样的话,效果就不一样了。
2022/01/11 用好这 20 个 CSS 技巧快速提升你的技能 - 图26
简单测试了一下,在 flex 布局中也是同样的情况,主要就是因为子元素的特性是拉伸的。

分组选择器

  1. /* Don't do this, please */
  2. input::-webkit-input-placeholder,
  3. input:-moz-placeholder {
  4. color: #222;
  5. }

现在写 CSS 的时候基本上都不会去写带前缀的属性,而是通过构建工具来自动完成。所以平时也不会在意这个。按照作者的说法是,如果把这两个写在一起,会导致整个规则失效,建议分开写。

  1. input::-webkit-input-placeholder {
  2. color: #222;
  3. }
  4. input:-moz-placeholder {
  5. color: #222;
  6. }

最后

以上内容看着其实都是挺简单,挺初级的内容,但是在日常开发过程中,对于 CSS 的注意的确有一些还是不够到位。毕竟有一些内容过于细节了