[实践总结]纯css实现动态边框

背景

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

动态边框

思路

看到这个效果,我首先想到的是设置元素的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;

每种混合效果参见:developer.mozilla.org/en-US/docs/…

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的奥秘。

关于我们

快狗打车前端团队专注前端技术分享,定期推送高质量文章,欢迎关注点赞。

转载于:https://juejin.im/post/5cdbc938f265da034d2a38c1

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用CSS3的动画属性和伪元素来实现边框跑马灯特效。 首先,需要给元素设置一个固定的宽度和高度,并设置边框样式。然后,使用伪元素::before和::after来创建两个半透明的遮罩层,覆盖在元素的边框上方。 接下来,使用CSS3的动画属性来使伪元素移动。将伪元素的宽度设置为0,然后使用@keyframes关键字定义动画,让伪元素从左侧或右侧移动到另一侧,并将宽度逐渐增加到与元素相同的宽度。 最后,使用animation属性将动画应用到伪元素上,并设置动画的持续时间、延迟时间和循环次数。 下面是一个示例代码: HTML代码: ```html <div class="marquee"> <p>这是一个边框跑马灯特效</p> </div> ``` CSS代码: ```css .marquee { width: 500px; height: 100px; padding: 20px; border: 2px solid #000; position: relative; } .marquee::before, .marquee::after { content: ""; position: absolute; top: 0; bottom: 0; width: 0; background-color: rgba(255, 255, 255, 0.5); } .marquee::before { left: 0; animation: marquee-left 5s ease-in-out infinite; } .marquee::after { right: 0; animation: marquee-right 5s ease-in-out infinite; } @keyframes marquee-left { 0% { width: 0; transform: translateX(0); } 50% { width: 100%; transform: translateX(0); } 100% { width: 0; transform: translateX(100%); } } @keyframes marquee-right { 0% { width: 0; transform: translateX(0); } 50% { width: 100%; transform: translateX(0); } 100% { width: 0; transform: translateX(-100%); } } ``` 在这个示例中,我们创建了一个宽度为500px、高度为100px的div元素,并设置了2px的黑色边框。然后,在div元素上使用了伪元素::before和::after,并设置它们的宽度为0,背景色为半透明白色。 接着,使用@keyframes关键字分别定义了两个动画marquee-left和marquee-right,让伪元素从左侧或右侧移动到另一侧,并将宽度逐渐增加到与元素相同的宽度。最后,将动画应用到伪元素上,并设置了动画的持续时间、延迟时间和循环次数。 这样,一个简单的边框跑马灯特效就完成了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值