草庐IT

javascript - 使文本行具有相同的长度

coder 2024-05-12 原文

在居中的 h1 元素中,如果文本位于多行,换行符使文本看起来像这样:

                This is a header that takes up two
                              lines

                This is a header that takes up three
                lines because it is really, really
                              long

有没有办法操纵这些元素,使文本行的长度大致相等?像这样:

                       This is a header that
                        takes up two lines

                    This is a header that takes 
                     up three lines because it
                       is really, really long

jQuery 插件 Widow Fix防止单字行,但我正在寻找能够使多行元素中的所有行均匀的东西。是否有用于此的任何 jQuery 插件,或者您可以推荐一种策略吗?

最佳答案

我会只使用严格的 JavaScript 来解决它,方法是这样的:

1. 将名为“truncate”的类放入要中断的 h1 标签
2.根据您的需要配置javascript代码

  • MAXCOUNT:(整数)每行计数的最大字符数
  • COUNT_SPACES:( bool 值)必须计算空格吗?
  • COUNT_PUNCTUATION:(boolean)标点符号一定要算吗?
  • EXACT: (boolean) 最后一个字必须删掉?
  • BLOCKS_CLASS:(字符串)要考虑的 h1 的类名

    我写的代码很快所以必须更好地测试错误, 但我认为它可以作为一个起点。

    我没有在此代码中使用 jQuery 以保持代码简洁并避免依赖性。
    我想我正在使用所有跨浏览器命令(无法测试我现在只有 linux)。然而,任何针对跨浏览器兼容性任务的更正(包括在需要时使用 jQUery)都可能很容易。

    这是代码:

    <html>
    
    <head>
        <style>
            h1 {background-color: yellow;}
            #hiddenDiv {background-color: yellow; display: table-cell; visibility:hidden;}
        </style>
        <script>
    
            var MAXCOUNT            = 20;
            var COUNT_SPACES        = false;
            var EXACT               = false;
            var COUNT_PUNCTUATION   = true;
            var BLOCKS_CLASS        = 'truncate';
    
            window.onload = function () 
            {
                var hidden = document.getElementById('hiddenDiv');
    
                if (hidden == null)
                {
                    hidden = document.createElement('div');
                    hidden.id = 'hiddenDiv';
                    document.body.appendChild(hidden);
                }
    
                var blocks = document.getElementsByClassName(BLOCKS_CLASS);     
    
                for (var i=0; i<blocks.length; i++)
                {
                    var block           = blocks[i];
                    var text            = block.innerHTML;
                    var truncate        = '';
                    var html_tag        = false;
                    var special_char    = false;
                    maxcount            = MAXCOUNT;
                    for (var x=0; x<maxcount; x++)
                    {
                        var previous_char = (x>0) ? text.charAt(x-1) : '';
                        var current_char = text.charAt(x);
    
                        // Closing HTML tags
                        if (current_char == '>' && html_tag)
                        {
                            html_tag = false;
                            maxcount++;
                            continue;
                        }
                        // Closing special chars
                        if (current_char == ';' && special_char)
                        {
                            special_char = false;
                            maxcount++;
                            continue;
                        }
                        // Jumping HTML tags
                        if (html_tag)
                        {
                            maxcount++;
                            continue;
                        }
                        // Jumping special chars
                        if (special_char)
                        {
                            maxcount++;
                            continue;
                        }
                        // Checking for HTML tags
                        if (current_char == '<')
                        {
                            var next = text.substring(x,text.indexOf('>')+1);
                            var regex = /(^<\w+[^>]*>$)/gi;
                            var matches = regex.exec(next); 
                            if (matches[0])
                            {
                                html_tag = true;
                                maxcount++;
                                continue;
                            }                       
                        }
                        // Checking for special chars
                        if (current_char == '&')
                        {
                            var next = text.substring(x,text.indexOf(';')+1);
                            var regex = /(^&#{0,1}[0-9a-z]+;$)/gi;
                            var matches = regex.exec(next);
                            if (matches[0])
                            {
                                special_char = true;
                                maxcount++;
                                continue;
                            }
                        }                   
                        // Shrink multiple white spaces into a single white space
                        if (current_char == ' ' && previous_char == ' ')
                        {
                            maxcount++;
                            continue;
                        }
                        // Jump new lines
                        if (current_char.match(/\n/))
                        {
                            maxcount++;
                            continue;
                        }                   
                        if (current_char == ' ')
                        {
                            // End of the last word
                            if (x == maxcount-1 && !EXACT) { break; }
                            // Must I count white spaces?
                            if ( !COUNT_SPACES ) { maxcount++; }
                        }
                        // Must I count punctuation?
                        if (current_char.match(/\W/) && current_char != ' ' && !COUNT_PUNCTUATION)
                        {
                            maxcount++;
                        }
                        // Adding this char
                        truncate += current_char;
                        // Must I cut exactly?
                        if (!EXACT && x == maxcount-1) { maxcount++; }
                    }
    
                    hidden.innerHTML = '<h1><nobr>'+truncate+'</nobr></h1>';
    
                    block.style.width = hidden.offsetWidth+"px";
                }
            }
    
        </script>
    </head>
    
    
    <body>
    
    <center>
        <h1 class="truncate">
            This is a header that
            takes up two lines
        </h1>
    
        <br>
    
        <h1 class="truncate">
            This is a header that takes 
            up three lines because it
            is really, really long
        </h1>
    
        <br>
    
        <h1>
            This is a header pretty short
            or pretty long ... still undecided
            which in any case is not truncated!
        </h1>
    </center>
    
    </body>
    
    </html>
    

    这是一个演示:http://jsfiddle.net/6rtdF/

  • 关于javascript - 使文本行具有相同的长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9070160/

    有关javascript - 使文本行具有相同的长度的更多相关文章

    1. ruby-on-rails - unicode 字符串的长度 - 2

      在我的Rails(2.3,Ruby1.8.7)应用程序中,我需要将字符串截断到一定长度。该字符串是unicode,在控制台中运行测试时,例如'א'.length,我意识到返回了双倍长度。我想要一个与编码无关的长度,以便对unicode字符串或latin1编码字符串进行相同的截断。我已经了解了Ruby的大部分unicode资料,但仍然有些一头雾水。应该如何解决这个问题? 最佳答案 Rails有一个返回多字节字符的mb_chars方法。试试unicode_string.mb_chars.slice(0,50)

    2. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

      我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

    3. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

      我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

    4. ruby - 如果指定键的值在数组中相同,如何合并哈希 - 2

      我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat

    5. ruby - 匹配大写字母并用后续字母填充,直到一定的字符串长度 - 2

      我有一个驼峰式字符串,例如:JustAString。我想按照以下规则形成长度为4的字符串:抓取所有大写字母;如果超过4个大写字母,只保留前4个;如果少于4个大写字母,则将最后大写字母后的字母大写并添加字母,直到长度变为4。以下是可能发生的3种情况:ThisIsMyString将产生TIMS(大写字母);ThisIsOneVeryLongString将产生TIOV(前4个大写字母);MyString将生成MSTR(大写字母+tr大写)。我设法用这个片段解决了前两种情况:str.scan(/[A-Z]/).first(4).join但是,我不太确定如何最好地修改上面的代码片段以处理最后一种

    6. ruby-on-rails - Rails 3.1 中具有相同形式的多个模型? - 2

      我正在使用Rails3.1并在一个论坛上工作。我有一个名为Topic的模型,每个模型都有许多Post。当用户创建新主题时,他们也应该创建第一个Post。但是,我不确定如何以相同的形式执行此操作。这是我的代码:classTopic:destroyaccepts_nested_attributes_for:postsvalidates_presence_of:titleendclassPost...但这似乎不起作用。有什么想法吗?谢谢! 最佳答案 @Pablo的回答似乎有你需要的一切。但更具体地说...首先改变你View中的这一行对此#

    7. ruby - 从 String#split 返回的零长度字符串 - 2

      在Ruby1.9.3(可能还有更早的版本,不确定)中,我试图弄清楚为什么Ruby的String#split方法会给我某些结果。我得到的结果似乎与我的预期相反。这是一个例子:"abcabc".split("b")#=>["a","ca","c"]"abcabc".split("a")#=>["","bc","bc"]"abcabc".split("c")#=>["ab","ab"]在这里,第一个示例返回的正是我所期望的。但在第二个示例中,我很困惑为什么#split返回零长度字符串作为返回数组的第一个值。这是什么原因呢?这是我所期望的:"abcabc".split("a")#=>["bc"

    8. Ruby - 如何将消息长度表示为 2 个二进制字节 - 2

      我正在使用Ruby,我正在与一个网络端点通信,该端点在发送消息本身之前需要格式化“header”。header中的第一个字段必须是消息长度,它被定义为网络字节顺序中的2二进制字节消息长度。比如我的消息长度是1024。如何将1024表示为二进制双字节? 最佳答案 Ruby(以及Perl和Python等)中字节整理的标准工具是pack和unpack。ruby的packisinArray.您的长度应该是两个字节长,并且按网络字节顺序排列,这听起来像是n格式说明符的工作:n|Integer|16-bitunsigned,network(bi

    9. ruby-on-rails - 优雅的 Rails : multiple routes, 相同的 Controller Action - 2

      让多条路线去同一条路的最优雅的方式是什么ControllerAction?我有:get'dashboard',to:'dashboard#index'get'dashboard/pending',to:'dashboard#index'get'dashboard/live',to:'dashboard#index'get'dashboard/sold',to:'dashboard#index'这很丑陋。有什么“更优雅”的建议吗?一个类轮的奖励积分。 最佳答案 为什么不只有一个路由和一个Controller操作,并根据传递给它的参数来

    10. ruby - 在 Ruby 中将整数格式化为固定长度的字符串 - 2

      有没有一种简单的方法可以将给定的整数格式化为具有固定长度和前导零的字符串?#convertnumberstostringsoffixedlength3[1,12,123,1234].map{|e|???}=>["001","012","123","234"]我找到了解决方案,但也许还有更聪明的方法。format('%03d',e)[-3..-1] 最佳答案 如何使用%1000而不是进行字符串操作来获取最后三位数字?[1,12,123,1234].map{|e|format('%03d',e%1000)}更新:根据theTinMan的

    随机推荐