美文网首页
js实现多行文本省略

js实现多行文本省略

作者: mapleLeaf_X | 来源:发表于2019-03-01 15:22 被阅读0次

单行文本省略

效果图:


css单行省略.png
// css里设置
<style type="text/css">
    元素 {
        overflow: hidden;
        text-overflow:ellipsis;
        white-space: nowrap;
            width: 400px;
    }
</style>

css实现多行文本省略

效果图:


css多行省略.png
// css里设置
<style type="text/css">
    元素 {
        display: -webkit-box;
        -webkit-box-orient: vertical;
        -webkit-line-clamp: 2;
        overflow: hidden;
        width: 400px;
    }
</style>

因为webkitLineClamp目前只对google,firefox浏览器支持,使得其他的浏览器无法进行css多行文本样式的省略。于是想用js来实现这个效果。


js实现多行文本省略

1、给需要省略的标签添加类名:mapleTextareaOverFlow和行数:rows;
2、判断是否有webkitLineClamp属性,有的话直接添加css样式省略;没有则进行计算;
3、超过行数则省略,不超过则不管;


效果图:

html

<body>
    <p class="mapleTextareaOverFlow" rows='1'>
        人生不如意常十八九,要让自己快乐,就必须给自己减压,减压的好方法就是学会忘记,人生需要能拿得起,有时候放得下更重要。
    </p>
    <p class="mapleTextareaOverFlow" rows='2'>
        人生不如意常十八九,要让自己快乐,就必须给自己减压,减压的好方法就是学会忘记,人生需要能拿得起,有时候放得下更重要。
    </p>
    <p class="mapleTextareaOverFlow" rows='3'>
        人生不如意常十八九,要让自己快乐,就必须给自己减压,减压的好方法就是学会忘记,人生需要能拿得起,有时候放得下更重要。
    </p>
</body>

js的实现

// 获取需要设置多行省略的标签
const elBoxs = document.getElementsByClassName('mapleTextareaOverFlow');
const elBoxsLength = elBoxs.length;

// 没有使用forEach(有些浏览器不兼容)和map(标签数组不能使用map的方法)
for(let i = 0; i < elBoxsLength; i += 1) {
    const el = elBoxs[i];
        let text = el.innerHTML;
        // 需要在第几行省略,是否支持webkitLineClamp属性
        let options = {
        rows: parseInt(el.getAttribute('rows')),
        isSupportlineCamp: `${el.style.webkitLineClamp}` !== 'undefined',
    };

    // 设置需要省略的属性及字体的两端对齐的样式
    el.style.overflow = 'hidden';
    el.style.textOverflow = 'ellipsis';
    el.style.wordBreak = 'break-all';
    el.style.wordWrap = 'break-word';
    el.style.textAlign = 'justify';

         // 支持webkitLineClamp的话直接使用浏览器css样式设置省略号(safari不是很支持,可以直接使用js计算方式),否则通过计算方式
    if(options.isSupportlineCamp) {
        el.style.webkitLineClamp = options.rows;
        el.style.display = '-webkit-box';
        el.style.webkitBoxOrient = 'vertical';
    } else {
        const heightStr = getCurrentStyle(el, 'height');
        const height = getNumber(heightStr);
        const maxHeight = getMaxHeight(el, options.rows, text);
        if(height > maxHeight) {
            subStrChar(el, maxHeight, text);
        } else {
            el.innerHTML = text;
        }
    }
};

// 截取字符串,从第一个开始,当前高度大于最大高度时,截取到前一个字符;
function subStrChar(el, maxHeight, text) {
    console.log(maxHeight);
    let end = false;
    let i = 0;
    while(!end) {
        i++;
        el.innerHTML = text.substring(0, i) + '...';
        const currentHeightStr = getCurrentStyle(el, 'height');
        const currentHeight = getNumber(currentHeightStr);
        if(currentHeight > maxHeight) {
            el.innerHTML = text.substring(0, i - 1) + '...';
            end = true;
        }
        if(i >= text.length) {
            break;
        }
    }
}

// 获取最大高度,当line-height为normal的时候,对标签塞入字符,获取一行的行高
function getMaxHeight(el, rows, text) {
    const lineHeight = getCurrentStyle(el, 'lineHeight');
    let number = 0;

    if(lineHeight === 'normal') {
        let index = 0;
        do {
            el.innerHTML = text[index++];
        } while(!getNumber(getCurrentStyle(el, 'height')));
        number = getNumber(getCurrentStyle(el, 'height'));
    } else {
        number = getNumber(lineHeight);
    }

    return number * rows;
}

// 获取当前元素的属性值
function getCurrentStyle(el, elAttr) {
        // getComputedStyle获取元素的所有CSS属性的值
    return window.getComputedStyle(el)[elAttr]
}

// 将获取的字符串值变成向上取整成数字
function getNumber(str) {
    let number = parseFloat(str);
    return Math.ceil(number)
}

完整代码戳这里

相关文章

网友评论

      本文标题:js实现多行文本省略

      本文链接:https://www.haomeiwen.com/subject/mzsduqtx.html