HTML 标记中 SVG 上方的虚假白线
Posted
技术标签:
【中文标题】HTML 标记中 SVG 上方的虚假白线【英文标题】:Spurious white line above SVG in HTML markup 【发布时间】:2022-01-03 12:46:49 【问题描述】:在我目前正在开发的移动网络应用程序中,我想使用带有“波浪”底边的标题栏。我的方法如下所示。
:root
--lx-white: #fff;
--lx-fontPrimary: calc(12px + ((100vh - 500px)/500)*4);
--lx-fontSecondary: calc(10px + ((100vh - 500px)/500)*4);
--lx-Z0: 0;
--lx-Z1: 1000;
--lx-small-margin: 0.5rem;
--lx-std-margin: 1rem;
--lx-mid-margin: 1.5rem;
--lx-big-margin: 2rem;
--lx-small-pad: 0.5rem;
--lx-std-pad: 1rem;
--lx-big-pad: 2rem;
--lx-std-radius: 8px;
--lx-small-radius: 4px;
--lx-big-radius: 12px;
--lx-orange: #de6520;
--lx-light-orange: #e68a55;
--lx-white: white;
--lx-bg-white: #f2f4f3;
--lx-light-grey: #999999;
--lx-fontSize-minus1: 0.9rem;
--lx-fontSize-plus1: 1.1rem;
--lx-fontSize-plus2: 1.2rem;
--lx-fontSize-plus3: 1.3rem;
--lx-fontSize-plus5: 1.5rem;
--lx-fontFace-main: 'arial';
html,
body
margin: 0;
padding: 0;
font-family: var(--lx-fontFace-main);
.fullScreen
height: 100vh;
width: 100vw;
.scrollBox
position: relative;
.scrollContainer
position: absolute;
left: 0;
top: -100px;
right: 0;
bottom: 0;
padding: var(--lx-std-pad);
z-index: var(--lx-Z0);
.flexCentered
display: flex;
align-items: center;
justify-content: center;
.btnBox
background-color: var(--lx-bg-white);
padding-bottom: var(--lx-std-pad);
button
border-style: none;
border-radius: var(--lx-std-radius);
background-color: var(--lx-orange);
padding: var(--lx-std-pad);
color: var(--lx-white);
.mainButton
font-size: var(--lx-fontSize-plus1);
font-weight: bold;
.wideBtn
min-width: 60vw !important;
#tosScreen
display: grid;
position: relative;
grid-template-rows: 12vh 1fr 12vh;
#tosHeader
z-index: var(--lx-Z1);
#tosH1
margin: 0;
padding: 0;
padding-left: var(--lx-std-pad);
font-size: var(--lx-fontSize-plus3);
text-align: left;
background-color: var(--lx-light-orange);
color: var(--lx-white);
padding-top: 2rem;
padding-bottom: 1rem;
#tosFooter
background-color: rgba(255, 255, 255, 0.8);
z-index: var(--lx-Z1);
padding-top: var(--lx-big-pad);
<div class='fullScreen' id='tosScreen'>
<header id='tosHeader'>
<h1 id='tosH1'>Terms of Service</h1>
<svg viewBox="0 0 375 56" xmlns="http://www.w3.org/2000/svg" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2"><path style="fill:#e68a55" d="M-.171-.059h374.734v36.17H-.171z" transform="matrix(1.00071 0 0 1 .172 .059)"/><path d="M375 148.52v8.36c-33.3 9.15-90 18.28-165.06 6.51-83.31-13.08-164.87-3.78-209.94 3.87v-54.17c.5 6.13.78 9.61.78 9.61s65 38.28 174.47 18.69c84.12-15.06 166.21-.45 199.75 7.13Z" style="fill:#de6520;fill-rule:nonzero" transform="translate(0 -113.031)"/></svg>
</header>
<div class='scrollBox'>
<div class='scrollContainer' id='termsScroller'>
</div>
</div>
<footer id='tosFooter'>
<div class='btnBox flexCentered'>
<button id='btnContinue' class='wideBtn mainButton'>Continue</button>
</div>
</footer>
</div>
当我在 Chrome 和 Opera 中查看此内容并切换显示以模拟移动屏幕时,我看到一条微弱的白线将标题与其下方的 SVG 分开。这似乎不会在 Edge 上发生。我懒得在 Firefox 上测试这个 - 反正与我的项目无关。
这是什么原因造成的?
在上面的屏幕截图中,我试图突出显示蓝色虚线矩形中线条的位置
【问题讨论】:
您的 sn-p 在 WIndows Chrome 中看起来不错...您始终可以将 svg 向上移动 1px。 【参考方案1】:我不确定这是否是您所指的空间 - 如果是的话,它是由于 svg 是一个内联元素造成的。尝试将其更改为阻止 - 空间应该消失了
svg
display: block;
如果与形状渲染有关 - 尝试将 shape-rendering="crispEdges"
添加到 svg 中的第一个路径
<path
style="fill:#e68a55"
d="M-.171-.059h374.734v36.17H-.171z"
transform="matrix(1.00071 0 0 1 .172 .059)"
shape-rendering="crispEdges"
/>
编辑 - 我使用 SVGOMG 进行了一些优化以简化形状 - 也许这也可以工作
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 375 56">
<path fill="#E68A55" d="M0 0h375v36.2H0z"/>
<path fill="#DE6520" d="M375 35.5v8.3c-33.3 9.2-90 18.3-165 6.6-83.4-13.1-165-3.8-210 3.8V9.1l.8.6s65 38.2 174.4 18.7c84.2-15.1 166.3-.5 199.8 7Z"/>
</svg>
【讨论】:
我已经编辑了我的问题 - 屏幕截图显示了白线的确切位置。正如我在问题中提到的那样:除了 Chrome 和 Opera 上的移动屏幕模拟器之外,这不会出现。 Edge 现在有问题,即使打开移动屏幕模拟也没有。 啊,那我认为它与形状渲染有关 (developer.mozilla.org/en-US/docs/Web/SVG/Attribute/…) 尝试将 shape-rendering="crispEdges" 添加到 svg 中,看看是否可以解决:-) 考虑一下 - 可能只将它添加到 svg 的第一个路径(如果添加到所有路径,它将使波浪像素化) - 我已经更新了答案 完美答案! - 将shape-rendering="crispEdges"
添加到第一条路径;波浪上方的矩形钻头;修复。正如您所猜测的那样,shape-rendering="crispEdges"
会导致波底像素化到无法接受的程度
太棒了 :-) 我还在答案中添加了一个优化版本 - 如果它可以帮助的话以上是关于HTML 标记中 SVG 上方的虚假白线的主要内容,如果未能解决你的问题,请参考以下文章
Android WebView:svg 或 webm 在 HTML 中的对象标记中时调用 shouldOverrideUrlLoading