为了账号安全,请及时绑定邮箱和手机立即绑定

CSS的秘密——背景和边框(上)

写在前面

有空的时候看到《CSS Secrets》这本书,觉得挺有意思的,决定按章节来将其内容整理出来,说不定以后就能用得上。
通过这本书才了解到dabblet。dabblet是一款简单的前端在线编辑器,实时查看效果非常方便。这里每个例子都可以在dabblet上在线查看效果,点击对应的小标题即可。
这篇文章整理《Backgrounds & Borders》这一章。W3C background新增属性介绍

1.背景和边框

1.1 半透明的边框

需求:在有背景图片的body上,制作一个白色底版,半透明边框的div。

body {
  background: url('http://csssecrets.io/images/stone-art.jpg');
}

div {
  /* HSLA颜色表示法:H色调(0/360表示红色,120表示绿色,240表示蓝色);S饱和度(0%-100%);L亮度(0%-100%);透明度(0-1)*/
  border: 10px solid hsla(0,0%,100%,.5);
  background-color: white;
  /* 这句是关键,因为默认情况下,background会延伸至border的下方,如果border透明,就看不出效果。
  background-clip属性默认值为border-box,即background会延伸至border的下方,padding-box表示延伸至padding的边缘,content-box表示延伸至content的边缘。 */
  background-clip: padding-box;

  /* styling */
  max-width: 20em;
  padding: 2em;
  margin: 2em auto 0;
  /* 100%意思是默认继承body标签设置的字体大小;1.5表示行高 */
  font: 100%/1.5 sans-serif;
}

1.2 多层边界

为了达到多层边界的效果,可以通过以下两种方式解决:
(1)box-shadow
box-shadow平常用得较多,但第四个参数spread radius扩展阴影半径常常被忽略。它可以使边界扩展或缩小,是制作多层边界效果的关键。

div {
  width: 100px;
  height: 60px;
  margin: 25px;
  background: yellowgreen;
  /* 六个参数:X轴偏移量、Y轴偏移量、阴影模糊半径、阴影扩展半径、阴影颜色、投影方式(可选inset)*/
  box-shadow: 0 0 0 10px #655,
          0 0 0 15px deeppink,
          0 2px 5px 15px rgba(0,0,0,.6);
}

(2)outline
如果只需要两层边界,可以用outline实现。

div {
  width: 100px;
  height: 100px;
  margin: 25px;
  background: yellowgreen;
  border: 10px solid #655;
  outline: 15px solid deeppink;
}

用outline的好处,一是能够制作非实线边界,二是能够通过outline-offset属性控制其到元素边界的距离。
但是,当元素设置了border-radius圆角属性后,outline不会贴合圆角,这是一个bug,今后可能会被修复。

1.3 灵活的背景定位

在CSS2.1中,可以用background-position:bottom right;来将背景图片放置在右下角,但是没办法留出空隙,即设置图片到右下角的距离。
为了达到灵活的定位效果,可以通过以下三种方式解决:
(1)extended background-position
CSS3扩展了background-position,允许指定到任何一个角落的偏移量。

div {
  /* 在有些不支持extended background-position的浏览器中,定位在右下角的图片还是会出现在左上角,解决办法就是在background再设置一遍bottom right */
  background: url(http://csssecrets.io/images/code-pirate.svg)
              no-repeat bottom right #58a;
  background-position: right 30px bottom 10px;

  /* Styling */
  max-width: 10em;
  min-height: 5em;
  padding: 10px;
  color: white;
  font: 100%/1 sans-serif;
}

(2)background-origin
可以看出,如果用第一种方式,一旦需要修改偏移量,就需要修改三处地方。而用background-origin可以更方便,只需要修改padding一处即可。

div {
  background: url(http://csssecrets.io/images/code-pirate.svg)
              no-repeat bottom right #58a;
  /* background-origin默认值是padding-box*/
  background-origin: content-box;

  /* Styling */
  max-width: 10em;
  min-height: 5em;
  padding: 10px;
  color: white;
  font: 100%/1 sans-serif;
}

(3)calc()
calc()可以与background-position完美结合。

div {
  background: url(http://csssecrets.io/images/code-pirate.svg)
                no-repeat bottom right #58a;
  /* 距右边框20px,下边框10px。
  注意:减号两边要有空格,否则会有解析错误。根据向前兼容的规则,在未来,calc()内会允许使用关键字,关键字也可以包含连字符*/
  background-position: calc(100% - 20px) calc(100% - 10px);

  /* Styling */
  max-width: 10em;
  min-height: 5em;
  padding: 10px;
  color: white;
  font: 100%/1 sans-serif;
}

1.4 内圆角

有时候我们需要这样一种效果:一个容器,仅仅内角是圆的,外角还是方方正正的。我们可以用两个元素做出这样的效果。

<div class="something-meaningful"><div>
I have a nice subtle inner rounding,
don’t I look pretty?
</div></div>
.something-meaningful {
  background: #655;
  padding: .8em;
}
.something-meaningful > div {
  background: tan;
  border-radius: .8em;
  padding: 1em;
}

为了只用一个元素达到内圆角效果,可以通过以下方式解决:

div {
  /* 利用outline不会贴合圆角,而box-shadow会的特性,二者结合,达到内圆角效果。
  设置不同颜色时,容易发现outline在box-shadow的上层。
  另外,如果将box-shadow的宽度设置为outline的宽度,会引起某些浏览器的额外渲染,因此要设置得稍微小一点。
  根据勾股定理,若border-radius为r,则最小的box-shadow为根号2减1倍的r,为简化计算,可换为0.5r。
  */
  outline: .6em solid #655;
  box-shadow: 0 0 0 .4em #655; /* todo calculate max of this */

  max-width: 10em;
  border-radius: .8em;
  padding: 1em;
  margin: 1em;
  background: tan;
  font: 100%/1.5 sans-serif;
}
点击查看更多内容
27人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消