Aar*_*lla 7 html javascript text highlight line
我有一个很长的文本,我想为用户提供阅读帮助:当前行应突出显示.为了使它更容易,我将只使用鼠标的Y坐标(这样,鼠标指针不会妨碍).我有一个带有id的大DIV,content它填充了整个宽度,还有一个带有content文本类的小DIV (参见这里的例子).
我正在使用jQuery 1.4.如何突出显示最接近当前鼠标位置的文本行?
And*_*y E 18
不确定jQuery是否会在这里帮助你,但你可以看一下MSDN和MDCelement.getClientRects上记录的方法.更具体地说,MSDN上的这个例子有点类似于你想要实现的内容,使用巧妙的z-indexed 元素突出显示行,该元素位于返回的坐标处的文本后面.divgetClientRects()
您应该能够通过循环文档中返回的TextRectangle对象onmousemove并检查鼠标光标的y值是>顶部和<每个矩形的底部并移动巧妙的z-indexed div来实现相同的功能.到相同的位置/高度.
所有当前主流浏览器都支持getClientRects().
更新 - 在Chrome,IE6/7/8,Firefox,Opera,Safari中工作.我曾在其他浏览器最初的问题是关系到DIV需要要display: inline.
再次更新 - 我不得不在一些较新的问题上参考这个答案,所以我花时间更新它以重新调整窗口大小调整的行.看起来其他人一直在玩,它现在正在修订版15.
我没有看到如果没有明确包装的文本(即换行符或<br>元素),你怎么可能做到这一点.
据我所知,DOM无法发现特定文本片段的位置,字符方式或像素方式 - 包括我所知道的Range API - 更不用说动态自然文本可以假设,例如浏览器的文本缩放功能.
但如果你能以某种方式设法生成/注入明确的行结尾,那么我认为我有一个解决方案.
感谢Pekka答案中的精彩信息,我拼凑了一个功能原型,但它有一个重要的警告 - 仅适用于纯文本内容.任何HTML存在元素的主体将被剥离.
<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript"> google.load("jquery", "1.4.1"); </script>
<script type="text/javascript">
jQuery.fn.wrapLines = function( openTag, closeTag )
{
var dummy = this.clone().css({
top: -9999,
left: -9999,
position: 'absolute',
width: this.width()
}).appendTo(this.parent())
, text = dummy.text().match(/\S+\s+/g);
var words = text.length
, lastTopOffset = 0
, lines = []
, lineText = ''
;
for ( var i = 0; i < words; ++i )
{
dummy.html(
text.slice(0,i).join('') +
text[i].replace(/(\S)/, '$1<span/>') +
text.slice(i+1).join('')
);
var topOffset = jQuery( 'span', dummy ).offset().top;
if ( topOffset !== lastTopOffset && i != 0 )
{
lines.push( lineText );
lineText = text[i];
} else {
lineText += text[i];
}
lastTopOffset = topOffset;
}
lines.push( lineText );
this.html( openTag + lines.join( closeTag + openTag ) + closeTag );
};
$(function()
{
$('p').wrapLines( '<span class="line">', '</span>' );
});
</script>
<style type="text/css">
span.line:hover {
background-color: lightblue;
}
</style>
<p style="width: 400px;">
one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty twenty-one twenty-two twenty-three
</p>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4975 次 |
| 最近记录: |