【问题标题】:Get specific textline in div获取 div 中的特定文本行
【发布时间】:2013-09-14 11:41:56
【问题描述】:

目前我正在尝试处理网页上以 cols 显示的文本。 事实上我正在尝试模拟CSS3 Multiple Columns

我从包含所有文本的一列开始,使用Hyphenator.js 来提高文本质量,然后我想在第一条不可见行处拆分并将文本添加到新的浮动 div。我想这样做,直到我没有未显示的文本。

我面临的问题是,布局是流畅的,我不知道如何获得特定的文本行。

我首先提取 css 属性 line-height、使用 overflow: hidden; 隐藏较长文本的父 div 的 height 和 text-div 的 height。但是现在我被卡住了,因为我无法确定一行中有多少个单词。

我还尝试使用正则表达式将文本拆分为句子。并一个接一个地添加,直到 div 的高度对于周围的高度来说太大了。但是有了这个我没有Hyphenator.js的好处。

这是我的html的摘录:

<div class="col col_2">
    <div class="col_content">
        <h1>Lorem Ipsum dolor sit amet</h1>
        <div class="text">
            <div class="start_col hyphenate">
                Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet,                      
            </div>
        </div>
    </div>
</div>

处理完成后start_col将被隐藏,以在用户调整窗口大小时使用原始文本。

这是我用来将文本拆分成句子的正则表达式:

var sentences = $(this).text().replace(/\.+/g,'.|').replace(/\?/g,'?|').replace(/\!/g,'!|').split("|");
var temp = [];
for(var i = 0; i < sentences.length; i++)
{
    var sentence = $.trim(sentences[i]);
    if(sentence !== "")
        temp.push(sentence);
    sentences = temp;
}

但就像我之前写的那样,我无法从 Hyphenator.js 中受益。

如果我在某些方面不清楚,我会很乐意解释更多。

【问题讨论】:

  • 我在某处读过,您可以将每个单词包装在 span 中,然后开始添加它们的宽度,直到下一个跨度超过容器的宽度。那是一行文字。不过,不知道它是否有很大帮助。
  • @JakubMichálek:谢谢小费。我会仔细看看的。但听起来我必须做一些复杂的计算,我不太确定如果所有文本列在调整大小后重新计算会发生什么。
  • 另一个简化计算的技巧是首先将文本除以列数,然后检查你离了多少,最后来回移动单词(或跨度)直到你快乐的。但我个人认为这是降级的一个很好的例子——现代浏览器知道 css 列和连字符,旧浏览器只得到一列文本。
  • @Tobias Kun:所以我们在谈论“渐进式增强”与“优雅降级”!?从我的角度来看,使用过时浏览器的用户可能有这样做的理由。将所有最新功能带到他们的旧浏览器中并不是作者的工作。您知道有多少旧网站使用“报纸(多栏)布局”?这是有原因的,因为如果没有浏览器支持所需的 CSS 功能,您将无法完成此操作,至少无法以令人满意的方式完成。顺便说一句:您想支持哪些“旧”浏览器?
  • @Tobias Kun:好的,事情变得更清楚了......! ;-) 但事实仍然是 无法以可承受的成本实现这一目标! 另请参阅 Using CSS multi-column layouts。作为专业人士,您应该能够决定什么时候有意义,什么时候没有意义。恕我直言,在这种情况下绝对不是!即使您找到了 JS 解决方案,如果 JS 被停用/禁用怎么办?每向前迈出一步,你就会后退两步,因为你不断地制造新的问题。 ;-)

标签: javascript jquery css regex multiple-columns


【解决方案1】:

我不能 100% 确定你在问什么,但还是让我试一试吧。

为什么不在 jQuery 中使用 strlen() http://www.w3schools.com/php/func_string_strlen.asp 和 outerWidth() 来计算每行有多少个字符,而不是多少个单词。

字符宽度将等于字体大小(或其他东西) 所以每行的字符数等于字符宽度除以div的outerWidth。希望这是有道理的。

【讨论】:

  • 我有使用Hyphenator.js 优化的文本,这意味着较长的单词将被拆分为一个音节,以便在一行中允许更多的文本。使用字符串长度可能是一种可能的方式,但它不够精确。我想构建一个看起来很像报纸的 Web 应用程序,而在错误位置拆分的文本可能会贬低用户体验。
  • @Daniel Schwarz:不,它没有。整个计划毫无意义!在您的提案中,您必须考虑实际字体、字体大小、字母间距、字间距等。使浏览器的工作完全是荒谬的......!编写语义正确的 HTML 标记并使用 CSS 设置样式 - 就是这样。
  • @Netsurfer 是对的。不过,我想不出更好的方法。重写您的 HTML5 并考虑其他布局选项?你试过砌砖吗? masonry.desandro.com - 他们为多列布局提供了许多不同的选项,并且与其他脚本配合得很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-23
  • 2021-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多