利用CSS3实现圆角的outline效果的教程


Posted in HTML / CSS onJune 05, 2015

一、首先,outline是个很牛的东西
1. border近亲
outline和border是近亲,为什么这么讲呢?首先,都是给元素外面套框框的;其次,支持的属性值几乎都是一样的,例如,outline-style和border-style值dotted, dashed, solid, ...之类的,一些语法也几乎一样。如果这都不算近亲,你让绝对定位和浮动何言以对。

2. IE8+支持
outline严格来讲属于CSS3属性,但是IE8+浏览器就支持了。外挂一句,IE9+浏览器的outline还支持invert,专门针对outline-color. 所以,如果你的项目不用管IE6/IE7浏览器,可以把outline挂在心中,有时候说不定会帮忙。

3. 不占据空间
默认的盒模型下,假设元素100*100像素,我们给元素设置border:10px solid,则实际该元素占据的尺寸至少就是120*120像素,元素的偏移、布局啊什么的,就需要多多思量。但是,outline不一样,你哪怕outline:100px solid,元素占据的尺寸还是100*100像素。这种行为表现,与transform以及box-shadow等CSS3属性很类似,虽然外形丰满了,但是,占据的真实空间没有影响。于是,我们在实现一些交互效果的时候,例如hover变化,我们就可以专注于效果本身,而不用被布局所左右,是很棒的体验。

4. 直角!圆角?
正好承上启下一下。
二、outline的直角与圆角

现有此效果一枚:
利用CSS3实现圆角的outline效果的教程

一排60*60像素的直角图片,选中的图片外框2像素带圆角高亮。浏览器兼容要求,IE9+以及其他现代浏览器。

一般而言,我们的第一反应是使用border + border-radius。但是,有个问题,就是,这里的外部高亮边框效果是外扩的,要知道,border是会增加元素的尺寸的,于是,为了我们的完美对齐效果,还需要对选中元素做重定位,上下左右的margin值都需要改变。我丢,想想就烦!

像这种UI表现,天生就是outline干的事情。于是,我们大手一挥:

CSS Code复制内容到剪贴板
  1. outline2px solid #26C2A7;   

利用CSS3实现圆角的outline效果的教程

高亮的边框在哪里?在这里在这里!
利用CSS3实现圆角的outline效果的教程

但是,不是圆角啊!

亲爱的朋友,千万不要妄图通过border-radius来改变outline的圆角,要知道,outline跟border是近亲,穿一个开裆裤长大的。但是,媳妇可不能共享哈!border-radius和border是登记在案的光明夫妻,看,连姓氏都随了夫君了,人家只认border, 你outline没戏,找自己的媳妇止渴去。

但是,outline貌似是个单身狗,没有媳妇啊,难道outline注定一辈子直角,掰不弯了?
三、outline的圆角效果

茫茫CSS海,乍一看去,貌似没有能让outline圆角的东西。注意措辞,“貌似”,我们如果有双犀利的眼睛,还是会发现某处藏可以让outline圆角的东西。

在FireFox浏览器中,就有和outline匹对的圆角夫妻outline-radius,

其关系,就和border和border-radius的关系一样。

由于目前还只是FireFox浏览器私有的属性,因此,目前的使用需要加-moz-前缀,也就是-moz-outline-radius.

闻名不如见面,若是火狐,您可以狠狠地点击这里:FireFox下outline radius圆角效果Demo

效果如下截图:
利用CSS3实现圆角的outline效果的教程

相关CSS代码如下:

CSS Code复制内容到剪贴板
  1. img {   
  2.     outline30px solid #cd0000;    
  3.     -moz-outline-radius: 30px;   
  4. }  

是不是很松松啊!如果你观察足够仔细,会发现,outline-radius和border-radius还是有区别的?看出来没,区别在哪里?答对有奖……哈,没错,你们都答错了!没有任何区别,outline-radius的圆角规则、语法之类跟border-radius就是一样的。

唯一的区别,也就是兼容性问题,不是看出来的,是试出来的。告诉大家一个不幸的消息,目前,除了FireFox浏览器支持outline-radius,其他浏览器都是空大屁!

如果是仅webkit/blink浏览器支持还好说,至少移动端还可以用用,搞了个仅仅FireFox支持,玩毛线啊!不对,连毛线都没得玩!

亲,不要绝望啊,车到山前必有路,此路进去……
四、box-shadow模拟outline的圆角效果

outline-radius虽然没戏了,但是,我们可以使用其他属性,可以实现类似的效果,比方说,图形构建大神之一的box-shadow.

我们平时使用box-shadow最多的是前面3个参数,水平/垂直偏移以及模糊大小,可能有一些小伙伴并不清楚其第4个可选参数值究竟有何用?box-shadow第4个参数值,名外扩展,可以把投影范围扩大,当然,扩大的区域是实色区域。我们就可以利用这一特性,模拟实现不影响元素占据尺寸的outline实色边框效果啦!

实例先行,您可以狠狠地点击这里:CSS3 box-shadow模拟outline radius圆角Demo

CSS代码如下:

CSS Code复制内容到剪贴板
  1. img {   
  2.     border-radius: 1px;   
  3.     box-shadow: 0 0 0 30px #cd0000;   
  4. }  

CSS3用的多的小伙伴应该知道,box-shadow的投影形状与border-radius一脉相承,也就是border-radius是圆角的,box-shadow的投影也是圆弧形的。于是,我们这里最终的效果就如下图所示:
利用CSS3实现圆角的outline效果的教程

下面简单解释下两行CSS代码的含义:

  •     border-radius: 1px表示圆角大小1像素。有同学可能奇怪了,怎么是1像素啊,截图圆角明明好几十像素,下面正好就解释了;
        box-shadow: 0 0 0 30px #cd0000出现了4个数值,分别是水平偏移0, 垂直偏移0,模糊0(纯色), 扩展大小30像素。我们可以想象成,光线直接从盒子的正上方照下来,因为没有偏移没有模糊,我们看不到任何阴影。实际上,盒子的阴影正好就是盒子的大小(外带1像素圆角),此时,扩展30像素,我们可以脑补一下,1像素圆角的阴影再扩展30像素。哟,不就是我们需要的效果嘛,不就是截图展示的效果嘛!

    知道border-radius 1像素的左右了吧,扩展30像素后,圆角就是30像素大小了。

然而,虽然肉眼看不出来,上面的方法实际有瑕疵,因为图片不是纯正的直角,有1像素的圆角。如果你想实现完美的内方外圆的效果,可以套一层标签,外面的标签使用border-radius和box-shadow就可以了。

HTML / CSS 相关文章推荐
css3实现图片遮罩效果鼠标hover以后出现文字
Nov 05 HTML / CSS
CSS3自定义滚动条样式的示例代码
Aug 21 HTML / CSS
CSS3 实现穿梭星空动画
Nov 13 HTML / CSS
HTML5如何实现元素拖拽
Mar 11 HTML / CSS
HTML5中微数据概述及在搜索引擎中的使用举例
Feb 07 HTML / CSS
html5开发之viewport使用
Oct 17 HTML / CSS
HTML5 文件域+FileReader 分段读取文件并上传到服务器
Oct 23 HTML / CSS
如何用canvas实现在线签名的示例代码
Jul 10 HTML / CSS
html5 canvas 实现光线沿不规则路径运动
Apr 20 HTML / CSS
HTML5逐步分析实现拖放功能的方法
Sep 30 HTML / CSS
浅谈由position属性引申的css进阶讨论
May 25 HTML / CSS
详解overflow:hidden的作用(溢出隐藏、清除浮动、解决外边距塌陷)
Jul 01 HTML / CSS
浅析与CSS3的loading动画加载相关的transition优化
May 18 #HTML / CSS
CSS+jQuery+PHP+MySQL实现的在线答题功能
Apr 25 #HTML / CSS
CSS+jQuery实现的在线答题功能
Apr 25 #HTML / CSS
纯CSS3制作漂亮带动画效果的主机价格表
Apr 25 #HTML / CSS
纯CSS实现右侧底部悬浮效果(悬浮QQ、微信、微博、邮箱等联系方式)
Apr 24 #HTML / CSS
网页切图的CSS和布局经验与要点
Apr 09 #HTML / CSS
用CSS3写的模仿iPhone中的返回按钮
Apr 04 #HTML / CSS
You might like
PHP+DBM的同学录程序(5)
2006/10/09 PHP
php Ubb代码编辑器函数代码
2012/07/05 PHP
PHP中空字符串介绍0、null、empty和false之间的关系
2012/09/25 PHP
PHP小教程之实现链表
2014/06/09 PHP
php提示Warning:mysql_fetch_array() expects的解决方法
2014/12/16 PHP
Symfony页面的基本创建实例详解
2015/01/26 PHP
php通过正则表达式记取数据来读取xml的方法
2015/03/09 PHP
php通过两层过滤获取留言内容的方法
2016/07/11 PHP
浅谈PHP接入(第三方登录)QQ登录 OAuth2.0 过程中遇到的坑
2017/10/13 PHP
添加到收藏夹代码(兼容几乎所有的浏览器)
2007/01/09 Javascript
jQuery EasyUI API 中文文档 - Parser 解析器
2011/09/29 Javascript
Javascript的getYear、getFullYear、getUTCFullYear异同分享
2011/11/30 Javascript
如何使用jQUery获取选中radio对应的值(一句代码)
2013/06/03 Javascript
js、jquery图片动画、动态切换示例代码
2014/06/03 Javascript
Nodejs实现的一个静态服务器实例
2014/12/06 NodeJs
javascript基于DOM实现省市级联下拉框的方法
2015/05/14 Javascript
简单谈谈node.js 版本控制 nvm和 n
2015/10/15 Javascript
JQuery移动页面开发之屏幕方向改变与滚屏的实现
2015/12/03 Javascript
jQuery siblings()用法实例详解
2016/04/26 Javascript
JS瀑布流实现方法实例分析
2016/12/19 Javascript
详谈jQuery中使用attr(), prop(), val()获取value的异同
2017/04/25 jQuery
two.js之实现动画效果示例
2017/11/06 Javascript
通过nodejs 服务器读取HTML文件渲染到页面的方法
2018/05/17 NodeJs
javascript中toFixed()四舍五入使用方法详解
2018/09/28 Javascript
浅谈Node框架接入ELK实践总结
2019/02/22 Javascript
微信小程序 swiper 组件遇到的问题及解决方法
2019/05/26 Javascript
Jquery动态列功能完整实例
2019/08/30 jQuery
JS回调函数简单易懂的入门实例分析
2019/09/29 Javascript
使用Pyinstaller的最新踩坑实战记录
2017/11/08 Python
Python爬虫实现爬取京东手机页面的图片(实例代码)
2017/11/30 Python
python 判断参数为Nonetype类型或空的实例
2018/10/30 Python
工厂厂长岗位职责
2013/11/08 职场文书
招聘与培训专员岗位职责
2014/01/30 职场文书
医院中层管理人员培训心得体会
2016/01/11 职场文书
《艾尔登法环》Boss腐烂树灵很有可能是《黑暗之魂3》的一个废案
2022/04/11 其他游戏
JavaScript原型链中函数和对象的理解
2022/06/16 Javascript