当我把svg个图像放在文本旁边,加上vertical-align: middle;,它就会很好地对齐.然而,如果我在::after伪元素中使用svg,那么结果就不符合预期.

Before clicking on text elements

此外,当我单击文本删除其内容时,剩下的svg个元素仍然保持其未对齐的位置:

After clicking on text elements

代码如下:

document.getElementById('em1').addEventListener('click', e => {
  (e.target || e.srcElement).innerText = '';
});
document.getElementById('em2').addEventListener('click', e => {
  (e.target || e.srcElement).innerText = '';
});
document.getElementById('em3').addEventListener('click', e => {
  (e.target || e.srcElement).innerText = '';
});
* {
  vertical-align: middle;
}
div {
  background-color: yellow;
}
em {
  background-color: pink;
  cursor: pointer;
  font-size: 41px;
}
#em2::after, #em3::after {
  content: url("data:image/svg+xml,%3Csvg%20width%3D%22110%22%20height%3D%2246%22%20viewBox%3D%220%200%20110%2046%22%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20style%3D%22fill%3A%23f00%3Bstroke-width%3A0%22%20d%3D%22M%200%2C0%20H%20110%20V%2046%20H%200%20Z%22%20%2F%3E%3C%2Fsvg%3E");
}
#em3::after {
  vertical-align: middle;
}
<div>
  <em id="em1">text #1</em><svg width="110" height="46" viewBox="0 0 110 46"
    version="1.1" xmlns="http://www.w3.org/2000/svg"><path 
    style="fill:#f00;stroke-width:0" d="M 0,0 H 110 V 46 H 0 Z" /></svg>
</div>
<hr>
<div>
  <em id="em2">text #2</em>
</div>
<hr>
<div>
  <em id="em3">text #3</em>
</div>

如何做到这一点,需要调整什么,为什么?为什么⁣::after个伪元素不能自动与其"父元素"对齐?

推荐答案

可以通过给after个伪元素加vertical-align: text-bottom; height: 46px; display: inline-block;来解决:

document.getElementById('em1').addEventListener('click', e => {
  (e.target || e.srcElement).innerText = '';
});
document.getElementById('em2').addEventListener('click', e => {
  (e.target || e.srcElement).innerText = '';
});
document.getElementById('em3').addEventListener('click', e => {
  (e.target || e.srcElement).innerText = '';
});
* {
  vertical-align: middle;
}
div {
  background-color: yellow;
}
em {
  background-color: pink;
  cursor: pointer;
  font-size: 41px;
}
#em2::after, #em3::after {
  content: url(data:image/svg+xml,%3Csvg%20width%3D%22110%22%20height%3D%2246%22%20viewBox%3D%220%200%20110%2046%22%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20style%3D%22fill%3A%23f00%3Bstroke-width%3A0%22%20d%3D%22M%200%2C0%20H%20110%20V%2046%20H%200%20Z%22%20%2F%3E%3C%2Fsvg%3E);
  vertical-align: text-bottom;
  height: 46px;
  display: inline-block;
}
<div>
  <em id="em1">text #1</em><svg width="110" height="46" viewBox="0 0 110 46"
    version="1.1" xmlns="http://www.w3.org/2000/svg"><path 
    style="fill:#f00;stroke-width:0" d="M 0,0 H 110 V 46 H 0 Z" /></svg>
</div>
<hr>
<div>
  <em id="em2">text #2</em>
</div>
<hr>
<div>
  <em id="em3">text #3</em>
</div>

Javascript相关问答推荐

更改一组用户创建的项目的js排序标准

使用NgDeliverentOutlet和动态内容投影的Angular 渲染组件

从外部访问组件变量-Vueejs

如何分配类型脚本中具有不同/额外参数的函数类型

通过在页面上滚动来移动滚动条

Chart.js V4切换图表中的每个条,同时每个条下有不同的标签.怎么做?

使用下表中所示的值初始化一个二维数组

自定义高图中的x轴标签序列

如何让npx在windows中运行js脚本?

Chart.js-显示值应该在其中的引用区域

我可以使用空手道用户界面来获取网页的当前滚动位置吗?

在运行时使用Next JS App Router在服务器组件中运行自定义函数

覆盖TypeScrip中的Lit-Element子类的属性类型

TypeError:无法分解';React2.useContext(...)';的属性';basename';,因为它为空

为什么客户端没有收到来自服务器的响应消息?

Vaadin定制组件-保持对javascrip变量的访问

如何在一个对象Java脚本中获取不同键的重复值?

用另一个带有类名的div包装元素

使用API调用的VUE 3键盘输入同步问题

TypeORM QueryBuilder限制联接到一条记录