纯css实现动态边框的示例代码

所属分类: 网页制作 / CSS 阅读数: 538
收藏 0 赞 0 分享

背景

这几天工作中遇到一个交互需求,要求实现一个效果,当鼠标移入一个元素的时候,元素出现一个动态的边框,如图:

 

动态边框

思路

看到这个效果,我首先想到的是设置元素的border属性,可惜border不能设置长度,无法实现动效。另外一种实现思路是添加四个div来分别实现上下左右的边框效果,虽然可行,但是要添加四个额外元素,有点儿得不偿失的感觉。难道就没有更好的解决方案了...

就在我绞尽脑汁的时候,灵光乍现,为什么不尝试一下用CSS3多背景来模拟边框呢,背景是可以设置长度的,通过修改背景的长度,就可以实现要求的动效。说干就干,赶快从网上搜索一下CSS3背景的相关知识。

CSS3 Background

CSS3对于 background 做了一些修改,最明显的一个就是采用设置多背景,不但添加了4个新属性,并且还对目前的属性进行了调整增强。

1、 多个背景图片

在CSS3里面,你可以在一个标签元素里应用多个背景图片。代码类似与CSS2.0版本的写法,但引用图片之间需用“,”逗号隔开。第一个图片是定位在元素最上面的背景,后面的背景图片依次在它下面显示,如下:

background-image: url(image1.jpg), url(image2.jpg), url(image3.jpg);

2、新属性:Background Clip

background-clip 顾名思义,背景剪切,用来设置元素的背景(背景图片或颜色)是否延伸到边框下面。

  • background-clip: border-box; 背景延伸至边框外沿(但是在边框下层)
  • background-clip: padding-box; 背景延伸至内边距(padding)外沿。不会绘制到边框处
  • background-clip: content-box; 背景被裁剪至内容区(content box)外沿
  • background-clip: text; 背景被裁剪成文字的前景色(实验属性,需要加浏览器前缀)

3、新属性: Background Origin

此属性需要与 background-position 配合使用。你可以用 background-position 计算定位是从border,padding或content boxes内容区域算起。(类似 background-clip

  • 注意:当使用 background-attachment 为fixed时,该属性将被忽略不起作用。
  • background-origin:border-box; 从border边框位置算起
  • background-origin:padding-box; 从padding位置算起
  • background-origin:content-box; 从content-box内容区域位置算起;

4、新属性:Background Size

Background Size属性用来设置背景图片的大小。有几个属性值:

  • background-size: contain;缩小背景图片使其适应标签元素(主要是像素方面的比率)
  • background-size: cover;让背景图片放大延伸到整个标签元素大小(主要是像素方面的比率)
  • background-size: 100px 100px;标明背景图片缩放的尺寸大小
  • background-size: 50% 100%;百分比是根据内容标签元素大小,来缩放图片的尺寸大小

5、Background Repeat 调整

CSS2里当设置背景的时候,它经常被标签元素截取而显示不全,CSS3介绍了2个新属性来修复此问题。

  • background-repeat: space; 图片以相同的间距平铺且填充整个标签元素
  • background-repeat: round; 图片自动缩放直到适应且填充整个标签元素

6、Background Attachment 的调整

Background Attachment有了一个新属性值: local ,当标签元素滚动时它才有效(如设置 overflow: scroll; ),当 background-attachment 设置为 scroll 时,背景图片是不随内容滚条滚动的。现在,有了 background-attachment: local ,就可以做到让背景随元素内容滚动而滚动了。

7、新增 Background Blend Mode背景的混合模式是当背景重叠时计算像素最终色值的方法,每种混合模式采用前景和背景颜色值(分别为顶部颜色和底部颜色),执行其计算并返回颜色值。最终的可见层是对混合层中的每个重叠像素执行混合模式计算的结果。 background-blend-mode: normal | multiply | screen | overlay | darken | lighten | color-dodge | color-burn | hard-light | soft-light | difference | exclusion | hue | saturation | color | luminosity;

每种混合效果参见: https://developer.mozilla.org/en-US/docs/Web/CSS/background-blend-mode

CSS3 多背景模拟元素边框

我们这里主要使用了 background-imgbackground-sizebackground-position 三个属性。

background-image: [background-image], [background-image], [background-image]; 
background-position: [background-position], [background-position], [background-position]; 
background-repeat: [background-repeat], [background-repeat], [background-repeat]; 

简写形式如下:

background: [background-image] [background-position] [background-repeat], 
[background-image] [background-position] [background-repeat], 
[background-image] [background-position] [background-repeat]; 

现在我们用多背景来模拟一个元素的边框

/*CSS*/
.exammple {
    background: linear-gradient(0, #108b96 2px, #108b96 2px) no-repeat, 
                linear-gradient(-90deg, #108b96 2px, #108b96 2px) no-repeat, 
                linear-gradient(-180deg, #108b96 2px, #108b96 2px) no-repeat, 
                linear-gradient(-270deg, #108b96 2px, #108b96 2px) no-repeat;
    background-size: 100% 2px, 2px 100%, 100% 2px, 2px 100%;
    background-position: left top, right top, right bottom, left bottom;
}
<div class="exammple"></div>

我们用四个渐变的背景来模拟四个边框(为什么我们要用渐变而不是直接的Color呢?这是由于CSS的多背景只能是 background-imagebackground-color 不支持多个值,所有即便是纯色的边框,我们也只能使用渐变)。

 

初步效果

接下来我们让边框动起来

/*CSS*/
.exammple {
    transition: ease-in .3s;
    background: linear-gradient(0, #108b96 2px, #108b96 2px) no-repeat, 
                linear-gradient(-90deg, #108b96 2px, #108b96 2px) no-repeat, 
                linear-gradient(-180deg, #108b96 2px, #108b96 2px) no-repeat, 
                linear-gradient(-270deg, #108b96 2px, #108b96 2px) no-repeat;
    background-size: 0 2px, 2px 0, 0 2px, 2px 0;
    background-position: left top, right top, right bottom, left bottom;
}
.exammple:hover {
    background-size: 100% 2px,  2px 100%, 100% 2px, 2px 100%;
}

现在我们已经按要求实现了交互效果。

相比border属性,用background的模拟边框存在以下的优势和劣势

优势 劣势
可以控制宽高,渐变色,运动方向等,灵活多变,能实现很多border不能实现的效果,并且不用添加额外的元素 不能实现border圆角

需要注意的是 background模拟的边框不等同于真正的边框,是不占用边框的宽高的,计算盒子模型时要留心

最后

由于CSS3对背景属性的进一步丰富,利用CSS3的多背景可以实现很多以前必须借助js或图片才能实现的效果,比如半透明背景、几何图案背景、条纹背景等,期待和大家一块儿去探索CSS的奥秘。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

CSS伪类对象before和after的用法实例详解

这两个伪类对象只有在清楚浮动clearfix的时候会用到哈,最近在研究css3的时候觉得它两个的搭配不仅能够减少代码量并且能整出很巴适的效果
收藏 0 赞 0 分享

CSS3 实用技巧:实现黑白图像效果示例代码

本文为大家详细介绍下CSS3实现黑白图像效果的具体思路及代码,感兴趣的朋友可以看下截图,希望对大家有所帮助
收藏 0 赞 0 分享

IE.JS解决IE兼容性问题方法汇总

正如标题所言它修复了许多的HTML和CSS问题,并使得透明PNG在IE5、IE6下正确显示,下面为大家介绍下具体针对不同浏览器的调用方法,感兴趣的朋友可以参考下哈
收藏 0 赞 0 分享

实现CSS3中的border-radius(边框圆角)示例代码

本文为大家详细介绍下如何实现CSS3中的border-radius(圆角),具体代码如下,感兴趣的朋友可以参考下哈,希望对大家有所帮助
收藏 0 赞 0 分享

CSS line-height行高上下居中垂直居中样式属性

我们在css编写中需要对大篇幅的内容显示的更好看,有些间隔,不要在挤在一起难看,就可以使用Line-Height属性进行控制
收藏 0 赞 0 分享

CSS Float布局过程与老生常谈的三栏布局

这篇文章就是总结一下怎样使用CSS中的float属性进行布局,其实网上有很多讨论这个话题的文章了,但我觉得都没说到点子上。那就来老生常谈一次吧,CSS之Float布局
收藏 0 赞 0 分享

邮箱css加载失败怎么办 网站css加载异常原因分析

造成css加载失败的原因有很多,脚本之家也遇到过,这可能跟你代码出错,浏览器、路径、编码等等都是有关联的。所以在具体情况具体分析。下面看看具体的方案
收藏 0 赞 0 分享

CSS控制样式的三种方式(优先级对比验证)

大家都知道,CSS的中文名叫做层叠样式表,而CSS在控制样式的时候,有三种引入方式,这里简单介绍下CSS控制样式的三种方式
收藏 0 赞 0 分享

meta http-equiv="X-UA-Compatible" content="IE=7" 意思是将IE8用IE7进行渲染

X-UA-Compatible是针对ie8新加的一个设置,对于ie8之外的浏览器是不识别的,这个区别与content=
收藏 0 赞 0 分享

Discuz7.2 IE9兼容性写法 杜工完全修补方案

因为Discuz7.2在IE9浏览器中有一系列的问题,所有要在以后的开发中考虑到ie9浏览器的一些问题了,这里简单介绍下,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多