当前位置: 代码网 > it编程>编程语言>Javascript > JavaScript实现多行文本溢出

JavaScript实现多行文本溢出

2024年05月18日 Javascript 我要评论
背景:ued给的设计稿要求。需要实现多行文本溢出省略号的样式。原以为是一个简单的小需求, 框框直接上手。代码如下<template><div class="name-wrap">

背景:ued给的设计稿要求。需要实现多行文本溢出省略号的样式。

原以为是一个简单的小需求, 框框直接上手。代码如下

<template>
<div class="name-wrap">
    <span class="tag bd">
         我是标签
    </span>hhhhhhhhhhhhhhhhhhhh
</div>
</template>
<style>
.tag {
    dispaly: inline-block;
}
.name-wrap {
    word-break: break-all;
    overflow: hidden;
    text-overflow: ellipsis;
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
}
</style>

一切看起来都是嘎嘎完美,虽然我知道这么写是有兼容问题的,但这个不是我这次关注的点。重点在于,我还有一个标签,在大部分手机下都能实现我想要的样式。但是在高版本的ios(iphone14、iphone15)下,他会默认成单行文本溢出省略号 。我了解到原因是-webkit-line-clamp属性的工作原则需要其容器是块级元素或至少表现得像一个块级元素。 所以我猜测,有没有可能在高版本的ios中,这个属性实现方式有所调整。

由于我需要的样式是类似文字环绕的效果,所以我无法直接给标签外的文字添加一个span标签来改变html结构。需要加上浮动效果才行。

总结就是我太菜了,所以我改用了一种比较原始的方法。用js去实现多行文本溢出省略+浮动去实现我想要的效果. 因此记录一下

<div class="name-wrap">
    <span class="tag bd">
         我是标签
    </span>
    <span class="text-ellipsis" :ref="setitemref">hhhhhhhhhhhhhhhhhhhh</span>    
</div>
<script lang="ts">
export default definecomponent({
    props: {
        show: boolean,
    },
    setup(props, ctx) {
        let showpopup = computed({
            get: () => props.show,
            set: (val: boolean) => ctx.emit("update:show", val),
        });

        const textelements = ref<htmlelement[]>([]);
        const setitemref = (el: any) => {
            if (el) {
                textelements.value.push(el);
            }
        };

        const applyellipsis = (element: htmlelement, maxlines: number) => {
            let text = element.innerhtml;
            const lineheight = parseint(window.getcomputedstyle(element).lineheight);
            const maxheight = lineheight * maxlines;

            // 不断减少文本直到其高度小于或等于最大允许高度
            while (element.scrollheight > maxheight) {
                text = text.slice(0, -1);
                element.innerhtml = text + '...';
            }
        }

        watch(() => showpopup.value, (val: boolean) => {
            if (val) {
                requestanimationframe(async () => {
                    await nexttick(); // 确保 dom 已更新
                    textelements.value.foreach((element) => {
                        applyellipsis(element, 2);
                    });
                });
            }
        })


        return {
            showpopup,
            setitemref,
        }
    },
});
</script>
<style>
.name-wrap {
    font-size: 14px;
    font-family: pingfangsc-regular, pingfang sc;
    font-weight: 400;
    color: #101112;
    line-height: 20px;
    flex: 1;
}
.tag {
    float: left;
}
.text-ellipsis {
    display: block;
    word-break: break-all;
}
</style>

到此这篇关于javascript实现多行文本溢出的文章就介绍到这了,更多相关javascript多行文本溢出内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com