CSS 还能这么写?|《CSS揭秘》分享

# 前言

在前端日常开发,大多数的样式都能写出来,不管是切图还是多套几层div,最终都能实现,所以对样式这一块的代码的简洁与优雅往往不太在意。《CSS揭秘》这本书通过各种各样的例子,由浅入深的讲解了如何用CSS实现各种炫酷效果、布局技巧以及介绍了一些不太常用却很实用的属性。本文就简单介绍下一些小TIPS和案例,更多内容推荐看下原书,微信读书内便有

# 小知识

# CSS 3包含的内容以及名字由来

CSS3 并没有在任何规范中定义过,指的是一个非正式的集合,CSS 2后,CSS工作组意识到语言已经变得非常庞大,无法塞进单个规范中,将CSS打散到不通模块中,它包括CSS规范第三版(延续CSS2.1已有特性的模块)再加上一些版本号还是1的新规范,如:

  • CSS层叠与继承(http://w3.org/TR/css-cascade-3)
  • CSS颜色(http://w3.org/TR/css3-color)
  • CSS变形(http://w3.org/TR/css-transforms-1)

...

# 实现实验性的特性方案

CSS 迭代过程中,浏览器厂商为了实现一些实验性特性,出现过以下方案

  • 浏览器前缀 (opens new window):在名称前面加上自己特有的前缀。最常见的前缀分别是Firefox的-moz-、IE的-ms-、Opera的-o-以及Safari和Chrome的-webkit-。
  • 通过配置开关启用。有效防止开发者在生产环境中滥用。也是目前的趋势

# 实用技巧

currentColor

表示元素的 color 属性的值,比如想让所有的水平分割线(所有<hr>元素)自动与文本的颜色保持一致

currentColor本身就是很多CSS颜色属性的初始值,比如border-color和outline-color,以及text-shadow和box-shadow的颜色

div{
  border-color: currentColor;
}
1
2
3

继承:inherit

绑定到父元素的计算值(对伪元素来说,则会取生成该伪元素的宿主元素)

比如:创建提示框的时候,你可能希望它的小箭头能够自动继承背景和边框的样式

inherit

div{
  border-color: inherit;
}
1
2
3

控制tab键长度

比如展示代码时,想控制tab键的宽度,使用tab-size属性

div{
  tab-size: 2;
}
1
2
3

# 示例

试着实现下面的功能,未特殊说明的情况下,以下示例只能使用一个元素(伪元素不在限制内)、不可使用图片

# 背景与边框

# 1. 实现纯色背景 + 半透明边框

示例图

提示:

使用background-clip

# 2. 实现多重边框

多重边框

提示:
使用 box-shadow 或 outline。
注意:box-shadow 阴影本身不占空间,需要设置多余间距,或使用inset改为内阴影

# 3. 实现条纹背景(横向、纵向、斜向)

官方示例:

提示:

linear-gradient 可以调整颜色的开始位置,使颜色突变,实现条纹效果,位置设置为0时等同于上一个颜色的位置

repeating-linear-gradient: 在所有方向上重复渐变以覆盖其整个容器

background: linear-gradient(#363 10px, #636 0, #636 20px)
1

# 4. 实现图片边框

示例图

提示: background-origin: 设置背景图的原点位置的背景相对区域

# 形状

# 1. 画一个椭圆、半椭圆、1/4椭圆

ellipse

官方示例:

  • 1/2椭圆:https://dabblet.com/gist/e98d11da331bd9482bb0
  • 1/4椭圆:https://dabblet.com/gist/2b75df0e72c9804e8abe

其他优秀案例:糖果按钮 (opens new window)

提示:

border-radius 可以指定水平半径、垂直半径

# 2. 实现平行四边形背景,其内内容不变形

提示 伪元素、transform(skew)

# 3. 菱形图片,图片方向不可改变

./image/css-secrets-share/diamond.png

提示:

clip-path (opens new window)属性,使用裁剪方式创建元素的可显示区域。区域内的部分显示,区域外的隐藏

# 4. 梯形背景

# 5. 饼图

官方示例:

提示:

方案一:条纹背景 + 椭圆

为了方便的设置比例可以用负的动画延时值来控制百分比

一个负的延时值是合法的。与0s的延时类似,它意味着动画会立即开始播放,但会自动前进到延时值的绝对值处,就好像动画在过去已经播放了指定的时间一样。因此实际效果就是动画跳过指定时间而从中间开始播放了。

方案二:svg 圆+stroke-dasharray

# 字体排印

# 文本行设置斑马条纹背景

需要适配文字,设置 padding 时不能偏移

提示:

渐变距离设置为行高

# 相关链接

[1] 书中所有示例 (opens new window)

[2] 可视化构建svg (opens new window)