极致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生成的阴影会跟随元素的圆角效果, 但是如果阴影尺寸过大, 阴影外边缘的圆角半径可能和元素自身的圆角半径相差较大, 如果要实现内外同等半径的投影, 还是需要嵌套多级元素分别设置圆角.

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,817评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,329评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,354评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,498评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,600评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,829评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,979评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,722评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,189评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,519评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,654评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,940评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,762评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,993评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,382评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,543评论 2 349

推荐阅读更多精彩内容

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