我有一个弹性布局的网页,如果调整浏览器窗口大小,它会改变其宽度.
在这种布局中,标题(h2
)将具有可变长度(实际上是我无法控制的博客标题的头条新闻).目前 - 如果它们比窗户宽 - 它们分成两行.
是否有一个优雅的,经过测试的(跨浏览器)解决方案 - 例如使用jQuery - 缩短了标题标签的innerHTML,如果文本太宽而无法放入当前屏幕的一行,则会添加"..."容器宽度?
除了Firefox 6.0之外,以下仅用于截断单行文本的CSS解决方案适用于http://www.caniuse.com上列出的所有浏览器.请注意,除非您需要支持包装多行文本或早期版本的Firefox,否则完全没有JavaScript.
.ellipsis { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; -o-text-overflow: ellipsis; }
如果您需要支持早期版本的Firefox,请查看我对其他问题的回答.
我有一个在FF3,Safari和IE6 +中使用单行和多行文本的解决方案
.ellipsis { white-space: nowrap; overflow: hidden; } .ellipsis.multiline { white-space: normal; }Lorem ipsum dolor sit amet, consectetur adipisicing elitLorem ipsum dolor sit amet, consectetur adipisicing elit
jquery.ellipsis.js
(function($) { $.fn.ellipsis = function() { return this.each(function() { var el = $(this); if(el.css("overflow") == "hidden") { var text = el.html(); var multiline = el.hasClass('multiline'); var t = $(this.cloneNode(true)) .hide() .css('position', 'absolute') .css('overflow', 'visible') .width(multiline ? el.width() : 'auto') .height(multiline ? 'auto' : el.height()) ; el.after(t); function height() { return t.height() > el.height(); }; function width() { return t.width() > el.width(); }; var func = multiline ? height : width; while (text.length > 0 && func()) { text = text.substr(0, text.length - 1); t.html(text + "..."); } el.html(t.html()); t.remove(); } }); }; })(jQuery);
我使用了许多其他帖子构建了此代码,并具有以下增强功能:
它使用二进制搜索来查找恰到好处的文本长度.
它通过设置一次性显示事件来处理最初隐藏省略号元素的情况,该事件在首次显示项目时重新运行省略号代码.这对于主要细节视图或树视图很方便,其中某些项目最初未显示.
它可选地为原始文本添加title属性以用于悬停效果.
添加display: block
到样式,所以跨度工作
它使用省略号字符而不是3个句点.
它使用.ellipsis类自动运行脚本
CSS:
.ellipsis { white-space: nowrap; overflow: hidden; display: block; } .ellipsis.multiline { white-space: normal; }
jquery.ellipsis.js
(function ($) { // this is a binary search that operates via a function // func should return < 0 if it should search smaller values // func should return > 0 if it should search larger values // func should return = 0 if the exact value is found // Note: this function handles multiple matches and will return the last match // this returns -1 if no match is found function binarySearch(length, func) { var low = 0; var high = length - 1; var best = -1; var mid; while (low <= high) { mid = ~ ~((low + high) / 2); //~~ is a fast way to convert something to an int var result = func(mid); if (result < 0) { high = mid - 1; } else if (result > 0) { low = mid + 1; } else { best = mid; low = mid + 1; } } return best; } // setup handlers for events for show/hide $.each(["show", "toggleClass", "addClass", "removeClass"], function () { //get the old function, e.g. $.fn.show or $.fn.hide var oldFn = $.fn[this]; $.fn[this] = function () { // get the items that are currently hidden var hidden = this.find(":hidden").add(this.filter(":hidden")); // run the original function var result = oldFn.apply(this, arguments); // for all of the hidden elements that are now visible hidden.filter(":visible").each(function () { // trigger the show msg $(this).triggerHandler("show"); }); return result; }; }); // create the ellipsis function // when addTooltip = true, add a title attribute with the original text $.fn.ellipsis = function (addTooltip) { return this.each(function () { var el = $(this); if (el.is(":visible")) { if (el.css("overflow") === "hidden") { var content = el.html(); var multiline = el.hasClass('multiline'); var tempElement = $(this.cloneNode(true)) .hide() .css('position', 'absolute') .css('overflow', 'visible') .width(multiline ? el.width() : 'auto') .height(multiline ? 'auto' : el.height()) ; el.after(tempElement); var tooTallFunc = function () { return tempElement.height() > el.height(); }; var tooWideFunc = function () { return tempElement.width() > el.width(); }; var tooLongFunc = multiline ? tooTallFunc : tooWideFunc; // if the element is too long... if (tooLongFunc()) { var tooltipText = null; // if a tooltip was requested... if (addTooltip) { // trim leading/trailing whitespace // and consolidate internal whitespace to a single space tooltipText = $.trim(el.text()).replace(/\s\s+/g, ' '); } var originalContent = content; var createContentFunc = function (i) { content = originalContent.substr(0, i); tempElement.html(content + "…"); }; var searchFunc = function (i) { createContentFunc(i); if (tooLongFunc()) { return -1; } return 0; }; var len = binarySearch(content.length - 1, searchFunc); createContentFunc(len); el.html(tempElement.html()); // add the tooltip if appropriate if (tooltipText !== null) { el.attr('title', tooltipText); } } tempElement.remove(); } } else { // if this isn't visible, then hook up the show event el.one('show', function () { $(this).ellipsis(addTooltip); }); } }); }; // ellipsification for items with an ellipsis $(document).ready(function () { $('.ellipsis').ellipsis(true); }); } (jQuery));
我的回答只支持单行文字.查看下面gfullam对多线分支的评论,它看起来非常有前途.
我从第一个答案重写了几次代码,我认为这应该是最快的.
它首先找到"Estimated"文本长度,然后添加或删除一个字符,直到宽度正确为止.
它使用的逻辑如下所示:
找到"估计的"文本长度后,添加或删除字符,直到达到所需的宽度.
我确定它需要一些调整,但这里是代码:
(function ($) { $.fn.ellipsis = function () { return this.each(function () { var el = $(this); if (el.css("overflow") == "hidden") { var text = el.html().trim(); var t = $(this.cloneNode(true)) .hide() .css('position', 'absolute') .css('overflow', 'visible') .width('auto') .height(el.height()) ; el.after(t); function width() { return t.width() > el.width(); }; if (width()) { var myElipse = "...."; t.html(text); var suggestedCharLength = (text.length * el.width() / t.width()) - myElipse.length; t.html(text.substr(0, suggestedCharLength) + myElipse); var x = 1; if (width()) { while (width()) { t.html(text.substr(0, suggestedCharLength - x) + myElipse); x++; } } else { while (!width()) { t.html(text.substr(0, suggestedCharLength + x) + myElipse); x++; } x--; t.html(text.substr(0, suggestedCharLength + x) + myElipse); } el.html(t.html()); t.remove(); } } }); }; })(jQuery);
我制作了一个非常酷的jQuery插件,用于处理各种文本的省略号,一个叫做ThreeDots @ http://tpgblog.com/threedots
它比CSS方法更灵活,并支持更高级,可定制的行为和交互.
请享用.
以防你们都在2013年结束 - 这里是我在这里找到的一种纯粹的css方法:http://css-tricks.com/snippets/css/truncate-string-with-ellipsis/
.truncate { width: 250px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
它运作良好.
一个更灵活的jQuery插件,使您可以在省略号后保留一个元素(例如"read-more"按钮)并更新onWindowResize.它还适用于带有标记的文本:
http://dotdotdot.frebsite.nl
trunk8 jQuery插件支持多行,并且可以使用任何html,而不仅仅是省略号字符,用于截断后缀:https://github.com/rviscomi/trunk8
在这里演示:http://jrvis.com/trunk8/
实际上有一种非常简单的方法可以在CSS中实现这一点,利用IE扩展了非标准和FF支持的事实:after
你可以通过检查目标的scrollWidth并将它与它的父级宽度进行比较来在JS中执行此操作,但是这样做不太稳健.
编辑:这显然比我想象的更发达.CSS3支持可能很快就会存在,并且您可以尝试使用一些不完善的扩展.
http://www.css3.info/preview/text-overflow/
http://ernstdehaan.blogspot.com/2008/10/ellipsis-in-all-modern-browsers.html
最后一个是好读.