HTML5 Canvas API - 用斜体格式化单个单词

2024-01-12

我在 HTML5 中使用 Canvas API 时遇到一个小问题。 我有一个文本,必须在 html 页面的画布上显示。

文本示例可以是“这是一个斜体单词”。 所以我要做的就是显示从数据库中获取的文本,但只将句子中的一个单词设为斜体。所以我必须像这样显示文本:

“这是一Italic word"

所以我的代码如下所示:

var canvas = document.getElementById('myCanvas');
var context = canvas.getContext('2d');

//text
context.fillStyle  = "#000000";
context.font = "20px Sans-Serif";
context.textBaseline = "top";
context.fillText  ("This is an ", 195, 80 );

context.font = "italic 20px Sans-Serif";
context.fillText  ("Italic", 285, 80 );
context.font = "20px Sans-Serif";
context.fillText  ("text", 330, 80 );

所以这段代码实际上并不是动态的,我一直都知道正确的像素从哪里开始句子的其余部分。 有人知道如何动态且干净地解决这个问题吗?


为了实现某种灵活性,您必须在文本中决定一个约定,以表明样式已更改。
而且,您必须使用measureText才能将fillText单独的文本“运行”,每次运行都使用正确的样式,measureText(thisRun).width将为您提供当前运行的大小(以像素为单位)。
然后,您需要绘制单独的文本串,每个文本串都有自己的样式,然后根据measureText的返回值在“光标”上移动。

举个简单的例子,我将样式约定“§r”=常规文本,“§i”=斜体,“§b”=粗体,“§l”=较浅,所以字符串:

var text = "This is an §iItalic§r, a §bbold§r, and a §llighter§r text";

将输出为:

小提琴在这里:

http://jsfiddle.net/gamealchemist/32QXk/6/ http://jsfiddle.net/gamealchemist/32QXk/6/

代码是:

var canvas = document.getElementById('myCanvas');
var context = canvas.getContext('2d');

// marker used in the text to mention style change
var styleMarker = '§';

// table code style --> font style
var styleCodeToStyle = {
    r: '',
    i: 'italic',
    b: 'bold',
    l: 'lighter'
};

// example text
var text = "This is an §iItalic§r, a §bbold§r, and a §llighter§r text";

// example draw
drawStyledText(text, 20, 20, 'Sans-Serif', 20);

// example text 2 : 

var text2 = "This is a text that has separate styling data";
var boldedWords = [ 3, 5, 8 ];
var italicWords = [ 2, 4 , 7];

var words = text2.split(" ");
var newText ='';

for (var i=0; i<words.length; i++) {
  var thisWord = words[i];
  if (boldedWords.indexOf(i)!=-1) 
      newText += '§b' + thisWord + '§r ';
   else if (italicWords.indexOf(i)!=-1) 
      newText += '§i' + thisWord + '§r ';
    else 
       newText += thisWord + ' ';
}

drawStyledText(newText, 20, 60, 'Sans-Serif', 20);


function drawStyledText(text, x, y, font, fontSize) {
    // start with regular style
    var fontCodeStyle = 'r';
    do {
        // set context font
        context.font = buildFont(font, fontSize, fontCodeStyle);
        // find longest run of text for current style
        var ind = text.indexOf(styleMarker);
        // take all text if no more marker
        if (ind == -1) ind = text.length;
        // fillText current run
        var run = text.substring(0, ind);
        context.fillText(run, x, y);
        // return if ended
        if (ind == text.length) return;
        // move forward
        x += context.measureText(run).width;
        // update current style
        fontCodeStyle = text[ind + 1];
        // keep only remaining part of text
        text = text.substring(ind + 2);
    } while (text.length > 0)
}


function buildFont(font, fontSize, fontCodeStyle) {
    var style = styleCodeToStyle[fontCodeStyle];
    return style + ' ' + fontSize + 'px' + ' ' + font;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HTML5 Canvas API - 用斜体格式化单个单词 的相关文章

  • 平均分配固定大小容器的空间。 Flexbox 的案例?

    如何设计 HTML CSS 结构 将固定大小的容器水平分成三部分 第一部分的高度应与其内容需求一样高 第二部分和第三部分将共享剩余的空间五五十 无论它们的内容如何 如果其内容的大小超过此限制 则该部分应该是可滚动的 它的 HTML 部分很简
  • 无需重定向的 HTML 页面提交

    有没有什么方法可以在不使用ajax的情况下提交html表单而无需从当前页面重定向 你可以设置一个target 为您form 这样您就可以将表单提交到新选项卡 target blank 或一个小的 隐藏的iframe target nameo
  • 保证金如何运作?

    我在下面提供了marginfix这是一个块级元素并且one and two也是块级的 但它们是浮动的 这就是为什么它们位于同一行布局的原因 但是marginfix也不浮动 块级元素应位于该元素下方 如下所示
  • 为什么内部 DIV 会溢出到外部 DIV 之外?

    我已经远离 HTML 和 CSS 很久了 找不到这个简单问题的解决方案 我有一个 div 位于另一个 div 中 外层黑色 内层橙色 我的 HTML 和 CSS 是 outer position fixed width 30 height
  • 指定 HTML5 输入类型 = 日期的值输出?

    我想将本机日期选择器添加到我的应用程序中 该应用程序当前使用遗留的本地系统 日期输入支持尚未广泛普及 但如果我可以基于兼容性提供这两种实现 那就太理想了 有没有办法指定 HTML 日期选择器给出的值的输出 歌剧的默认设置是yyyy mm d
  • 为什么Promise中的代码会同步执行? [复制]

    这个问题在这里已经有答案了 在我的项目中 我有一个很长时间运行的操作 所以我决定将其放入Promise因为我认为这样我就可以在里面的代码继续执行其他操作Promise正在跑步 调试的时候发现外面的代码Promise仅当里面的代码执行Prom
  • 如何使用 HTML 和 CSS 在我的网站上显示社交图标?

    我拼命尝试向我的网站添加一些图标 但无法让它们正确显示 我想要的只是一个包含图像并在线显示它们的容器 然后我想在该容器和图像之间添加一些填充 仅此而已 看这里我的方法 如果有人可以帮助我并纠正我的代码 使其真正有效 我会非常高兴 在我的 H
  • 如何将焦点设置在 BootStrap 中的第一个输入字段上? [复制]

    这个问题在这里已经有答案了 可能的重复 如何将焦点设置到独立于 id 的 HTML 表单中的第一个输入元素 https stackoverflow com questions 277544 how to set the focus to t
  • 为什么这个递归函数返回未定义?

    我正在尝试编写一个使用递归组合两个字符串的函数 我的代码如下 但我不知道为什么该函数返回未定义 特别是当我在基本情况下使用 console log 时 它不会打印未定义而是打印正确的值 var str3 function merge str
  • 等待异步 grunt 任务完成

    我收到了 grunt 设置 其中一个新任务应该执行 grunt task run 已经存在的任务 要执行的任务是异步的 新任务应该等待异步任务完成 执行此操作的首选方法是什么 grunt 已经涵盖了这一点 你应该将你的任务声明为异步任务 并
  • 如何跨多个 React Redux 组件使用 requestAnimationFrame 实现游戏循环?

    努力思考最好的解决办法 我可以使用递归调用requestAnimationFrame有一个游戏循环 export interface Props name string points number onIncrement gt void o
  • 文件缓存:查询字符串与上次修改时间?

    我正在研究缓存网站资源的方法 并注意到大多数与我类似的网站都使用查询字符串来覆盖缓存 例如 css style css v 124942823 后来 我注意到每当我保存 style css 文件时 最后修改的标头都会 更新 使得查询字符串变
  • 将默认搜索文本添加到搜索框 html

    我正在努力将 搜索 文本添加到搜索框 我正在努力实现 onfocus 消失文本 And onblur 重新出现文本 到目前为止 我已经实现了这一点 但我必须将其硬编码为 html eg
  • 为什么 console.log() polyfill 不使用 Function.apply()?

    我一直在看一些流行的console log 包装 填充 保罗 爱尔兰的 http paulirish com 2009 log a lightweight wrapper for consolelog 本阿尔曼的 http benalman
  • 如何在 CSS 中将容器内的多个 div 居中

    我正在测试像 Windows Metro 风格的中心分隔线 container height 300px width 70 background EEE margin 10px auto position relative block ba
  • D3 强制布局,较大的节点聚集在中心

    我一直在修改将用于标签云的强制布局 每个标签都由一个
  • 如何计算一行中Flexbox项目的数量?

    网格是使用 CSS flexbox 实现的 Example http jsbin com jumosicasi edit html css js output 本示例中的行数为 4 因为我出于演示目的固定了容器宽度 但是 实际上 它可以根据
  • 加载 Angular 库时,IE9 和 IE10 中出现 Angular JS“SCRIPT5007:预期对象”错误

    我正在开发一个 AngularJS 应用程序 该应用程序应在 Firefox IE 9 和 IE 10 上运行 我使用最新版本的 angularjs 库 现在是 1 3 15 服务器端是在JavaEE平台上用Java编写的 服务器运行在Gl
  • 测试 jQueryUI 是否已加载

    我正在尝试调试网站 并且我认为 jQueryUI 可能未正确加载 如何测试 jQueryUI 是否已加载 if jQuery ui UI loaded OR if typeof jQuery ui undefined UI loaded 应
  • 使用严格模式编译指示时如何声明全局变量

    使用自调用函数来包装严格模式兼容代码 通常称为严格模式编译指示 被认为是一种很好的做法 function use strict Strict code here 我的问题是在这种情况下如何声明全局变量 我今天知道的三种替代方案 替代方案 1

随机推荐

  • Google Chrome 自动填充背景颜色在版本 72.0 中是否已更改?

    我最近注意到 在 Google Chrome 中 所有自动填充值的输入元素都显示蓝色背景 是的 Google 将自动填充预览的背景颜色更改为GoogleBlue50 您可以在这里找到问题 https bugs chromium org p
  • 如何使用表值参数插入多行,然后返回它们的 ID?

    在我的应用程序中 我需要将大量 100 行插入到数据库中 将它们插入数据库后 我需要插入它们的子项 这些子项具有指向子项的外键引用 我想知道是否有一种方法可以编写一个存储过程来插入所有这些行并将它们的 ID 返回到我的应用程序 您已使用表值
  • 向 JavaFX 2.2 添加其他视频编解码器/DVD 支持

    更新 由于 JFX 的媒体端已经开源 我自己对此进行了研究 这确实是可能的 但需要更改和重建 JFX 源 Java 和 C 部分 描述了该过程here http berry120 blogspot co uk 2014 03 expandi
  • TortoiseGit Log Graph 中分支线上的方形图标是什么意思?

    我在 TortoiseGit 日志图表的分支线上有方形和圆形图标 方形图标的含义是什么 Square 合并提交 回合 承诺
  • 如何将twitter、facebook集成到iPhone应用程序中?

    我想将 facebook twitter flickr 放入我的 iPhone 应用程序中 以便用户可以轻松登录并从我的应用程序发布消息 把问题放在这里就是为了得到一些线索或者现有的作品来达到这个目的 经过搜索 我在这里找到了一些相关作品h
  • 导入与命名空间同名的类

    我正在使用带有单独 types 定义的第三方库 如下所示 declare namespace Foo declare class Foo export Foo 如何在我的代码中导入 Foo 类 另外 这种奇怪的名称重复在 Typescrip
  • 查看 Visual Studio 中数据流 SSIS 元素的完整工具提示错误消息

    当我将光标悬停在 SSIS 数据流图中的一个元素上时 工具提示中会显示错误 Where我可以看到全文这个的错误信息 显示此工具提示的元素是标记为 规格 的元素 我正在使用 Microsoft Visual Studio 2008 The m
  • 插入初始数据JPA

    是否可以在我的数据库中加载初始数据 我正在使用 JPA 并使用 删除并创建 策略 这样每次我想测试我的应用程序时 数据库都会首先被清除 我将不得不重新创建所有内容 我知道在其他语言中 Php gt Doctrine datafixtures
  • JPA 使用 ElementCollection 映射多行

    我正在尝试遵循JPA教程 http en wikibooks org wiki Java Persistence ElementCollection并使用ElementCollection记录员工电话号码 PHONE table OWNER
  • 将 python 请求与 javascript 页面结合使用

    我正在尝试将 Requests 框架与 python 一起使用 http docs python requests org en latest http docs python requests org en latest 但是我试图访问的
  • CanvasRenderingContext2D 中的透明度组

    有没有一种方法可以将多个绘制操作组合到 2d 画布渲染上下文中 从而使它们各自独立combined结果被组合到画布的先前内容上 而不是每个绘图操作都由其本身组合 一个应用程序 我想绘制一条带有箭头的半透明线 并且我想避免线和箭头重叠的那些区
  • 为什么“for”循环条件失败? [复制]

    这个问题在这里已经有答案了 在下面所示的代码中 没有打印任何内容 这意味着for循环失败 可能是什么原因 我想知道因为当我打印时TOTAL ELEMENTS单独地 它给出5 所以自然这一定是5 2 3 gt 1 lt 3 所以它应该打印一些
  • Java 原始类型值分配给泛型类型运行时 getClass() 方法错误

    public class Box
  • CLR 定义的方法(例如 [delegate].BeginInvoke)记录在哪里? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 编辑 完全改写 看来我的问题措辞确实不好 而且也没有得到很好的回应 所以我希望这个完整的改写能有所帮助
  • AppFabric 缓存内存非常密集

    问题 我做错了什么吗 配置设置不正确 AppFabric 显示的内存使用量是否低于正常值 问题 我正在将数据从 SQL 数据库表读取到 AppFabric 缓存内存中 似乎 AppFabric 对于一个相当小的对象使用了大量的内存 我无法理
  • 在Python中将一个16位整数拆分为两个8位整数

    我必须将给定的 16 位整数转换为两个 8 位整数 然后将其用作输出 它们的标题是获取两个 8 位整数并将它们重新组合为 16 位输入 不幸的是 这超出了我的控制范围 我的解决方案有效 但感觉不干净 对于粗略数字 我对原始数字进行了位移位
  • 为什么我看不到 Microsoft Forms 2.0 对象库?

    我想使用这个库来处理剪贴板 我希望看到它如下面的屏幕截图所示 但我在参考库列表中找不到它 我怎样才能让它出现 如果您将用户窗体添加到项目中 则会自动添加该库 如果您不需要用户窗体 以后可以随时将其删除
  • Django 模型 __unicode__ 在记录时引发异常

    我有一个模型类 如下所示 class Address models Model taking length of address city fields from existing UserProfile model address 1 m
  • 如何计算 Spark RDD 的平均值?

    我有 Spark Scala 的问题 我想计算 Rdd 数据的平均值 我创建一个像这样的新 RDD 2 110 2 130 2 120 3 200 3 206 3 206 4 150 4 160 4 170 我想这样数它们 2 110 13
  • HTML5 Canvas API - 用斜体格式化单个单词

    我在 HTML5 中使用 Canvas API 时遇到一个小问题 我有一个文本 必须在 html 页面的画布上显示 文本示例可以是 这是一个斜体单词 所以我要做的就是显示从数据库中获取的文本 但只将句子中的一个单词设为斜体 所以我必须像这样