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是贴合元素圆角的,那么想法就来了,把outline和box-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:green,box-shadow:blue
图1-6.png:outline:green,box-shadow:green
图1-5.png
图1-6.png
注意,我们给box-shadow设置的扩张半径并不一定等于描边的宽度,我们只需要刚好填充上图(图1-3.png)的白色区域就可以了,那么我们设置多大的扩张半径可以填补这个区域呢?
哈哈,来初中的勾股定理要来了,看下图(图1-7.png)
看图上就已经很清楚了,就不说了,所以要填补上图(图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 和自己的理解进行整理;
感谢您的阅读。
CSS揭秘之多重边框&连续的图像边框的更多相关文章
- [css 揭秘]:CSS揭秘 技巧(一):半透明边框
我的github地址:https://github.com/FannieGirl/ifannie/ 源码都在上面哦 喜欢的给我一个星吧 半透明边框 css 中的半透明颜色,比如用 rgba() 和 h ...
- css实现连续的图像边框
有时我们想把一个图片应用为边框,而不是背景,最简单的办法是使用两个HTML元素,一个元素用来把我们的石雕图片设置为背景,另一个元素用来存放内容,并设置纯白背景,然后覆盖在前者之上,这个方法需要一个额外 ...
- css3 border-image及连续的图像边框
border-image 它是下面几个值的简写: border-image-source // 使用绝对或相对地址url,引入图片 border-image-slice //切割图片,取值支持:& ...
- 02--css背景与边框--css揭秘
背景与边框 一 半透明边框 rgba/hsla颜色 1.难题 假设我们想给一个容器设置一层白色背景和一道半透明白色边框,body 的背景会从它的半透明边框透上来.我们最开始的尝试可能是这样的: #bo ...
- css 揭秘-读书笔记
css 揭秘 [希]Lea verou 著 css 魔法 译 该书涵盖7大主题,47个css技巧,是css进阶必备书籍,开阔思路,探寻更优雅的解决方案.这本书完全用css渲染出的html写成的(布局. ...
- css揭秘--笔记(未完)
第0章 关于本书 1, 本书要用到一个工具函数————$$(),它可以让我们更容易获取和遍历所有匹配特定css选择符的dom元素: function $$(selector,context){ con ...
- 《css揭秘》读书笔记
第一章 引言 css编码技巧 在引言中,作者提到使用em与inherit来实现css代码的简洁与可维护性.但是根据本司机两年的开发经验来看,在实际开发中很少来使用em这个单位.如何用以及何时去使用,还 ...
- [css 揭秘]:CSS揭秘 技巧(二):多重边框
我的github地址:https://github.com/FannieGirl/ifannie/ 源码都在这上面哦! 喜欢的给我一个星吧 多重边框 问题:我们通常希望在css代码层面以更灵活的方式来 ...
- CSS揭秘—多重边框(二)
前言: 所有实例均来自<CSS揭秘>,该书以平时遇到的疑难杂症为引,提供解决方法,只能说秒极了,再一次刷新了我对CSS的认知 该书只提供了关键CSS代码,虽然有在线示例代码链接,但访问速度 ...
随机推荐
- nfs 文件共享 服务
需要rpc服务: [root@xujiaxuan ftp]# service rpcbind start[root@xujiaxuan ftp]# chkconfig rpcbind on 设置开机自 ...
- Oracle 内存顾问
--查看内存相关参数SYS@ test10g> col name for a30SYS@ test10g> col value for a20SYS@ test10g> select ...
- JSP(3) - 9个JSP内置对象 - 小易Java笔记
1.9个JSP内置对象 内置对象引用名称 对应的类型 request HttpServletRequest response HttpServletResponse config Servle ...
- springboot基础知识学习
一.springboot中常用的注解: 原文链接:http://blog.csdn.net/lafengwnagzi/article/details/53034369 原文链接:http://www. ...
- golang相关问题
[转载][翻译]Go的50坑:新Golang开发者要注意的陷阱.技巧和常见错误[1] Golang作为一个略古怪而新的语言,有自己一套特色和哲学.从其他语言转来的开发者在刚接触到的时候往往 ...
- grep常见操作整理(更新)
提取邮箱和URL [root@test88 ~]# cat url_email.txt root@gmail.com,http://blog.peter.com,peter@qq.com [root@ ...
- MySQL数据库分表分区(一)(转)
面对当今大数据存储,设想当mysql中一个表的总记录超过1000W,会出现性能的大幅度下降吗? 答案是肯定的,一个表的总记录超过1000W,在操作系统层面检索也是效率非常低的 解决方案: 目前针对 ...
- JVM 核心机制(类加载器、自定义文件系统类加载器、网络自定义类加载器
- 3.4Code
#include<algorithm> #include<iostream> #include<cstdio> #define inf 0x3f3f3f3f #de ...
- 不断学习UI框架的写法
在web开发的过程中,我们会需要用到很多大大小小的插件,比如文本框,下拉树,下拉框等等各种各样的都需要.或许在开发的网页中会用到同一种插件来满足各种各样复杂的业务逻辑,比如简单的一个下拉树,有的地方需 ...