极致CSS(9)-背景和边框

首先我们还是从边框开始, 边框的概念还是很好理解的, 就是盒子的边. 但是涉及到三个属性, 除了border-width之外, 还有border-color和border-style. 加上下左右四个方向的组合. border-width的默认值是medium, 也就是3px, 但是border-style 默认值是 none, 所以元素默认不会显示边框. 实际场景中我们多数是使用实线纯色边框, 并且多数时候都会使用简写同时设置三个属性, 类似border: 2px solid #F1F1F1, 先后顺序其实是没有限制的, 但是出于规范和习惯, 一般都是按width style color的顺序书写. border-color的默认值是currentcolor, 也就是取元素color属性的值, 和元素字体的颜色一样, 也可以设置为transparent透明边框.

border的理解和使用一般还是挺简单的, 设计师一般也不会制作过于复杂的边框, 照着设计定好的宽度和色值书写即可. 需要注意的是首先, border会影响到width属性的计算规则, 由于box-sizing的默认值是content-box, 也就是border的宽度会加在width和height的外面, 使得元素视觉尺寸变大. 此时为了方便可以直接设置box-sizing: border-box, 避免手工计算尺寸. 另外, border-width不支持百分比值.

其他几种border-style可以用于绘制图形. 比如border-style: dashed可以绘制虚线. border-style: dotted可以绘制一系列方点或圆点(根据浏览器不同). 不过更复杂的图形现在通常都是用图片或svg实现. 所以我们也不过度关注了.

边框圆角的需求在设计稿中也是经常见到, 通过border-radius属性实现, 也可以单独设置四个角的圆角半径, 如果设置的半径超过了元素尺寸的50%, 元素将表现为圆形. 另外有一个细节, 圆角是绘制在边框的外边缘上, 内部是没有圆角效果的.

CSS3也增加了border-image属性, 可以在边框上绘制图形, 由于边框的使用主要是出于装饰, 边框图形也主要是为了更多美化界面, 如果涉及到需要复杂装饰的场景, 可以考虑使用, 现在的兼容性应该也可以接受了, 不过我也还没有实际使用过, 以后有用到再补充吧.

边框还有一些应用是绘制三角形等简单图形, 主要是利用边框的折角和颜色, 视觉上拼出所需要的图形, 有时会遇到, 不过现在也有了transform或者linear-gradient等其他实现方式, 如果遇到这种场景, 可以比较一下, 选择最简单的方式.

然后我们看一下padding. 一般介绍盒模型时会把margin和padding对照, 称为内边距, 不过我感觉, padding和border的关系更近, 可以理解为内边框. padding出现在边框之内, content之外, 默认值是0, 只可以设置宽度也就是长度值, 没有style和color的设置, 而且宽度的百分比全都是相对于包含块的宽度计算. padding本身也不复杂, 同样是由于box-sizing的问题, 需要注意对宽度计算的影响. 为了简单, 我的一般原则是不用padding, 如果偶尔用到, 记得考虑box-sizing.

背景

之后我们看background, 如果说定位会在页面之上创建层, background就是在页面之下创建层. 最基础的是background-color设置背景色, 默认是transparent, 透明背景, 也可以设置background-image, 背景图片, 同时设置的话, 图片会显示在背景颜色之上. CSS3之后, 背景图片可以设置多个, 用逗号隔开, 但是背景色依然只有一个, 要实现多个背景色, 可以使用gradient, 但是gradient的类型是image, 所以也要通过background-image来设置.

由于在页面上显示图片是一种常见的需求, 使用img标签显示图片需要更改html, 所以background-image就成为在CSS中设置图片的主要方式.(伪元素也可以用来显示图片, 但是样式不好控制, 基本不会用到) background的大部分属性都是在设置图片的显示方式. 首先是图片的位置和大小, 由background-position和background-size确定, background-position的默认值是0, 也就是从左上角开始摆放, background-size默认是auto, 按图片原始尺寸显示. 当然由于是背景图片, 不可能超过所在元素的范围显示, 所以有一个属性background-clip可以设置背景显示的范围, 默认是border-box, 也就是背景不超过边框的外边界. 也可以设置为padding-box或content-box, 比较好理解. 但是还有一个background-origin属性, 规定了背景计算参照的起始位置, 取值也是这三个box, 默认是padding-box, 其实他们都是为了确定图片显示的计算方式, 实际效果一试便知, 而且用到的机会也不是很多, 除非有复杂的背景定位需求.

还有两个background属性, background-repeat和background-attachment, 是网页技术早期保留下来的, 现代基本很少会用到. 特别是background-repeat默认是repeat非常心烦, 基本每次都需要重置, 属性名又长, 所以我在全局设置了background-repeat: no-repeat; background-size: 100%; background-position: center;, 因为大部分时候, 背景图片都是和元素等尺寸居中显示的.

装饰

如果把padding理解为内边框, 那么outline就可以理解为外边框. outline的语法和border类似, 但是不能单独设置每条边的样式, 另外, outline不能表现出元素的圆角, 由于绘制在margin区域, 也不能用于扩大点击区域, 但是其不影响布局的特性, 使得他用来绘制蒙层比较合适, 尤其是需要镂空效果的蒙层, 可以通过设置一个宽度很大的outline实现. 但是现在outline还没法跟随元素的圆角, 所以在圆角元素上需要用box-shadow制作镂空蒙层. CSS3增加了一个outline-offset属性, 可以改变outline绘制的位置, 如果遇到复杂的多重边框, 可以尝试用一下.

然后我们就说到了box-shadow. 从本意上来说, 这个属性的作用是给元素添加阴影, 但是这个属性设计的非常强大, 甚至可以生成任意图形, 例如shadow-image. 由于语法太多, 实际应用少, 我们就不过多介绍了, 可以查阅MDN文档, 也有相应的可视化生成工具生成box-shadow代码. 我们上面说到的用box-shadow生成镂空蒙层, 用到的是其中一种比较完整的写法box-shadow: 0 0 0 100vh rgba(0,0,0,.7);, box-shadow生成的阴影会跟随元素的圆角效果, 但是如果阴影尺寸过大, 阴影外边缘的圆角半径可能和元素自身的圆角半径相差较大, 如果要实现内外同等半径的投影, 还是需要嵌套多级元素分别设置圆角.

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第2章:背景与边框 1.半透明边框 背景知识:RGBA/HSLA颜色-给一个容器设置白色背景和一道半透明白色边框,...
    普通不平庸阅读 847评论 0 1
  • 所有图都在body背景设置为green下的截图,请不要把最外层的绿色当成边框 半透明边框 如果我们想给一个容器设置...
    hcxowe阅读 4,012评论 0 6
  • 工具函数 如果我们想要检测某个具体的属性值是否支持,那就需要把它赋给对应的属性,然后再检查浏览器是不是还保存着这个...
    Eastboat阅读 447评论 0 0
  • 半透明边框 RGBA/HSLA颜色H:Hue(色调)。0(或360)表示红色,120表示绿色,240表示蓝色,也可...
    牛牛_lz阅读 410评论 0 1
  • 最近在阅读CSS Secrets这本书,发现作者讲解了很多容易被忽略的CSS小技巧,感受到作者在写代码的过程中,不...
    hershin阅读 493评论 0 0