CSS

重复功能

该函数repeat()用于重复网格布局中的列数和行数。可以在CSS Grid属性grid-template-columns和中使用此功能grid-template-rows。它还可以嵌套其他功能,例如minmax()fit-contentrepeat()函数还允许以更紧凑的形式写入大量的列和行。它包含两个参数:要重复的次数以及要重复的列大小或行大小。假设要创建一个具有6列的网格布局,则可以使用以下语法,来做到这一点:

  1. div {
  2. displaygrid;
  3. grid-template-columns1fr 1fr 1fr 1fr 1fr 1fr;
  4. }

代码看起来很丑陋,很难编写。可以通过使用repeat()函数来解决此问题。
示例代码如下:

  1. div {
  2. displaygrid;
  3. grid-template-columnsrepeat61fr ;
  4. }

结果如下:
19 个 CSS 高级技巧汇总 - 图1
这更容易编写。例如,如果要创建4行50px的行,可以再次使用repeat()函数:

  1. div {
  2. displaygrid;
  3. grid-template-rowsrepeat450px ;
  4. }

结果如下:
19 个 CSS 高级技巧汇总 - 图2

最小-最大功能

该功能minmax()定义了最小尺寸和最大尺寸之间的尺寸范围。如果调整手机的屏幕尺寸,内容将缩小直到达到最小尺寸为止。如果调整桌面屏幕的大小,内容将一直延伸到达到最大大小为止。

  1. minmax200px1fr);
  2. minmax400px50%);
  3. minmax30%,300px);

CSS Grid属性grid-template-columns和中也使用此功能grid-template-rows。它有两个参数:最小大小和最大大小。
假设要制作一个具有4列的网格布局,并且还希望使用该功能minmax()来拉伸内容并使所有内容具有响应性。将手机屏幕的最小像素为50px,桌面屏幕的最大像素为380px。
看下面的例子:

  1. .container {
  2. displaygrid;
  3. grid-template-columnsrepeat4minmax50px380px));
  4. }

如上所示,由于需要4列,因此使用该函数将函数repeat()重复了minmax()4次。minmax()嵌套在里面reapeat()
在小屏幕上输出的结果如下:
19 个 CSS 高级技巧汇总 - 图3
在更大屏幕上输出的结果如下:
19 个 CSS 高级技巧汇总 - 图4
因此,该功能minmax()允许根据屏幕尺寸来拉伸和缩小内容。

适合内容功能

该函数fit-content采用绝对长度或百分比的参数。它用于根据列和行内部的内容自动更改列和行的大小。
该函数fit-content根据以下公式将给定尺寸夹紧为可用尺寸:

  1. / * 最小值(最大大小,最大值(最小大小,参数))* /
  2. / * 上面的公式等效于:* /
  3. fit-contentarguments

它也可以用作CSS属性进行使用。
以下为演示示例代码:

  1. .container {
  2. displaygrid;
  3. grid-template-columnsfit-content300pxfit-content300px ;
  4. }

演示结果如下:
19 个 CSS 高级技巧汇总 - 图5
当添加了一些内容后,得到的结果如下:
19 个 CSS 高级技巧汇总 - 图6

计数器

要为编号列表中的数字设置样式,需要使用称为CSS计数器的属性。CSS计数器可以根据内容在文档中的位置来调整内容的外观。

  1. <ul class="list">
  2. <li>Item</li>
  3. <li>Item</li>
  4. <li>Item</li>
  5. <li>Item</li>
  6. <li>Item</li>
  7. <li>Item</li>
  8. </ul>
  1. li {
  2. font-size: 40px;
  3. margin-bottom: 20px;
  4. counter-increment: li;
  5. }
  6. .list li::before {
  7. content: counter(li);
  8. margin-right: 10px;
  9. width: 50px;
  10. height: 50px;
  11. border-radius: 50%;
  12. display: inline-block;
  13. background-color: #f3b70f;
  14. color: white;
  15. text-align: center;
  16. line-height: 50px;
  17. }

19 个 CSS 高级技巧汇总 - 图7

::选择

:: selection伪元素适用于DOM上突出显示的元素。语法如下所示:

  1. p::selection {
  2. color: white;
  3. background-color: green;
  4. }

19 个 CSS 高级技巧汇总 - 图8

attr()函数。

它用于检索所选元素的属性值,并在样式表中使用它。

  1. <h2 class="title" data-count="01">Section</h2>
  2. <h2 class="title" data-count="02">Section</h2>
  3. <h2 class="title" data-count="03">Section</h2>
  1. .title {
  2. font-size: 35px;
  3. letter-spacing: 3px;
  4. }
  5. .title::before {
  6. content: attr(data-count);
  7. font-size: 1.2em;
  8. color: steelblue;
  9. margin-right: 10px;
  10. }

19 个 CSS 高级技巧汇总 - 图9

将笔划添加到Web文本

  1. <h2>Css is Awesome</h2>
  1. h2 {
  2. -webkit-text-fill-color: transparent;
  3. -webkit-text-stroke: 3px tomato;
  4. }

19 个 CSS 高级技巧汇总 - 图10

使用 :not() 在菜单上应用/取消应用边框

先给每一个菜单项添加边框

  1. /* add border */
  2. .nav li {
  3. border-right: 1px solid #666;
  4. }

然后再除去最后一个元素

  1. // remove border /
  2. .nav li:last-child {
  3. border-right: none;
  4. }

可以直接使用 :not() 伪类来应用元素:

  1. .nav li:not(:last-child) {
  2. border-right: 1px solid #666;
  3. }

这样代码就干净,易读,易于理解了。
当然,如果新元素有兄弟元素的话,也可以使用通用的兄弟选择符(~):

  1. .nav li:first-child ~ li {
  2. border-left: 1px solid #666;
  3. }

给 body添加行高

不需要分别添加 line-height 到每个 <p><h*>等。只要添加到 body 即可:

  1. body {
  2. line-height: 1;
  3. }

这样文本元素就可以很容易地从 body 继承。

所有一切都垂直居中

要将所有元素垂直居中:

  1. html, body {
  2. height: 100%;
  3. margin: 0;
  4. }
  5. body {
  6. -webkit-align-items: center;
  7. -ms-flex-align: center;
  8. align-items: center;
  9. display: -webkit-flex;
  10. display: flex;
  11. }

:::tips 注:在IE11中要小心flexbox。 :::

逗号分隔的列表

让HTML列表项看上去像一个真正的,用逗号分隔的列表:

  1. ul > li:not(:last-child)::after {
  2. content: ',';
  3. }

对最后一个列表项使用 :not() 伪类。

使用负的 nth-child 选择项目

在CSS中使用负的 nth-child 选择项目1到项目n。

  1. li {
  2. display: none;
  3. }/* select items 1 through 3 and display them */
  4. li:nth-child(-n+3) {
  5. display: block;
  6. }

对图标使用SVG

  1. .logo {
  2. background: url('logo.svg');
  3. }

SVG对所有的分辨率类型都具有良好的扩展性,并支持所有浏览器都回归到IE9。这样可以避开.png、.jpg或.gif文件了。

优化显示文本

有时,字体并不能在所有设备上都达到最佳的显示,所以可以让设备浏览器来处理:

  1. html {
  2. -moz-osx-font-smoothing: grayscale;
  3. -webkit-font-smoothing: antialiased;
  4. text-rendering: optimizeLegibility;
  5. }

:::info 注:请负责任地使用 optimizeLegibility。此外,IE /Edge没有 text-rendering 支持。 :::

对纯CSS滑块使用 max-height

使用 max-height 和溢出隐藏来实现只有CSS的滑块:

  1. .slider ul {
  2. max-height: 0;
  3. overlow: hidden;
  4. }
  5. .slider:hover ul {
  6. max-height: 1000px;
  7. transition: .3s ease;
  8. }

继承 box-sizing

让 box-sizing 继承 html:

  1. html {
  2. box-sizing: border-box;
  3. }
  4. *, *:before, *:after {
  5. box-sizing: inherit;
  6. }

这样在插件或杠杆其他行为的其他组件中就能更容易地改变 box-sizing 了。

表格单元格等宽

表格工作起来很麻烦,所以务必尽量使用 table-layout: fixed 来保持单元格的等宽:

  1. .calendar {
  2. table-layout: fixed;
  3. }

用Flexbox摆脱外边距的各种hack

当需要用到列分隔符时,通过flexbox的 space-between 属性,就可以摆脱nth-first-,和 last-child 的hack了:

  1. .list {
  2. display: flex;
  3. justify-content: space-between;
  4. }
  5. .list .person {
  6. flex-basis: 23%;
  7. }

现在,列表分隔符就会在均匀间隔的位置出现。

使用属性选择器用于空链接

<a> 元素没有文本值,但 href 属性有链接的时候显示链接:

  1. a[href^='http']:empty::before {
  2. content: attr(href);
  3. }

相当方便。