SVG中的paint-order属性实现文字描边

news2025/1/11 12:50:16

过去只支持 SVG 元素

paint-order,表示绘制的顺序。

对于一个图形的绘制,顺序还是非常重要的。例如用SVG来绘制一个带边框的矩形

<style>
  rect{
    fill: #FFE8A3;
    stroke: #9747FF;
    stroke-width: 4;
  }
</style>

<svg viewBox="0 0 300 300" xmlns="http://www.w3.org/2000/svg">
  <rect x="50" y="50" width="200" height="200" />
</svg>

效果如下:
在这里插入图片描述

默认情况下,描边是在填充上面的。如果要改变绘制顺序,也相当于改变层级,让填充覆盖在描边上面,可以使用paint-order属性

rect{
  fill: #FFE8A3;
  stroke: #9747FF;
  stroke-width: 4;
  paint-order: stroke; /*先描边*/
}

表示先绘制stroke,效果如下:
在这里插入图片描述
看着变细了,这是因为描边是居中的,由于先绘制的描边,后绘制的填充颜色(后绘制的在上面),所以描边被填充盖住了一半。
这个属性在SVG文本中更明显,例如

<style>
  text{
    font-size: 60px;
    fill: #FFE8A3;
    stroke: #9747FF;
    stroke-width: 4;
    font-weight: bold;
  }
</style>
<svg viewBox="0 0 300 300" xmlns="http://www.w3.org/2000/svg">
  <text x="50%" y="50%" text-anchor="middle" dominant-baseline="middle">前端</text>
</svg>

在这里插入图片描述
文字本身都快被描边给覆盖了,下面调整一下

text{
  font-size: 60px;
  fill: #FFE8A3;
  stroke: #9747FF;
  stroke-width: 4;
  font-weight: bold; 
  paint-order: stroke; /*先描边*/
}

这样就好多了
在这里插入图片描述

现在支持普通文本了

在普通HTML中,可以用-webkit-text-stroke来实现文字的描边效果,例如

<h1 class="txt">前端侦探</h1>
<style>
  .txt{
  -webkit-text-stroke: 4px #9747FF;
}
</style>

在这里插入图片描述
以往通常使用绝对定位叠加的方式,手动让描边的那一层位于底部(可以用伪元素代替),就像这样

<p class="text" data-title="前端侦探">前端侦探</p>
<style>
  .text{
    margin: 0;
    font-weight: bold;
    -webkit-text-stroke: 6px rgb(51, 51, 51);
	}
	.text::before{
	    content: attr(data-title);
	    position: absolute;
	    background-image: linear-gradient(#FFCF02, #FF7352);
	    background-clip: text;
	    -webkit-background-clip: text;
	    -webkit-text-fill-color: transparent;
	    -webkit-text-stroke: 0;
	}
</style>

在这里插入图片描述
不过现在,也可以像SVG一样,直接通过paint-order来改变层级了

<h1 class="txt">前端侦探</h1>
<style>
  .txt{
  -webkit-text-stroke: 4px #9747FF;
  paint-order: stroke; /*先描边*/
}
</style>

在这里插入图片描述
相比SVG最大的好处就是,排版更加灵活,比如文本自动换行,SVG就无法直接实现,CSS就非常容易了
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2051474.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

XSS-DOM

文章目录 源码SVG标签Dom-Clobbringtostring 源码 <script>const data decodeURIComponent(location.hash.substr(1));;const root document.createElement(div);root.innerHTML data;// 这里模拟了XSS过滤的过程&#xff0c;方法是移除所有属性&#xff0c;sanitize…

[数据集][图像分类]波色绝缘子缺失分类数据集1440张2类别

数据集类型&#xff1a;图像分类用&#xff0c;不可用于目标检测无标注文件 数据集格式&#xff1a;仅仅包含jpg图片&#xff0c;每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数)&#xff1a;1440 分类类别数&#xff1a;2 类别名称:["missing","norma…

轻量高效的ControlNet开源 | ControlNetXt:支持主流生成架构,可与LoRA无缝集成!

当前的可控生成方法如ControlNet、Adapaters和ReferenceNet等通常需要大量额外的计算资源&#xff0c;尤其是对于视频生成&#xff0c;并且在训练中面临挑战或表现出较弱的控制力。 对此&#xff0c;港中文提出了一种轻量级可控模块&#xff1a;ControlNeXt&#xff0c;这是一…

PCIe Linux MRRS和MPS参数设置策略

1.概述 MPS&#xff08;Max Payload Size&#xff09;和MRRS&#xff08;Max Read Request Size&#xff09;共同影响PCIe总线的传输效率。如果MPS和MRRS设置的过小&#xff0c;传输相同长度的数据&#xff0c;需要更多的TLP报文&#xff0c;导致PCIe总线传输效率降低&#xf…

PHP多项目多场景排队叫号系统源码

&#x1f514;&#x1f4c8;多项目多场景排队叫号系统&#xff0c;让等待也高效有序&#xff01; 一、告别无序等待&#xff0c;智能排队新风尚 你是否曾在医院、银行或政务大厅等地方&#xff0c;面对冗长的队伍感到无奈&#xff1f;多项目多场景排队叫号系统&#xff0c;正…

Mybatis的分页,延迟加载和缓存

目录 分页&#xff1a; 方式一&#xff1a;利用 limit 实现物理分页 利用limit的关键字分页 方式二&#xff1a;RowBounds集合逻辑分页 方式三&#xff1a;插件分页 延迟加载和立即加载&#xff1a; 什么是立即加载&#xff1a; 什么是延迟加载 延迟加载的配置 缓存&a…

XSS漏洞洞讲解

目录 一、XSS漏洞的定义 1.什么是XSS漏洞&#xff1f; 二、XSS漏洞的类型 1.反射型 XSS 2.DOM型 XSS 3.存储型 XSS 三、实战案例演练 第1关 Ma Spaghet 第2关 Jefff 第3关 Ugandan Knuckles 第4关 Ricardo Milos 第5关 Ah Thats Hawt 第6关 Ligma ​第7关 Mafia …

c++ 使用Tesseract5.0 识别图片文字示例

Tesseract5.0相对于旧版本的程序&#xff0c;识别精准度会提升不少&#xff0c;如下&#xff1a; 1、示例1&#xff1a; 图片&#xff1a; 结果&#xff1a; 2、示例2&#xff1a; 图片&#xff1a; 结果&#xff1a; c代码如下&#xff1a; #include <iostream> #in…

C++ 设计模式——建造者模式

建造者模式 建造者模式组成部分建造者模式使用步骤1. 定义产品类2. 创建具体产品类3. 创建建造者接口4. 实现具体建造者5. 创建指挥者类6. 客户端代码 建造者模式 UML 图建造者模式 UML 图解析建造者模式的优缺点建造者模式的适用场景完整代码 建造者模式 建造者模式&#xff…

Hogan 阻抗控制的理解

机器人阻抗控制是一种基于力的控制方法,它通过调节机器人在受到外部力作用时所表现出的抵抗能力(即阻抗),来实现与环境的良好交互。以下是对机器人阻抗控制的详细理解: 一、阻抗控制的基本原理 阻抗控制的核心思想是通过模拟物体的力学特性(如刚度、阻尼和质量),使机…

定时器处理按键抖动

一、按键的抖动 1.按键的定义和原因 按键抖动是由于‌机械按键在闭合和断开时&#xff0c;由于触点的弹性作用&#xff0c;会产生一系列的抖动现象。这种抖动对于人类来说几乎感觉不到&#xff0c;但对‌单片机来说&#xff0c;却是一个可以感应到的过程&#xff0c;且处理时…

SQL - 设计数据库

数据建模 数据建模就是为要存储在数据库中的数据创建模型的过程 步骤 1.理解和分析业务需求 (收集信息) 收集需求&#xff0c;明确业务流程&#xff0c;定义数据需求&#xff0c;分析业务规则 2.构建业务的概念模型 (识别和表示业务中实体、事务或概念以及它们之间的关系) 识别…

APP支付宝授权获取code uniapp

1.点击使用plus.runtime跳转打开支付宝 //打开支付宝授权&#xff0c;在支付宝APP中授权后会在支付宝中跳转到你填写的h5地址//urls是授权地址可以后端拼接也可以前端写死 //以下是一个拼接示例&#xff0c;需修改app_id的值和redirect_uri的值即可 //app_id是商户的APPID&…

WorkPlus-为用户提供IM即时通讯和实时音视频通信本地化服务

WorkPlus作为一家领先的企业级通讯解决方案提供商&#xff0c;为用户提供了本地化服务&#xff0c;以满足IM即时通讯和实时音视频通信的需求。本文将深入探讨WorkPlus本地化服务的重要性以及其为用户提供的IM即时通讯和实时音视频通信的解决方案。 一、本地化服务的意义 低延迟…

【动态规划、dp】[CSP-J 2022] 上升点列 题解

题目描述 在一个二维平面内&#xff0c;给定 n n n 个整数点 ( x i , y i ) (x_i, y_i) (xi​,yi​)&#xff0c;此外你还可以自由添加 k k k 个整数点。 你在自由添加 k k k 个点后&#xff0c;还需要从 n k n k nk 个点中选出若干个整数点并组成一个序列&#xff0c…

从0开始搭建vue + flask 旅游景点数据分析系统(十三)vue + flask 图片上传、用户头像更改

项目是基于我的博文&#xff1a;vue flask 旅游景点数据分析系统 基础上做的&#xff0c;可以参考之前的博客文章。 1 前端修改 主要是修改Profile.vue <!-- 头像上传 --><el-form-item label"头像"><el-uploadclass""action"/api/…

使用 Fyne 构建 GUI 应用:设置标签文本和自增计数器

引言 Fyne 是一个用 Go 语言编写的跨平台 GUI 框架&#xff0c;它提供了一套丰富的组件来帮助开发者快速构建出漂亮的用户界面。在本文中&#xff0c;我们将通过一个简单的案例来演示如何使用 Fyne 创建 GUI 应用程序&#xff0c;该程序包含设置标签文本和自增计数器的功能。 …

按钮(Buttons)-Qt-思维导图-学习笔记

按钮(Buttons) 按钮在 Qt 中的重要性 按钮是 Qt 中最常用的控件之一 通过点击按钮&#xff0c;可以响应事件&#xff0c;实现人机交互效果 按钮在嵌入式系统和 PC 端的界面交互中都是不可或缺的 Qt 内置的六种按钮部件 QPushButton&#xff1a;下压按钮 用法示例 项目创建与…

指针详解(三)

目录 1. 数组名 2. 使用指针访问数组 3. 一维数组传参的本质 4. 冒泡排序 5. 二级指针 6. 指针数组 7. 指针数组模拟二维数组 1. 数组名 在使用指针访问数组的内容时&#xff0c;有这样的代码&#xff1a; int arr[10] {1,2,3,4,5,6,7,8,9,10}; int *p &arr[0];/…

CV党福音:YOLOv8实现实例分割(二)之训练过程

在上一篇博客中&#xff0c;我们已经了解了YOLOv8实例分割的基本流程&#xff0c;本章则是对数据集、以及训练过程等进行进一步的学习。 文章目录 训练整体流程语义分割与实例分割数据集开启训练训练Debug数据封装损失函数初始化前向传播 总结 训练整体流程 训练模型的整体流…