文本描边(-webkit-text-lines)css问题

2024-02-16

我正在使用 NextJs 和 TailwindCSS 开发一个个人项目。

完成项目后,我使用私人导航器来查看进度,但似乎笔画没有按应有的方式工作,我在除 Chrome 之外的所有浏览器中都遇到了这种情况。

这是我得到的:

这是所需的行为:

Code:

<div className="outline-title text-white pb-2 text-5xl font-bold text-center mb-12 mt-8">
      Values &amp; Process
</div>

Css:

.outline-title {
  color: rgba(0, 0, 0, 0);
  -webkit-text-stroke: 2px black;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-rendering: optimizeLegibility;
}

有人可以解释或帮助解决这个问题吗?

Browser compatibility: enter image description here


TL;DR: -webkit-text-stroke仍然是相当不可预测的

the text-shadow根据提议@萨西什·库马尔 https://stackoverflow.com/questions/69253420/text-stroke-webkit-text-stroke-css-problem/69937834#69908700可能是最可靠的解决方案。

@卢克·泰勒的方法 https://stackoverflow.com/questions/69253420/text-stroke-webkit-text-stroke-css-problem/69937834#73146972– 将文本复制到背景伪元素 – 也提供了一个很好的解决方法。

可变字体的剖析

正如@diopside:指出这种渲染行为是与可变字体有关。
这些内部轮廓的原因是基于一些可变字体的结构。

“传统”字体(因此在可变字体之前) - 仅包含轮廓形状,可能还包含反形状,例如小写字母的内部“孔”e glyph.

否则,您会遇到不希望的偶数/奇数问题,导致路径区域重叠而导致形状被排除。

应用这种构造方法,您将永远不会看到任何形状的重叠。您可以将它们想象为“合并”的复合路径。像前面提到的孔这样的计数器形状是基于简单的规则,比如逆时针路径方向——顺便说一句。您可能仍然会在 svg 剪切路径中遇到这个概念 - 在某些浏览器中无法完美呈现)。

然而,可变字体允许分段/重叠构建字形/字符以方便不同字体粗细和宽度之间的插值。

明显地webkit-text-stroke勾勒出字形/字符的精确贝塞尔曲线解剖结构,从而导致每个字形组件出现不需要的轮廓。

这本身并不是可变字体的问题,因为粗细和宽度插值已在字体设计中使用了至少 25 年。因此,这个奇怪的渲染问题取决于所使用的字体 - 许多经典/较旧的字体编译为较新的可变字体格式仍将依赖于旧的学校方法(避免任何重叠)。

其他问题-webkit-text-stroke

  • 渲染不一致:Firefox 渲染的笔划带有圆角
  • 锐角上奇怪的“扭结和尖端”
  1. Firefox - Roboto Flex(可变字体); 2. Chromium - Roboto Flex(可变字体); 3. Chromium - Roboto(静态字体);

示例片段:测试-webkit-text-stroke渲染

addOutlineTextData();

function addOutlineTextData() {
  let textOutline = document.querySelectorAll(".textOutlined");
  textOutline.forEach((text) => {
    text.dataset.content = text.textContent;
  });
}

let root = document.querySelector(':root');


sampleText.addEventListener("input", (e) => {
  let sampleText = e.currentTarget.textContent;
  let textOutline = document.querySelectorAll(".textOutlined");
  textOutline.forEach((text) => {
    text.textContent = sampleText;
    text.dataset.content = sampleText;
  });
});

strokeWidth.addEventListener("input", (e) => {
  let width = +e.currentTarget.value;
  strokeWidthVal.textContent = width + 'em'
  root.style.setProperty("--strokeWidth", width + "em");
});

fontWeight.addEventListener("input", (e) => {
  let weight = +e.currentTarget.value;
  fontWeightVal.textContent = weight;
  document.body.style.fontWeight = weight;
});

useStatic.addEventListener("input", (e) => {
  let useNonVF = useStatic.checked ? true : false;
  if (useNonVF) {
    document.body.style.fontFamily = 'Roboto';
  } else {
    document.body.style.fontFamily = 'Roboto Flex';
  }
});
@font-face {
  font-family: 'Roboto Flex';
  font-style: normal;
  font-weight: 100 1000;
  font-stretch: 0% 200%;
  src: url(https://fonts.gstatic.com/s/robotoflex/v9/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXpRJ6cXW4O8TNGoXjC79QRyaLshNDUf9-EmFw.woff2) format('woff2');
}

body {
  font-family: 'Roboto Flex';
  font-weight: 500;
  margin: 2em;
}

.p,
p {
  margin: 0;
  font-size: 10vw;
}

.label {
  font-weight: 500!important;
  font-size: 15px;
}

.resize {
  resize: both;
  border: 1px solid #ccc;
  overflow: auto;
  padding: 1em;
  width: 40%;
}

:root {
  --textOutline: #000;
  --strokeWidth: 0.1em;
}

.stroke {
  -webkit-text-stroke: var(--strokeWidth) var(--textOutline);
  color: #fff
}

.textOutlined {
  position: relative;
  color: #fff;
}

.textOutlined:before {
  content: attr(data-content);
  position: absolute;
  z-index: -1;
  color: #fff;
  top: 0;
  left: 0;
  -webkit-text-stroke: var(--strokeWidth) var(--textOutline);
  display: block;
  width: 100%;
}
<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@100;300;400;500;700;900" rel="stylesheet">
<p class="label">stroke width<input id="strokeWidth" type="range" value="0.3" min='0.01' max="0.5" step="0.001"><span id="strokeWidthVal">0.25em</span> | font-weight<input id="fontWeight" type="range" value="100" min='100' max="900" step="10"><span id="fontWeightVal">100</span>
  <label><input id="useStatic" type="checkbox">Use static Roboto</label><br><br>
</p>


<div id="sampleText" class="stroke p" contenteditable>AVATAR last <br>Airbender</div>
<p class="label">Outline via pseudo element in background</p>
<div class="resize">
  <p class="textOutlined">AVATAR last Airbender
  </p>
</div>

然而,这些渲染只要您的描边宽度不明显大于 ~0.1em,问题就很少见(或当前字体大小的 10%)。

也可以看看“文字轮廓效果” https://stackoverflow.com/questions/4919076/outline-effect-to-text/74418325#74418325

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

文本描边(-webkit-text-lines)css问题 的相关文章

  • CSS - 第一个没有特定类别的孩子

    是否可以编写一个 CSS 规则来选择没有特定类的元素的第一个子元素 example div span class common class ignore span span class common class ignore span sp
  • 位置:绝对在边框半径内且溢出:隐藏

    我遇到了问题border radius在webkit浏览器中找到了解决方案 网址如下 如何在 Chrome Opera 中使 CSS3 圆角隐藏溢出 https stackoverflow com questions 5736503 how
  • 如何使用 Materialise 创建具有居中对齐链接的导航栏?

    我正在尝试使用 Materialise 构建一个顶部有导航栏的 1 页垂直滚动网站 现在 Materialize 仅具有用于向左或向右对齐链接的类 徽标可以居中对齐 但不能居中对齐链接本身 我一直在向 UL 和包装 div 添加中心对齐和中
  • 获取一行中的最后一个 li jQuery

    我们有一个简单的ul ul li some text li li some some text li li text more li li text here li ul ul text align center width 100px l
  • CSS“内容”不起作用

    我想通过 CSS 添加该段落的文本 而不是在 HTML 中 因为它会随着网站的响应能力而变化 现在我无法让它工作 我想知道CSS是否有问题 另外 这是唯一可以做到的方法 使用纯 HTML 和 CSS 还是有另一种方法来定位文本并根据每个分辨
  • CSS:应用于类组合的样式?

    我不确定这是否可行 但是当您想根据应用于元素的类的组合来设置元素的样式时 是否可以在 CSS 中使用语法 我知道我可以使用 jQuery 或其他东西检查元素并根据它所具有的类更改它的样式 但是有没有一种纯 CSS 方法可以做到这一点 例如
  • App_offline.htm、CSS、图像和 aspnet_isapi.dll

    因此 我正在开发的网站正在使用 urlrewriting 与 aspnet isapi dll 配合 所有内容都映射到它 我放置了 app offline htm 文件 所有文本均显示 但是 CSS 或图像未提供 我猜测由于通配符映射而不是
  • 保留以下文本的标题

    我正在使用 css 列计数功能将我的部分分成两列 在一个页面上 我在第一列的底部有一个 h3 标题 在下一列的顶部有一个 p 段落 我想保留该段落的前几句话的标题 我可以将其与整个段落一起包装在使用 inline block 样式的 div
  • 使用 CSS 屏蔽图像

    我做了这样的设计 如何用CSS遮盖背景 我试过这样的代码 img poster display block max width 100 webkit mask image url https cdn pbrd co images GYiCo
  • 滚动视图上的固定按钮

    我目前正在尝试在屏幕右下角的滚动视图上显示一个按钮 但它不起作用 当我滚动视图时按钮会移动 我尝试先插入按钮 但滚动视图位于其上方 class HomePage extends Component loadUserItems this pr
  • 是否可以使materialize.css模态更大并删除垂直滚动条?

    我刚刚创建了按钮 单击后会弹出一个模式 每个按钮都有一个显示不同练习 gif 的模式 然而 模态框太小 导致用户无法看到整个 gif 迫使他们向下滚动 我想删除滚动条并使模态更大 以便用户可以看到整个 gif 任何帮助都会很棒 这是我的代码
  • CSS - 100% 高度,带页眉和页脚

    我正在尝试设计一个带有页眉 延伸至 100 垂直景观 减去页眉和页脚 的主 div 和页脚的页面 就像这张照片 我可以让标题和主 div 正常工作 像这样 div div class header div HEADER div div cl
  • CSS @font-face 有时在 Internet Explorer 中有效,但并非总是有效

    我在使用 Internet Explorer 11 中的网络字体时遇到问题 该字体适用于某些使用 IE11 的用户 但不适用于其他用户 即使它们是同一浏览器 对于遇到问题的用户 Modernizr fontface 仍然返回 true 因此
  • 如何在asp.net背后的代码中获取css样式

    我需要从 asp net c 中的代码后面获取 css 样式 在网上没有找到解决方案 是否可以直接从 styles css 文件获取它 还是需要解决方法 我在我的网络应用程序中使用主题 但我还需要进行一些服务器处理 并且我需要 ccs 文件
  • CSS 网格/布局框架,专注于固定元素和单页全屏布局

    经验法则 如果您在布局中过多地使用 CSS 请切换到框架 我已经研究了数十个网格 布局框架 其中大多数都专注于传统的文档网格布局 我的页面更像是一个 SPA 单页应用程序 它类似于桌面应用程序使用的布局 显然 HTML 不能很好地处理这个问
  • 未捕获的异常:数据表编辑器 - 不允许远程托管代码

    我正在尝试使用 Datatables 使用 datatableseditor 来实现 CRUD 操作 但是我收到错误消息 1 未捕获的异常 数据表编辑器 不允许远程托管代码 请参见http editor datatables net有关如何
  • CSS 选择器嵌套

    是否可以在选择器中嵌套选择器 我有很多类似这样的样式 header h1 header img header form 我想压缩它们 使它们看起来像这样 header h1 img form 以提高可读性 这在普通的旧 CSS 中可能吗 不
  • 在“onClick”上切换 DIV 高度

    我想切换分区的高度 我尝试过将 animate 与 if else 语句一起使用 但它只会反弹 我现在使用的代码将隐藏我的分区而不是切换高度 点击时会触发 document ready function content1 toggle fu
  • 如果 jquery 验证激活,如何在单选按钮中放置红色边框[重复]

    这个问题在这里已经有答案了 我的问题是 如果 jquery 验证像示例图片中那样激活 我无法使单选按钮具有红色边框 任何人都可以帮我解决这个问题吗 http i38 photobucket com albums e149 eloginko
  • 标题的下边框小于宽度

    我需要创建一个下划线效果底部边框小于h2标题的宽度 通常我不上传图片 但我认为这可能有助于进一步解释问题 您可以为此使用伪元素 例子 http jsfiddle net SZ39x pseudo border position relati

随机推荐

  • 如何将段落与 Itext 对齐(对齐)?

    我有 2 条线 我想对齐 对齐 它们 我有这个代码 Paragraph p new Paragraph ANC fontFootData p setLeading 1 1 p setAlignment Element ALIGN JUSTI
  • EF 6 IsRequired() 允许空字符串

    在过去使用 EF5 和 EF4 版本的项目中 如果属性为 null 或空字符串 IsRequired 流畅 API 方法将引发 DbEntityValidationException 在我当前使用 EF6 的项目中 当字符串属性为空时 不会
  • 地图 V2 标记按下状态

    在 Maps V2 中 如何将标记设置为按下状态 setIcon 方法采用 BitmapDescriptor 我看不到一种传递 XML 选择器的方法 该选择器将给出按下和选择的状态 实现此目的的唯一方法是重写 OnMarkerClickLi
  • 如何在socket.io 1.0中存储客户端相关数据

    文档说 socket io 现在不支持 get set 可以存储客户端相关数据吗 io sockets on connection function client client on data function somedata clien
  • 限制对 Application Load Balancer 的访问的最佳方法是什么?

    理想情况下 我想锁定我的 ALB 以便只能通过 API 网关访问它 我研究了是否可以将 API 网关与入站规则关联 但是 我发现 API 网关无法与 IP 地址或安全组关联 我还研究了面向内部的 ALB 但我无法让这些工作 因为 VPC 链
  • HBase 扫描时出现 java.lang.NoClassDefFoundError

    我正在尝试运行 MapReduce 作业来扫描 HBase 表 目前我使用的是Cloudera 4 4附带的HBase 0 94 6版本 在我的程序中的某个时刻 我使用 Scan 并使用以下命令正确导入它 import org apache
  • EHCache如何实现其事务?

    这个问题可能听起来很模糊 但我试图理解 EHCache 事务能力的一般概念 假设我将 EHCache 配置为内存缓存 并且还将其配置为缓存MyObject EHCache是 否克隆实例MyObject我正在检索这是否是作为交易的一部分完成的
  • “飞行模式”打开时SIM状态的值是多少

    我想知道返回的SIM状态值是多少TelephonyManager getSimState http developer android com reference android telephony TelephonyManager htm
  • Jersey/JAXB:对 HTTP POST 和 GET 使用相同的 POJO,但在 JSON 响应中仅返回 GET 属性的子集。

    这似乎是另一件相当简单的事情 但我再次为如何做到这一点而苦苦挣扎 我有一个带有 Jersey JAXB 注释的 POJO 该注释具有与其关联的 HTTP POST 和 GET 方法 在 POJO 上执行 POST 时 请求正文以 JSON
  • 如何使用 NetBeans GUI Builder 包含自定义面板?

    我编写了一个扩展 JPanel 的类 是否可以在 NetBeans GUI Builder 中使用它并让它在所有自动代码生成过程中幸存下来 我已经使用 GUI 构建器中的自定义代码选项将对象实例化为新类 但似乎无法从 JPanel 更改声明
  • 单击按钮时 UITextField 不会结束编辑(委托 textFieldDidEndEditing )

    我有两个textFields在屏幕上和一个Submit button 用户在第一个文本字段中输入详细信息 然后在第二个文本字段中输入详细信息 我的要求是结束编辑Submit button单击并打印这些中的用户输入textFields 我在打
  • OkHttp3 返回超时异常

    我使用 okhttp3 作为网络库 使用 Node mongo 作为后端服务 有时 当我的应用程序启动时 它会显示超时异常 当我关闭应用程序并再次启动它时 它会从服务器获取数据 没有错误应用程序 但我想知道为什么显示超时异常 下面是我在列表
  • ggplot2 中的旋转和间距轴标签

    我有一个图 其中 x 轴是一个标签很长的因子 虽然可能不是理想的可视化 但现在我想简单地将这些标签旋转为垂直 我已经用下面的代码解决了这部分问题 但正如您所看到的 标签并不完全可见 data diamonds diamonds cut lt
  • 如何从控制台访问 Ember 数据存储?

    在 Ember 2 中 有谁知道如何获取对 Ember Store 的引用 以便对 javascript 控制台中的模型映射进行故障排除 本来可以通过App container lookup在 Ember 1 中 但这已经不存在了 而且很难
  • PhantomJS 和 iFrame

    我正在使用 phantomjs 1 5 和casperjs http casperjs org 用于我的功能测试 casper require casper create loadImages false casper start http
  • 在 Objective-C 中定义协议类别?

    在 Objective C 中 我可以使用类别向现有类添加方法 例如 interface NSString MyCategory BOOL startsWith NSString prefix end 是否也可以使用协议来做到这一点 即如果
  • ctorParameters.map 不是 angular2-mdl 中的函数

    我正在尝试将 Angular2 mdl 与 Angular CLI 一起使用 我导入了MdlModule在 app module ts 中 当我尝试使用时
  • 在 Go (Golang) 中枚举注册表值

    我正在尝试使用 Go 枚举 Windows 注册表中的值列表 但遇到了一些麻烦 我尝试了两种方法 使用 Go 提供的syscall要调用的库RegEnumValue 也使用 lxn 的 Windows API 包装器 https githu
  • NSDateFormatter 谜题!这是新的山狮虫吗?

    我相信我可能发现了一个错误NSDateFormatter 我不确定这是否本地化为在系统偏好设置中指定了巴西时区 完整的项目在这里 http www idanfe com dl nsDateFormatterPuzzle zip http w
  • 文本描边(-webkit-text-lines)css问题

    我正在使用 NextJs 和 TailwindCSS 开发一个个人项目 完成项目后 我使用私人导航器来查看进度 但似乎笔画没有按应有的方式工作 我在除 Chrome 之外的所有浏览器中都遇到了这种情况 这是我得到的 这是所需的行为 Code