css HTML中与文本(表情符号)内联的符号

z9zf31ra  于 2023-06-25  发布在  其他
关注(0)|答案(2)|浏览(155)

目标

我想创建一个网页模板卡和桌面棋盘游戏中使用的其他对象。许多游戏包括一种“符号字体”,即一组符号,在游戏的上下文中有意义,与文本一起使用。因此,我的最终目标是能够**在背景图像上放置多个文本字段,并在该文本中包含多色自定义符号。
我想,我所尝试的技术需要一些类似于支持表情符号的技术。
我已经成功地在<span>的内部HTML中呈现了自定义符号。然而,我想呈现的符号与文本内联,可以定位在一个图像。如何做到这一点?

我尝试过的

1.我在Inkscape中画了一个自定义符号,保存为32x32svg文件。它是一个半黄半蓝的圆圈。
1.我把符号上传到icomoon并下载了一个字体包。Icomoon生成.tff.svg.woff字体文件。它还生成了一些示例html和css。
1.我将HTML和CSS缩减为一个非常小的(不)工作示例:
demo.html

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>Symbol font demo</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <p>This code</p>
    <xmp>
        <div>
            <span class="my-fontcircle"><span class="path1"></span><span class="path2"></span></span>
        </div>
    </xmp>
    <p>Produces this</p>
    <div>
        <span class="my-fontcircle"><span class="path1"></span><span class="path2"></span></span>
    </div>
    <p>This code</p>
    <xmp>
        <div font-family: "my-font">Let's use our symbol in line: &#xe900;</div>
    </xmp>
    <p>Produces this</p>
    <div font-family: "my-font">Let's use our symbol in line: &#xe900;</div>

</body>
</html>

style.css

@font-face {
  font-family: 'my-font';
  src:
    url('fonts/my-font.ttf?81gy7') format('truetype'),
    url('fonts/my-font.woff?81gy7') format('woff'),
    url('fonts/my-font.svg?81gy7#my-font') format('svg');
  font-weight: normal;
  font-style: normal;
  font-display: block;
}

[class^="my-font"], [class*=" my-font"] {
  /* use !important to prevent issues with browser extensions that change fonts */
  font-family: 'my-font' !important;
  speak: never;
  font-style: normal;
  font-weight: normal;
  font-variant: normal;
  text-transform: none;
  line-height: 1;

  /* Better Font Rendering =========== */
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

.my-fontcircle .path1:before {
  content: "\e900";
  color: rgb(251, 236, 0);
}
.my-fontcircle .path2:before {
  content: "\e901";
  margin-left: -1em;
  color: rgb(0, 129, 255);
}

结果如下:

正如我们所看到的,当我们使用css类方法时,这个符号出现了,但是它没有呈现在文本中。我们怎样才能使符号显示与文本内联?

i5desfxk

i5desfxk1#

首先,我不确定为什么你不能在你的初始实现中将文本定位在背景图像上,并在文本中包含多色的自定义符号,除非有一些限制,比如HTML转义,你想在哪里使用你的图标。
<span>是一个内联元素,使用一些对齐样式(首先尝试使用inline-flexjustify-content: center;),它应该可以正常工作。存在用于定心元素的资源负载。
我已经把一个例子与一个不同的图标库:.

.background {
  background-image: url(http://www.nasa.gov/sites/default/files/thumbnails/image/northseabloom_oli2_2023165_lrg.jpg);
  background-repeat: no-repeat;
  background-position: center;
  
  display: flex;
  flex-direction: column;
  
  height: 200px;
  width: 200px;
}

.background .text {
  color: white;
}

.background .icon {
  color: red;
}

.background .bottom-text {
  margin-top: auto;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/js/all.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet"/>

<div class="background">
  <p class="text">Hello icons <span class="icon"><i class="fa-solid fa-icons"></i></span>, inline on a background no less!</p>
    <p class="text bottom-text">Hello icons <span class="icon"><i class="fa-solid fa-icons"></i></span>, inline on a background no less!</p>
</div>

您的主要问题似乎是您使用了一个自定义HTML实体,在您的示例中是&#xe900;。我是否可以正确地假设您希望基于您的CSS content: "\e900";进行此操作?我的简短研究表明,为了使其工作,您需要扩展XHTML,而在您的示例中我没有看到这一点。这可能是图标未按预期呈现的原因。

epfja78i

epfja78i2#

如果你不需要替换常见的emoji unicode字符(例如&#x1f600 => smiley),你可以编写一个简单的图标注入脚本。

/**
* define your icons
* as object
*/

let icons = {
  'screaming': "https://camo.githubusercontent.com/26d09c4725b30d28f1d4b28ae161b685fa87d432912f0b7b6dd1e4fbe3cfe2bc/68747470733a2f2f63646e2e6a7364656c6976722e6e65742f6e706d2f407376676d6f6a692f6e6f746f40302e322e302f7376672f31463633312e737667",
  "pleading": "https://camo.githubusercontent.com/dbb026248af889b4cfd2c8bfde4252958b18db090e30ae0e832bbf17cef35216/68747470733a2f2f63646e2e6a7364656c6976722e6e65742f6e706d2f407376676d6f6a692f7477656d6f6a6940322e302e302f7376672f31463937412e737667"
}

/**
* query icon placeholders
* and inject images as defined in object
*/
let iconsInline= document.querySelectorAll('[data-icon]')
iconsInline.forEach(icn=>{
  let type = icn.dataset.icon;
  let img = document.createElement('img');
  let src = icons[type];
  img.src = src;
  img.classList.add('img-emoji', `img-emoji-${type}`)
  icn.append(img)
  
})
body{
  font-size:8vmin;
}

[data-icon]{
  display:inline-block;
  height:1em;
  width:1em;
  /** adjust baseline alignment */
  transform: translateY(0.13em);
}
<p><span data-icon="pleading"></span> One morning, when Gregor Samsa woke from <span data-icon="pleading"></span> troubled dreams, he found himself transformed in his bed into a <span data-icon="screaming"></span> horrible vermin.</p>

工作原理

您正在定义一个包含所有符号源及其标识符的对象:

let icons = {
  'screaming': "icon1.svg",
  'laughing': "icon2.svg",
}

类似于fontAwesome和其他图标库API,您可以通过为占位符元素设置可读/不言自明的标识符来指定图标类型。

<span data-icon="screaming"></span>

在本例中,我使用了一个数据属性而不是类名,以避免类名冲突和前缀的需要(例如:fa-icon-mame)。
现在我们可以用实际的图标替换占位符:

let iconsInline= document.querySelectorAll('[data-icon]')
iconsInline.forEach(icn=>{
  let type = icn.dataset.icon;
  let img = document.createElement('img');
  let src = icons[type];
  img.src = src;
  img.classList.add('img-emoji', `img-emoji-${type}`)
  icn.append(img)
})

您还可以采用这种方法来注入内联SVG。
然而,如果图标包含渐变、蒙版或剪辑路径,您可能会遇到麻烦。
要避免这些问题,您可以使用Danny '365CSI' Engelman's <load-file>本地Web组件将图标附加为shadow DOM元素。

相关问题