border-image-slice 的实际应用分享

背景

源于昨天跟佬友讨论的一个需求。

前端开发中,我们可能会遇到一些背景相关的需求,例如使用一张类似奖状的背景图,但是要求奖状中间部分适配文本内容高度而需要无限拉伸,类似下图:


素材图

初步设想

拿到这个需求,想到的就是安卓的点九图(不知道现在还用不用 :tieba_087:),想到的解决办法就2个:

  1. UI切图分为上、中、下 三个,中间部分自动拉伸
  2. 不切图,利用 clip-path 来达到相同的三部分效果

还有一个例外的想法,老切图仔知道的 滑动门 方案,但是谁还用传统方案啊 :tieba_087:

还有就是使用第三方库 smart-scale 来达成,但这么点个东西去加载一个三方库,emmm…

以上方案虽然可以达到效果,但是得将整体分为三块,敲代码有点麻烦,也不优雅,于是我又想起来了一个 “新” 的方案,使用 border-image 来模拟背景。

border-image-slice

传统边框中,我们都知道分为四部分:上下左右。但是,我们实际可以用 border-image-slice 将整个边框资源 border-image-source 切为9个部分。

  • 区域 1-4 为角区域(corner region)。每一个都被用于组成最终边框图像的四个角。
  • 区域 5-8 边区域(edge region)。在最终的边框图像中重复、缩放或修改它们以匹配元素的大小。
  • 区域 9 为中心区域(middle region)。它在默认情况下会被丢弃,但如果设置了关键字 fill,则会将其用作元素的背景图像。

这就意味着,我们可以自由的选择切片大小来达到目的。

为了简便,我们让左右直接从中间分割,这样就没有了中间区域,也就不需要使用 fill 关键字填充,剩余部分去除四个角,另外两区域就是我们需要拉伸的背景区域了。在 border-image-repeat 中 使用 stretch

border-image-source: url($pic);
border-image-slice: 400 50%;
border-image-repeat: stretch;

// 简写
border-image:url($pic) 400 50% stretch;

border-image-slice 里面值的数量所代表的含义与 margin padding 相同:

  • 一个值:上/下/左/右
  • 两个值:上/下 左/右
  • 三个值:上 左/右
  • 四个值:上 右 下 左

然后,没了,就这样,简单优雅地实现。

关于border-image-repeat 其它取值的效果,可以自行探讨,能做出很多有趣的效果,根据需求选择即可。

只要不是老古董,兼容性没啥问题,大胆用!

image

由于只是初步介绍一下这个特性及其部分使用,并未作过于详细的介绍,感兴趣的可以自己去MDN或是W3了解更多!

贴一下写的DEMO


参考资料:CSS Backgrounds and Borders Module Level 3

17 个赞

来给大鹅捧个场

3 个赞

感谢鹅佬分享

回得真快!

2 个赞

学会,掌声:clap:

3 个赞

等我重回深圳拿到PC,我一定学

1 个赞

太强了!大鹅!

1 个赞

此处要有掌声!!!

2 个赞

大帅哥今天不够猛

2 个赞

:lark_022::lark_022:

3 个赞

感谢 🪿佬。

2 个赞

感谢大佬 :lark_022:

2 个赞

才考完这首诗,后悔才看到🪿佬的帖子:sob:

2 个赞

来首诗! :grinning:

2 个赞

鹅佬小课堂 :+1:

1 个赞