使文本行具有相等的长度

2023-12-26

居中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 插件寡妇修复 http://matthewlein.com/widowfix/index.html防止单字行,但我正在寻找一些可以平衡的东西all多行元素中的行。有没有相关的 jQuery 插件,或者你能推荐一个策略吗?


我会只使用严格的 JavaScript 来解决这个问题,如下所示:

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

  • MAXCOUNT:(整数)每行计数的最大字符数
  • COUNT_SPACES:(布尔值)必须计算空格吗?
  • COUNT_PUNCTUATION:(布尔)标点符号必须计数吗?
  • EXACT:(布尔值)最后一个单词必须被删除吗?
  • 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/ http://jsfiddle.net/6rtdF/

    本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

    使文本行具有相等的长度 的相关文章

    • 使用 Angular 指令禁用文本选择

      我正在学习 JavaScript 和 AngularJS 我想使用 Angular Directive 禁用文本选择 我有该函数的 JavaScript 代码 function clearSelection if document sele
    • Instagram 粉丝计数 - 使用 jQuery / json 和 PHP

      经过几个小时的工作和一些帮助萨希尔 米塔尔我们已经成功使用 jQuery json 和 PHP 检索 Instagram 关注者计数 这是我们设法整理的内容 希望对其他想要获取 Instagram 信息的人有所帮助 我们的 jQuery I
    • nodejs (libuv) 事件循环是否在一个阶段(队列)中执行所有回调,然后再进入下一阶段或以循环方式运行?

      我正在研究 Node js 中 libuv 提供的事件循环 我遇到了关注 Deepal Jayasekara 的博客 https blog insiderattack net event loop and the big picture n
    • 从 HTTP 登录到 HTTPS

      我的网站默认使用 HTTP 我确实有一个启用 HTTPS 的证书 但只有其上的某些区域强制建立安全连接 登录是通过 Ajax 处理的 我想开始使用 SSL 即使请求来自 HTTP 我尝试强制请求的地址具有 HTTPS 并且它完美地回复 然而
    • 本地推送通知到在应用程序内运行 JS 代码的 Win8 Live Tile

      我正在尝试将更新发送到我的应用程序的磁贴 当应用程序运行时 这可以正常工作 例如 当用户单击按钮时 我可以轻松地将磁贴更新通知发送到磁贴 我无法解决的是当应用程序无法运行时如何更新磁贴 我找到的唯一选择是使用以下命令从远程 Web 服务器拉
    • IntersectionObserver是否支持水平滚动观察?

      我制作了几个垂直滚动 IntersectionObserver 模块 但我对水平滚动感兴趣 根将是 div 观察目标将是 img 我想观察当 img 放大但 div 保持视口宽度时的变化 我什至不确定移动 Safari 是否会将缩放后的图片
    • 按下回车键时不刷新页面

      我遇到了一些问题 只要表单中有输入 回车键就会触发页面刷新 下面的代码 如果按下回车并且文本区域 input 中没有输入任何文本 则不会刷新页面 但是如果按下回车并且 input中有输入或者光标位于文本区域 我不确定是什么触发了它 因为 s
    • javascript 选择自定义光标 (svg)

      我正在动态地将光标更改为悬停时的本地 svg element on mouseover function this css cursor url svgs pointer svg 9 30 auto 工作正常 但我想选择该 svg 来操纵其
    • JavaScript 继承;调用和原型

      要在Javascript中实现继承 通常需要执行以下两个步骤 假设我有一个基类 Animal var Animal function name this name name 我现在想从中派生一个子类 Dog 所以我想说 var Dog fu
    • JavaScript 中的 Promise 有什么意义?

      一个承诺是一个 可能现在可用 或将来可用 或永远不可用的值 来源 MDN 假设我有一个想要处理图片的应用程序 图片已加载 例如在算法在后台使用它之后 或某种其他类型的延迟 现在我想检查一下图片是否可以在future 通过使用承诺 而不是回调
    • 计算三次贝塞尔曲线的弧长、曲线长度。为什么不工作?

      我正在用这个算法计算弧长 三次贝塞尔曲线的长度 function getArcLength path var STEPS 1000 gt precision var t 1 STEPS var aX 0 var aY 0 var bX 0
    • 如何始终将焦点保持在文本框中

      我创建了一个包含两个 div 的 HTML 页面 左侧的 div 页面的 90 是 ajax 结果的目标 右侧的 div 页面的 10 包含一个文本框 该页面的想法是在文本框中输入零件编号 通过条形码扫描仪 并显示与该零件编号匹配的绘图 显
    • 如何计算特定字符在字符串中出现的次数

      我正在尝试创建一个函数来查看数组中的任何字符是否在字符串中 如果是 有多少个 我尝试计算每一种模式 但是太多了 我尝试使用 Python 中的 in 运算符的替代方案 但效果不佳 function calc fit element var
    • 使用 Google 日历源时如何禁用 FullCalendar 中的活动链接?

      我正在使用 FullCalendar 库从 Google 日历加载日历中的事件 不幸的是 事件添加到日历后 它们是可点击的 当您点击该活动时 您会自动重定向到 Google 日历页面以查看该特定活动 或者如果您有足够的访问权限 则可以直接对
    • 聆听 Angular 2 中的元素可见性

      我正在为我的网络应用程序使用 Bootstrap 和 Angular 2 v4 我想监听指令中的元素以了解可见性变化 我的元素有一个可以隐藏其子元素的父元素hidden sm up我需要在每次隐藏或显示时触发一个函数 div hidden
    • 用于选择特定 div 中具有特定类的锚元素的 jQuery 选择器是什么

      我有一些这样的代码 我想选择每个 a 带有类的标签status在 div 中foo div a class status a div 你可以这样做 foo find status a
    • 有没有办法使用 ko.observableArray 作为地图?

      有没有办法使用ko observableArray http knockoutjs com documentation observableArrays html像地图 字典一样 例如 var arr ko observableArray
    • 什么是 WKWebView 中的 WKErrorDomain 错误 4

      fatal error LPWebView encounters an error Error Domain WKErrorDomain Code 4 A JavaScript exception occurred UserInfo 0x7
    • Flot 库将 y 轴设置为最小值 0 和最大值 24

      如何将 y 轴设置在 0 到 24 的范围内 这是我的代码 j plot j placeholder d1 xaxis mode time min new Date 2010 11 01 getTime max new Date 2011
    • 将数组从 jquery ajax 传递到代码后面

      我必须将二维数组传递给在asp net网页代码后面编写的页面方法我有一个变量objList作为二维数组 我使用以下代码来实现此目的 但没有成功 并且未调用页面方法 脚本语言 function BindTable objList ajax u

    随机推荐