CSS 使用技巧例子,理解样式之间的配合,缩短 tabs 组件线条宽度

1,135 阅读2分钟

引言

css 样式很多,相互之间配合起来其实能完成很不错的效果,也能减少很多JavaScript 代码。因为对样式理解少从而造成的 JavsScript 脚本 增多是得不偿失的。

案例场景

之前我们UI 设计过一个 tab 切换的效果,主体样式和 vue 组件库 iviewelementuitabs 组件差不多,其中有些许样式不一样。 类似效果图如下。

在这里插入图片描述

tab 平铺满, 但是下方的动态过渡蓝色线条要短一点。就这么简单的一个需求,还是有人说做不到, elementUI 有提供 stretch 属性 可以自动撑开,iview 没有但是可以自己通过设置整体宽度更改。但是下方的线条确是这样的。

在这里插入图片描述

就是把蓝色线条变短。如果你只想到通过样式更改 width 的值,那么你就只能做到固定宽度情况下效果达到,当变换宽度后(不同屏幕适应时)线条位置偏移。

放一张更改了宽度的效果图就知道了。在这里插入图片描述

是不是到这种程度会觉得这个样式实现不了,要么只能不用下面线条过渡这个样式了,或者自己写一份,不用这个tabs 组件/插件 了。

解决方案

如果上面就是你真实的想法,那么接着看看下面,就上面这种效果,至少有三种方案能做到,并且能自动适应不同宽度。

一. 通过 background-clip + padding + box-sizing 只需要在原有的基础上,加上这三个样式就能实现,设置左右 padding 值,然后 background-clip 设置 content-box 让背景色只能在 padding 以内的区域显示,并且 设置 box-sizing: border-box 让 设置了padding 的蓝色线条不改变宽度。

.el-tabs__active-bar.is-top {
	padding: 0 20px;
	box-sizing: border-box;
	background-clip: content-box;
}

同样用一张图说明。

在这里插入图片描述

二. 通过 background

重置 背景色,再加上渐变色

.el-tabs__active-bar.is-top {
	background: red linear-gradient(90deg, transparent 20px, blue 20px, blue calc(100% - 20px), transparent calc(100% - 20px));
}

上面 只需把红色背景换成 transparent 就行,这里是为了演示差异

在这里插入图片描述

背景也可以用 background-size + background-repeat + background-position 的方式,可以自行尝试。

三. 通过 伪元素 ::after::before

.el-tabs__active-bar.is-top {
	background-color: transparent;
}
.el-tabs__active-bar.is-top::before {
    content: '';
    display: block;
    background: red;
    height: 2px;
    width: 90px;
    margin: auto;
}

效果图如下

在这里插入图片描述

结语

这么多方式都能做到这个效果,以上只是用elementUItabs 组件做的例子,其他插件只需要用同样的方法去做,也能达到效果,很多时候,样式之间合理的配搭,能极大提高你代码的稳定与效率。

好了,上面分享就这么多,如果问题或疏漏,欢迎指正。