【问题标题】:How can I detect where the text baseline is positioned如何检测文本基线的位置
【发布时间】:2013-07-27 09:52:13
【问题描述】:

如果我有一组如下所示的 HTML:

<div>
    This is some text, followed by an image
    <img src="some image with height greater than the text" />
</div>

并且图片设置为居中垂直对齐:

img {
    vertical-align: middle;
}

然后文本将最终位于 div 中的较低位置,因此它与图像的中间对齐。在此处查看示例:http://jsfiddle.net/RGWny/

有没有办法使用javascript(或jquery,或任何jquery插件)来检测文本的实际位置?

我正在寻找一种方法来获取文本上方间隙的大小(以 px/pt/em/等为单位),或者从 &lt;div&gt; 顶部到文本基线的距离。

我想通过查看图像大小等来避免实际计算位置应该在哪里。文本是动态的,可能包含也可能不包含多个图像,可能包含也可能不包含位于文本的第一行。我需要相对于文本第一行的垂直位置定位另一个元素。

【问题讨论】:

标签: javascript jquery css vertical-alignment


【解决方案1】:

您可以将div 中的每个文本节点包装到服务器端甚至客户端的span 中,如下面的代码所示。然后测量“文本上方的间隙”非常简单——它只是 text-span 相对于其父级 div 的垂直位置。

<div id='x'>
    This is some text, followed by an image
    <img style="vertical-align:middle" src="http://www.clker.com/cliparts/R/S/Z/4/t/f/crossed-hammers-bw-100x100-md.png" />
</div>
<script>
function wrapTextNodes(jqelem) {
    jqelem.contents()
        .filter( function() { return this.nodeType===3 && $.trim(this.nodeValue); } )
        .wrap("<span class='was-text'></span>");
}
wrapTextNodes( $('#x') );

$('#x span.was-text').each( function() {
    alert( $(this).position().top );
});
</script>

【讨论】:

  • 谢谢,这是一个不错的干净解决方案。我曾考虑将文本自动包装在一个跨度中,但我想不出一种优雅的方式来做到这一点 - 我喜欢 contents()filter() 这里的组合。
  • 虽然有几个更新 - 我会使用 $.trim 而不是普遍支持的内置 String.trim$.trim(this.nodeValue).length。此外,.end() 在这里什么都不做,可以完全删除。
  • 同意 $.trim.end()... 极简主义的下一步 - .length 属性也不需要,因为空字符串本身会转换为布尔值 false。更新了上面的代码示例。
  • 请注意,IE 没有可用的Node.TEXT_NODE 常量。您需要改用3,如下所述:stackoverflow.com/questions/1423599/node-text-node-and-ie7
猜你喜欢
  • 1970-01-01
  • 2016-10-30
  • 2010-11-03
  • 2017-06-18
  • 2016-05-13
  • 1970-01-01
  • 1970-01-01
  • 2019-11-07
  • 1970-01-01
相关资源
最近更新 更多