Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >border-image诡异细线

border-image诡异细线

作者头像
ayqy贾杰
发布于 2023-03-15 10:53:32
发布于 2023-03-15 10:53:32
81700
代码可运行
举报
文章被收录于专栏:黯羽轻扬黯羽轻扬
运行总次数:0
代码可运行

写在前面

一个诡异的border-image问题,想了很久,如下:

微信实在粘不过来,想看的话下面有图,或者查看原文,或者浏览器打开原文:

http://www.ayqy.net/blog/border-image%E8%AF%A1%E5%BC%82%E7%BB%86%E7%BA%BF/

如果手头的设备是Android,应该能看到在泡泡边框和文本之间的4条细边,如果擅长找茬,还能发现泡泡尖角下方的那条很细的横线

对应源码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div style="background-color: silver; padding: 20px;">
<div style="border: 10px solid; border-image: url(http://www.ayqy.net/temp/popup-white.png) 20 fill repeat; width: 136px;">
<div style="padding: 15px;">可爱的popup</div>
</div>
</div>

一.问题重述

应用border-image后,border boxcontent box之间有一圈透明细线,某些情况下border box外也有一圈透明细线,如上面的效果

注意:ios好像没有这个问题,但好像所有Android都有,至少Android6.0有,其它设备待测试,如果手头设备有这个问题,麻烦留言告知,谢谢

border-image相关的部分如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
border: 10px solid;
border-image: url(http://www.ayqy.net/temp/popup-white.png) 20 fill repeat;

从2倍图上裁剪一圈20px的相框,缩到10px的border上。那么,这一圈细线是哪里来的?

P.S.为了防止bug飞走,贴图记下:

border-image 2倍图

border-image 1倍图

二.原因分析

又想起zxx那个铺地砖的例子:

这么比方吧,您从万科地产买了个99.5m*99.5m的毛坯房,地面要贴瓷砖,都是1m*1m的正方形瓷砖。如果是“平铺”,对不起,这1m边长的瓷砖不行,要处理!怎么处理法?很简单,每个瓷砖压成0.995m*0.995m的,这样就可以了,所以,平铺就是以完整的单元铺满整个区域。如果是重复,就直接把这1m*1m的瓷砖从一个角落一个一个的放置,放到头放不下了怎么办?直接把瓷砖从中间“咔”掉,于是最后会在房子的边角看到很多半截的瓷砖。

(引自CSS3 border-image详解、应用及jQuery插件 « 张鑫旭-鑫空间-鑫生活)

虽然不管怎么铺,理论上都不应该存在这4条细线,但计算总是受限于精度,比如scale引起的半像素偏移,这4条线应该与之类似,问题来自浏览器实现,或者说是计算精度损耗

如果是精度的问题,平铺(round)和重复(repeat)都存在裁剪计算,精度损耗可能会比较严重,而拉伸(stretch)没有裁剪计算,只有插值计算,理论上效果应该会好一些,下面尝试一下

三.解决方案

尝试用stretchround,具体见http://www.ayqy.net/temp/border-image-pop.html

在Android设备上发现用了stretch后没有4条细线了,暂时认为stretch是可行的解决方案

但在Chrome设备模拟会发现细线还在(Mac的Chrome也能看到细线),无论border-image-repeat的值是拉伸、平铺还是重复

在Mac Safari下,无论是正常页面还是“进入响应式设计模式”都看不到细线,而iphone5s、iphone7都看不到细线。此外,FF49存在这个问题,但没有Chrome明显,IE11完全没有这个问题。那么暂且认为这个问题是Google家特有的,因为Chrome桌面版/移动版与Android原生浏览器都有,而IOS全家好像都没有

此外,亲测发现,细线的问题与2倍图,1倍图无关,与图片尺寸无关,与fill与否无关,与屏幕ppi有关,但关系不大,具体见:

  • http://www.ayqy.net/temp/border-image.html:1倍图
  • http://www.ayqy.net/temp/border-image-pop.html:2倍图
  • http://www.ayqy.net/temp/border-image-pop-try.html:图片尺寸、旧版-webkit-outline

只有stretch时不会出现细线,其它方式都不行

P.S.甚至考虑过用子元素的outline盖掉细线,纯色不透明背景确实有效,半透明背景下很难准确设置outline的色值(尤其是设计稿是几个半透明图层叠加时),而且outline无法解决尖角下方那条细线(父元素outline: 2px solid transparent当然不行,透明了还怎么盖)

这个问题证明了另一件事情:repeatround都是从中心向两头铺的(所以才会有4条细线)

四.结论

border-image是一个强大的属性,但很遗憾,目前其真正强大的特性还没有办法使用,虽然已经好几年过去了

目前(2016-10-22)如果非要用,建议只用border-image-repeat: stretch不建议使用repeat/round,因为存在细线的问题,除非某一天Android 6.0也成为历史了

box-shadowborderborder-radiustransform可以实现大部分相框,但border-image绝对是最简单粗暴的方式,值得期待

参考资料

  • w3schools
  • MDN
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2016-10-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端问问 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
详解:26 border-image
记住哈,核心来了,兄弟们,四个角那里是不会有效果,算是border-image的盲点把 而黄色部分是有效果的哈,边框将border-image分成了九部分:border-top-image , border-right-image , border-bottom-image , border-left-image, border-top-left-image , border-top-right-image , border-bottom-left-image , border-bottom-right-image以及中间的内容区域,,
贵哥的编程之路
2020/10/28
5790
详解:26 border-image
30. CSS border-image(边框图片)
对于元素的边框,还可以通过 CSS3 中的 border-image 属性使用图像来作为元素的边框,以创建出丰富多彩边框效果。
用户6256742
2024/06/30
2070
30. CSS border-image(边框图片)
玩转 CSS Border-Image
读到书中介绍border-radius的内容时,提到了传说中的九宫格技术,其相关介绍只有可怜的不到一页。九宫格技术所使用的 CSS 属性就是我们今天的主角border-image。虽然这一技术确如书中所说,很少被使用了。但是歪马突然想起自己曾经为了实现某个效果折腾了很久,而这刚好适合用border-image来实现。
歪马
2020/04/07
1.2K0
玩转 CSS Border-Image
CSS3-border-radius的兼容写法大全
<!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="utf-8" /> <meta name="author" content"郭菊锋,702004176@qq.com"> <title>border-radius的兼容写法大全</title> <style> .image{   -webkit-border-image: url(images/news.png) 20/50px
xing.org1^
2018/05/17
1.2K0
CSS魔法堂:重拾Border之——图片作边框
前言  当CSS3推出border-radius属性时我们是那么欣喜若狂啊,一想到终于不用再添加额外元素来模拟圆角了,但发现border-radius还分水平半径和垂直半径,然后又发现border-top-left/right-radius的水平半径之和大于元素宽度时,实际值会按比例分配元素宽度时,不禁会问"我真的懂border吗?"。本系列将稍微深入探讨一下那个貌似没什么好玩的border! 《CSS魔法堂:重拾Border之——解构Border》 《CSS魔法堂:重拾Border之——图片作边框》
^_^肥仔John
2018/01/18
1.1K0
CSS魔法堂:重拾Border之——图片作边框
第93天:CSS3 中边框详解
其中边框圆角、边框阴影属性,应用十分广泛,兼容性也相对较好,具有符合渐进增强原则的特征,我们需要重点掌握。
半指温柔乐
2018/09/11
9050
第93天:CSS3 中边框详解
在retina屏中实现1px border效果
根据给定的文章内容,撰写摘要总结。
IMWeb前端团队
2017/12/29
1.1K0
在retina屏中实现1px border效果
从零开始学 Web 之 CSS3(四)边框图片,过渡
并且,添加边框图片是以背景的方式添加的,所以会有可能文字覆盖在边框的情况,后面也会介绍处理方法。
Daotin
2018/08/31
7940
从零开始学 Web 之 CSS3(四)边框图片,过渡
在retina屏中实现1px border效果
街景wap官网中有在视网膜屏幕中实现1px border的需求. 首先,来看下面视觉给的输出图中的border:
IMWeb前端团队
2019/12/03
6230
在retina屏中实现1px border效果
Css3 阴影详解
例:box-shadow:10px 10px 5px 5px red inset;
全栈程序员站长
2022/09/07
8650
Css3 阴影详解
在 retina 屏中实现1 px border 效果
作者:link 街景 wap 官网中有在视网膜屏幕中实现1px border 的需求。 首先,来看下面视觉给的输出图中的 border: 从上面的视觉图可以看到,border 是一根非常细的线。这
腾讯IVWEB团队
2017/03/13
1.2K0
零基础跟我学前端之css3基础
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dvIduY4W-1629980842687)(/assetis/image-20210325000539132.png)]
张哥编程
2024/12/19
790
前端网页制作秘密武器之盒模型边框
盒模型是CSS的一种基础设计模式,定义了Web页面中的元素是如何被看作盒子来解析的,而每一个盒子又有不同的展示方法接下来我们将详细的介绍一下边框的高级属性:圆角边框、图像边框。
算法与编程之美
2019/07/17
1.1K0
巧妙实现带圆角的渐变边框
border-image 是 CSS 规范 CSS Backgrounds and Borders Module Level 3 (最新一版的关于 background 和 border 的官方规范) 新增的一个属性值。
Sb_Coco
2020/02/21
7.1K1
巧妙实现带圆角的渐变边框
emmet(Zen coding)前端写代码神器
emmet前身zen coding。支持sublime Text。 基本上,大多数文本编辑器有允许你存储和再利用常用的代码块,称为“片段”。而片段是提高生产率的一个好方法,所有的实现都是常见的陷阱:你需要定义段第一,你不能在运行时扩展。 埃米特以片段的想法到一个新的水平:你可以像CSS表达式类型可以动态解析,并产生输出取决于你输入的缩写。埃米特是开发和优化Web开发者的工作依赖于HTML / XML和CSS,但可以用编程语言太。 官网:http://docs.emmet.io/ api:http://doc
deepcc
2018/05/16
2.1K0
CSS3-边框和背景
CSS3中边框和样式得到了增强。例如:可以创建圆角边框,使用图像边框,为元素创建阴影。
奋飛
2019/08/15
1.4K0
wxss学习系列《三》背景(Background)与颜色(Color),边框(Border)
一、背景(Background)与颜色(Color) 一、背景:background。 设置对象的背景特性。一个元素可以设置多重背景图像,每组之间用逗号隔开,如果存在重叠关系,前面的背景图像会覆盖在后
极乐君
2018/02/05
3.1K0
wxss学习系列《三》背景(Background)与颜色(Color),边框(Border)
前端进阶|在手机上画一条1px细线,为什么这么难?
在做移动端项目时,有一个逃不掉的问题:在手机上,1px的细线会看起来更宽。其实这不仅是手机上会出现的问题,准确来说,这是高清屏的“通病”,在高清的PC上也会同样有。
用户9899350
2022/07/29
9810
前端进阶|在手机上画一条1px细线,为什么这么难?
【一起来烧脑】一步学会CSS3体系
background-image属性添加背景图片 background-size指定背景图像的大小 background-origin属性指定了背景图像的位置区域
达达前端
2019/07/19
7310
【一起来烧脑】一步学会CSS3体系
CSS 奇思妙想边框动画
今天逛博客网站 -- shoptalkshow[1],看到这样一个界面,非常有意思:
微芒不朽
2022/09/13
9240
相关推荐
详解:26 border-image
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档