You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

228 lines
4.5 KiB

2 months ago
<template>
<view class="t-wrap">
<view class="t-txt-hide" :id="hid" v-if="!isCompute" :style="[computeStyle(0)]">
{{testContent?testContent:content}}{{showSymbol?'...':''}}
<text v-if="(expandText || collapseText)&&rows>0"
class="t-button">
{{expandText}}
</text>
</view>
<view class="t-ellipsis" :id="id" :style="[!isCompute?computeStyle(1):computeStyle(2)]" @click="contentClick">
{{((!isCompute || expand)&&rows>0)?content:(actualContent+(showSymbol?'...':''))}}<text
v-if="(expandText || collapseText) && showSymbol" class="t-button" @click.stop="changeCollapse"
:style="{'color':actionFontColor,'float':'right'}">{{!expand?expandText:collapseText}}</text>
</view>
<!-- #ifdef H5 -->
<view v-if="!isCompute && rows>0" class="t-skeleton">
<view class="skeletons" v-for="(item,index) in rows">
<view class="empty"></view>
</view>
</view>
<!-- #endif -->
</view>
</template>
<script>
import {
init,
computeStyle,
compute
} from './kevy-ellipsis.min.js'
export default {
name: "kevy-ellipsis",
props: {
/**
* 文本内容默认''
*/
content: {
type: String,
default: ''
},
/**
* 字体大小单位rpx默认28
*/
fontSize: {
type: Number,
default: '28'
},
/**
* 字体颜色默认#666666
*/
fontColor: {
color: String,
default: '#666666'
},
fontWeight: {
color: String,
default: '400'
},
/**
* 收起操作的文案默认''
*/
collapseText: {
type: String,
default: ''
},
/**
* 展开操作的文案默认''
*/
expandText: {
type: String,
default: ''
},
/**
* 收起展开操作文字颜色默认'#007aff'
*/
actionFontColor: {
color: String,
default: '#007aff'
},
/**
* 展示行数默认1
*/
rows:{
type: [String,Number],
default: 1
},
},
data() {
return {
//是否展开
expand: false,
//是否已计算
isCompute: false,
//内容高度
h: undefined,
//内容宽度
w: undefined,
//实际显示内容
actualContent: '',
//高度探测内容
testContent: undefined,
//是否显示省略号
showSymbol: false,
//hid和id,唯一标识符
hid: 'hid' + Math.random().toString(36).substr(2),
id: 'id' + Math.random().toString(36).substr(2),
};
},
created(){},
mounted() {
if (this.content?.length > 0) {
// #ifdef H5
this.$nextTick(() => {
init(this, () => {
compute(this);
})
})
// #endif
// #ifdef MP-ALIPAY
init(this, () => {
compute(this, true);
}, true)
// #endif
// #ifndef MP-ALIPAY || H5
init(this, () => {
compute(this);
})
// #endif
}
},
computed: {
computeStyle
},
methods: {
//收起展开状态切换
changeCollapse() {
this.$emit('moreClick')
if(!this.collapseText) return;
this.expand = !this.expand;
},
//文本点击事件
contentClick() {
this.$emit('contentClick');
},
},
watch:{
isCompute:{
handler(newval){
console.log(newval,'newval')
},
immediate: true,
deep: true
}
}
}
</script>
<style lang="scss" scoped>
.t-wrap {
// width: var(--width);
width:100%;
box-sizing: border-box;
position: relative;
}
.t-txt-hide {
word-break: break-word;
position: absolute;
top: 999999px;
left: 999999px;
z-index: -1000;
top: 0rpx;
width: 100%;
margin: 0rpx;
text-align: justify;
}
.t-ellipsis {
text-align: end;
box-sizing: border-box;
width: 100%;
word-break: break-word;
position: relative;
left: 99999px;
}
.t-skeleton{
width: 100%;
height: 100%;
box-sizing: border-box;
position: absolute;
top: 0rpx;
left: 0rpx;
}
.skeletons:first-child{
margin-top: 0rpx !important;
}
.skeletons {
position: relative;
display: block;
overflow: hidden;
width: 100%;
height: 32rpx;
margin-top: 12rpx;
background-color: rgba(0, 0, 0, 0.06);
box-sizing: border-box;
}
// .skeletons .empty {
// display: block;
// position: absolute;
// width: 100%;
// height: 100%;
// -webkit-transform: translateX(-100%);
// transform: translateX(-100%);
// background: linear-gradient(90deg, transparent, rgba(216, 216, 216, 0.753), transparent);
// -webkit-animation: loading .8s infinite;
// animation: loading .8s infinite;
// }
// @keyframes loading {
// 100% {
// -webkit-transform: translateX(100%);
// transform: translateX(100%);
// }
// }
</style>