CSS揭秘之多重边框&连续的图像边框


1.多重边框

我们可以通过使用border-image来写一个多重边框,或使用多个元素来模拟多重边框,不过我们有更好的办法来制作一个多重边框,那就是使用box-shadow的第四个参数(称为扩张半径)来完成一个多重边框的制作,肯定大家都已经非常熟悉box-shadow了,不过我还是来复习一下。
(1) box-shadow:none | <shadow>#
where
<shadow>= [inset? && [ <offset-x><offset-y><blur-radius>? <spread-radius>? <color>? ] ]#

值(values) 说明
inset 默认阴影在边框外,使用inset后,阴影在边框内;
offset-x 水平偏移量,负值将阴影放在元素左侧;
offset-y 垂直偏移量,负值将阴影放在元素上方;
blur-radius 默认0,不能为负值;值越大,模糊面积越大,阴影越大越淡;
spread-radius 默认0,正值阴影扩大,负值阴影收缩;
color 颜色,不设置则由浏览器决定;

这里我们就用spread-radius来制作一个多重边框,box-shadow支持逗号分隔语法,来创建多个数量的投影;
我们需要注意的是,box-shadow是层层重叠的,第一层投影位与最顶层,比如你想在下面示例(图1-1.png)外圈再加一道20px的黑色边框,你需要设置spread-radius的值为60px(40px+20px);

示例:

background: red;
box-shadow: 0 0 0 20px green,
            0 0 0 40px blue;

效果:(图1-1.png)

图1-1.png

注意:
box-shadow是不会影响布局的,也不会受到box-sizing的影响,这样制作出来的“假边框”也是不会响应鼠标事件的,比如点击;

(2)outline:[ <'outline-color'> || <'outline-style'> || <'outline-width'> ]
在某些情况下,你只需要两层边框,这是你可以通过常规边框,再加上outline来生成外层的边框。它比box-shadow(只能模拟实线边框)要灵活一些,还有一些别的边框样式,比如虚线边框;
还有一点就是它可以通过outline-offset来控制它跟元素边缘的间距,这个属性接收负值;(图1-2.png)

示例:

 background: gray;
 outline: 5px dashed #fff;
 outline-offset: -10px;

效果:(图1-2.png)


图1-2.png

(3)边框内圆角

outline示例:

background: red;
outline: 10px solid green;
border-radius: 20px;

效果:(图1-3.png(outline)

图1-3.png`(outline)`

我们来看上面的这个例子(图1-3.png(outline)),我们发现outline是不贴合元素圆角的,并不是我们想要的效果;那我们有什么方法来解决这个问题,实现边框内圆角这个效果呢?
我们先来看一下下面这个例子:

box-shadow示例:

background: red;
border-radius: 20px;
box-shadow: 0 0 0 20px blue;

效果:(图1-4.png(box-shadow)

图1-4.png`(box-shadow)`.png

我们发现outline不贴合元素圆角,但box-shadow是贴合元素圆角的,那么想法就来了,把outlinebox-shadow的边框颜色设置成一样不就实现这个效果了,哈哈,是不是有点黑科技的感觉;

示例:

outline: 10px solid green;
border-radius: 20px;
box-shadow: 0 0 0 10px blue;

效果:(图1-5.png && 图1-6.png)
图1-5.png: outline:greenbox-shadow:blue
图1-6.png: outline:greenbox-shadow:green

图1-5.png

图1-6.png

注意,我们给box-shadow设置的扩张半径并不一定等于描边的宽度,我们只需要刚好填充上图(图1-3.png)的白色区域就可以了,那么我们设置多大的扩张半径可以填补这个区域呢?
哈哈,来初中的勾股定理要来了,看下图(图1-7.png)


图1-7.png(图片来自css揭秘)

看图上就已经很清楚了,就不说了,所以要填补上图(图1-3.png)的白色区域,就只需要(√2-1)*r 约等于8.28427px就可以了;

2.连续的图像边框

问题:

  • 有时我们需要将一张图片应用为一个元素的边框,而不是背景;不仅如此,我还希望这张图片可以自动延伸并覆盖完整的边框区域,如下图(图2-1.png)效果;


    图2-1.png
  • 你肯定会想到用border-image,它的原理是“九宫格伸缩法”:把图片分割成九份,然后把它们应用到元素边框相应的边和角;
    关于它的工作原理,可以看我的上一篇文章CSS揭秘整理之半透明边框
  • 问题在于,我们并不想让图片的某个特定区域固定在拐角处,而是希望拐角处的图片区域能够随着元素的宽高和边框的厚度变化而变化,你只要稍微尝试一下,就会发现用border-image并不可能做得到;
    那我们应该怎么办呢?

解决方案:

  • 最简单的解决方法就是使用两个元素,一个用来存放背景,一个用来存放内容,它需要一个额外的html元素,这显然是一个不太理想的方法;
  • 我们可以利用css渐变和背景扩展来完成完全一样的效果,我们的主要思路: 在背景图片之上,再叠加一层白色的背景,为了让下层的背景透过透明边框显示出来,我们给它设置不同的background-clip
    示例:
padding: 30px;
border:20px solid transparent;
background: linear-gradient(white,white), url('http://p0.so.qhimgs1.com/bdr/326__/t0146c3062c8d78dce0.jpg');
background-size: cover;
background-clip: padding-box,border-box;
background-origin: border-box;

效果:(图2-2.png)

图2-2.png

蚂蚁行军边框
利用css渐变和背景的扩展 ,先给背景设置一层条纹背景,再在上面设置一层白色实色背景,然后需要给条纹背景设置一个合适的background-size值,最后将background-position以动画的方式改变为100%,这样就完成滚动了;(这里设置background-size还真的是有点麻烦啊,条纹换个角度就又要改一下才能无缝拼接,不知道有什么好的方法,望大神分享一下哦,嘻嘻)

where
<repeating-linear-gradient()> = repeating-linear-gradient( [ <angle> | to <side-or-corner> ]? , <color-stop-list> )

示例:

padding: 50px;
border:20px solid transparent;
background:linear-gradient(white,white) padding-box,repeating-linear-gradient(45deg,#fb3 25%,#58a 0,#58a 50%,#fb3 0 ,#fb3 75%,#58a 0) 0 / 40px 40px;
/*background:linear-gradient(white,white) padding-box,repeating-linear-gradient(45deg,#fb3 25%,#58a 0,#58a 50%,#fb3 0 ,#fb3 75%,#58a 0);
background-position: 0;
background-size: 40px 40px;*/
animation: ants 12s linear infinite;

效果:(图2-3.gif)

图2-3.gif


本内容根据《css揭秘》, MDN 和自己的理解进行整理;
感谢您的阅读。

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

推荐阅读更多精彩内容

  • 1、垂直对齐 如果你用CSS,则你会有困惑:我该怎么垂直对齐容器中的元素?现在,利用CSS3的Transform,...
    kiddings阅读 3,147评论 0 11
  • 选择qi:是表达式 标签选择器 类选择器 属性选择器 继承属性: color,font,text-align,li...
    wzhiq896阅读 1,727评论 0 2
  • 选择qi:是表达式 标签选择器 类选择器 属性选择器 继承属性: color,font,text-align,li...
    love2013阅读 2,301评论 0 11
  • shkdsnks 一、背景与边 1、半途明边框 当页面中有div,css样式如下时: width: 100px;h...
    LittlehorseX阅读 511评论 0 0
  • 前段时间一直在追《那年花开月正圆》,过了这么久,想起这部剧来,依然能想起里边热烈的爱情,虽然结局很虐,但...
    青草地与港湾阅读 753评论 0 0