html - 带有“=”符号的文本对齐
问题描述
我想将文本与“=”符号对齐,如下图所示:
我可以使用 mathjax 来实现,但如果可能的话,我想使用 css 来实现。但是我这样做的方式不是使等号符号彼此对齐。我需要你的帮助。
这是我试过的,
Solution, <br>
Given, f(x) = 3x <br>
g(x) = x + 2 <br>
fog(x) = 18 <br>
To find: x = ?, <br>
Now, <br>
fog(x) = 18 <br>
or, f(x + 2) = 18 <br>
or, 3(x + 2) = 18 <br>
or, x + 2 = 6 <br>
∴ x = 4
解决方案
您的问题是将文本排列成易于使用 CSS 设置样式的表单。假设您的文本以 JSON 字符串数组的形式出现,即:
[
"Solution,",
"Given, f(x) = 3x",
"g(x) = x + 2",
"fog(x) = 18",
"To find: x = ?,",
"Now,",
"fog(x) = 18",
"or, f(x + 2) = 18",
"or, 3(x + 2) = 18",
"or, x + 2 = 6",
"∴ x = 4"
]
...您想要一个将其转换为可样式标记的功能。
这是一个使用 vanilla Javascript 和 CSS 网格的示例:
[...document.querySelectorAll('math-element')].forEach(el => {
// reset, in case you run this more than once...
el.innerHTML = '';
// we need JSON.parse as dataset.text is a string
JSON.parse(el.dataset.text).forEach(text => {
const div = document.createElement('div');
// split each row by `=` sign, if it has any
text.split('=').forEach(t => {
const span = document.createElement('span');
if (text.split('=').length < 2) {
// adds `.single` to items which are single on their row
span.classList.add('single');
}
span.innerHTML = t;
el.appendChild(span);
});
// add a `<hr>` after each element
const separator = document.createElement('hr')
el.appendChild(separator);
})
})
math-element {
display: grid;
grid-template-columns: auto 1fr;
}
math-element hr {
display: none;
}
math-element span {
grid-column-start: 1;
text-align: right;
padding: 0 2px 0 1rem;
}
math-element span:not(.single) {
font-style: italic;
}
math-element span.single {
text-align: left;
padding-top: .5rem;
font-style: normal;
}
math-element span + span {
grid-column-start: 2;
text-align: left;
padding: 0 2px;
}
math-element span + span:before {
content: '=';
}
<math-element data-text='["Solution,","Given, f(x) = 3x","g(x) = x + 2","fog(x) = 18","To find: x = ?,","Now,","fog(x) = 18","or, f(x + 2) = 18","or, 3(x + 2) = 18","or, x + 2 = 6","∴ x = 4"]'></math-element>
您不必像我一样将值内联为字符串,您可以简单地动态创建元素并forEach
直接在数据上运行。
如果您发现 CSS 网格语法和逻辑令人困惑,您始终可以创建一个<table>
with<tr>
和<td>
s,这将为您提供更简单的选择器。出于原则,我建议不要这样做。
我用<hr>
s 来标记每个“行”的结尾(CSS 网格要求所有单元格都是兄弟)。相反,您可以将行内容嵌套到单个元素 ( <div>
?) 中并对列宽进行硬编码。
显然,CSS 是您可以修改的(即:删除font-style
's、调整padding
值等...)。
最后一点:如果一个“行”包含多个=
符号,由于这条规则:
math-element span + span {
grid-column-start: 2;
}
连续跨越 2 和 3 (以及随后,直到行尾)将在彼此下方显示一个,每个都以一个=
符号为前缀并与其余部分对齐(这还不错,恕我直言)。如果你想改变这种行为,你可能想提供一个
math-element span + span + span {
grid-column-start: 3;
}
...规则,等等。您还需要更改grid-template-columns
以匹配:
math-element {
grid-template-columns: auto auto 1fr;
}
...匹配“列”的数量。
推荐阅读
- r - R - 错误:“汽车”的包或命名空间加载失败;加载库失败
- c# - 合并两个列表的重复项时条件合并
- c - 跟踪递归函数
- linux - 随机排序不适用于 --random_source=FILE
- c# - 连接字符串时,C# 中的 for 循环为何如此缓慢?
- javascript - assert.fail(1, 2) 不显示 node.js 10 的弃用警告
- python - 如何使用两个嵌套列表来制作字典列表?
- error-handling - 在 Smalltalk/Pharo 中创建以块为参数的键值消息
- java - 由于缓慢的 IO 调用,Google Dataflow 的工作人员几乎处于空闲状态
- javascript - Typescript Promise 拒绝类型