您的位置: 翼速应用 > 业内知识 > web前端 > 正文

Html文本截断

20200530-9.png

文本截断

网页在显示长文本信息时,由于文本过长,常常需要对长文本进行截断,并且显示省略号,达到页面信息展示和美观的双重效果。

HTML结构如下:

<p class="text-slice">
    郑成月的经历就是一部中国社会历史!很有价值的!不管是社会研究还是真心纠错,都是非常好的案例。历史就是用各种个人经历写成的,那样就很有实在感。作家们没有素材?都在书写歌功颂德之文?想要把自己的作品流传后世,这就是最好的素材
</p>
<label class="expand-more">更多</label>

CSS样式如下:

.text-slice {
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 3;
    overflow: hidden;
    text-overflow: ellipsis;
}

Hint: -webkit-line-clamp CSS 属性 可以把块容器中的内容限制为指定的行数

实现效果如下:

123.png

此时,还需要点击“更多”出现完整文本的效果。有三种解决方案:

  • JavaScript方法

  • CSS: :target伪类

  • CSS::checked伪类 和 ~选择符

JavaScript方法

HTML结构修改:

<p class="content text-slice"> <!-- 新增 content 类 -->
    郑成月的经历就是一部中国社会历史!很有价值的!不管是社会研究还是真心纠错,都是非常好的案例。历史就是用各种个人经历写成的,那样就很有实在感。作家们没有素材?都在书写歌功颂德之文?想要把自己的作品流传后世,这就是最好的素材
</p>
<label class="expand-more">更多</label>

JavaScript逻辑:

$(function() {
    var $para = $('.content');
    var $more = $('.expand-more');
    $more.on('click', function() {
        $para.toggleClass('text-slice');
        if ($para.hasClass('text-slice')) {
            $more.html('更多');
        } else {
            $more.html('收起');
        }
    });
});

上面代码存在的问题是,在文本行数小于等于三行时,不显示“更多”和“收起”。可以想到两种解决方法:

  • 计算文本字数,根据字数来判断是否需要显示“更多”和“收起”。

  • 计算文本所在元素的高度,比较完整文本和截断文本的所在元素高度,若相等,则没有截断,否则,发生截断

其实,第一种解决方案是行不通的,因为涉及到不同的手机、不同的字符或者不同的浏览器,都会存在差异,难免会出现这样那样的问题。所以最好采用第二种方法。

改进

通过新增一个隐藏的class类,使用JavaScript对该类进行高度验证,如果在移除text-slice类后高度发生变化,说明存在文本截断。

HTML结构修改:

<p class="fake-content text-slice"> <!-- 新增 fake-content 类 -->
    郑成月的经历就是一部中国社会历史!很有价值的!不管是社会研究还是真心纠错,都是非常好的案例。历史就是用各种个人经历写成的,那样就很有实在感。作家们没有素材?都在书写歌功颂德之文?想要把自己的作品流传后世,这就是最好的素材
</p>
<label class="expand-more">更多</label>

新增CSS样式:

.fake-content {
    position: absolute;
    z-index: -1; /* 隐藏 */
    opacity: 0; /* 透明 */
    pointer-events: none; /*元素不可交互/点击*/
}

JavaScript逻辑修改:

// 文本是否发生截断
function hasTextSliced($ele) {
    var initHeight = $ele.height();
    var height;
    $ele.removeClass('text-slice');
    height = $ele.height();

    if (initHeight < height) {
        // 发生截断
        return true;
    }

    return false;
}

CSS: :target伪类

借用锚点来实现功能,a元素可以设置锚点,:target伪类又可以实时捕获锚点,具体见实现代码:

HTML结构:

<p class="content text-slice" id="content">
    ...        
</p>
<p class="fake-content text-slice">
    ...
</p>
<a class="expand-more" href="#content">更多</a>

CSS样式:

.text-slice {
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 3;
    overflow: hidden;
    text-overflow: ellipsis;
}
#content:target {
    overflow: auto;
    display: block;
}

CSS::checked伪类 和 ~选择符

借用隐藏的选择框实现功能,label标签可以绑定到选择框元素上,当点击label标签,隐藏的选择框被选中,触发:checked伪类对应的样式,实现文本完整展现。

HTML结构:

<input type="checkbox" id="expand-check" style="display: none;pointer-events: none;">
<p class="content text-slice">
    ...
</p>
<p class="fake-content-2 text-slice">
    ...
</p>
<label class="expand-more" for="expand-check">更多</label>

CSS样式:

.text-slice {
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 3;
    overflow: hidden;
    text-overflow: ellipsis;
}
#expand-check:checked ~ .content {
    overflow: auto;
    display: block;
}

总结

JavaScript VS CSS

对比项 JavaScript CSS
可配置性
操作性
稳定 较弱 较强
高效 较弱 较强

:target伪类 VS :checked伪类

对比项 :target伪类 :checked伪类
操作性 较强 较弱
缺点 不适用长文本(点击锚点出现页面滚动) 不适合长列表(添加大量隐藏辅助元素)


我来说两句

0 条评论

推荐阅读

  • 响应式布局CSS媒体查询设备像素比介绍

    构建响应式网站布局最常见的是流体网格,灵活调整大小的站点布局技术,确保用户在使用的幕上获得完整的体验。响应式设计如何展示富媒体图像,可以通过以下几种方法。

    admin
  • 提升网站的性能快速加载的实用技巧

    网站速度很重要,快速加载的网站会带来更好的用户体验、更高的转化率、更多的参与度,而且在搜索引擎排名中也扮演重要角色,做SEO,网站硬件是起跑线,如果输在了起跑线,又怎么跟同行竞争。有许多方法可提升网站的性能,有一些技巧可以避免踩坑。

    admin
  • 织梦CMS TAG页找不到标签和实现彩色标签解决方法

    织梦cms是我们常见的网站程序系统的一款,在TAG标签中常常遇到的问题也很多。当我们点击 tags.php 页的某个标签的时候,有时会提示:“系统无此标签,可 能已经移除!” 但是我们检查程序后台,以及前台显示页面。这个标签确实存在,如果解决这个问题那?

    admin
  • HTML关于fieldset标签主要的作用

    在前端开发html页面中常用的标签很多,今天为大家带来的是关于HTML中fieldset标签主要的作用说明,根据技术分析HTML

    admin

精选专题