通过自定义指令实现展开收起;vue3自定义指令 可自行配置行数;TextEllipsis 文本省略自定义指令实现;cv走直接使用!一个可拓展性相当高的自定义指令!

v-fold-directive指令

一个可拓展性相当高的自定义指令!
v-fold-directive 自定义指令在vue3当中实现对长文本进行省略,支持展开/收起

预览效果 (样式均可自定义开发 更简单更快速!)

收起时样式:
收起时样式
展开时样式:
展开时样式

使用方式

 v-fold-directive 为自定义指令
 传参为行数 如果不传则默认是三行
<div v-fold-directive="{rows:3}">
	这是很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长的文字
</div>

JS部分代码(直接写入setup即可使用)

	// Vue3环境 直接写入setup当中 :
	const vFoldDirective = { 
	  mounted(el , dir ) {  
		// 获取当前DOM所占行数 除以行高 ( 务必设置行高否则可能导致报错 )
		const currentRow = parseInt(el.clientHeight/(getComputedStyle(el).lineHeight.slice(0,-3)) );   
		// 设置当多余n行时展示 展开
		const rows = dir?.value?.rows || 3;
		// 判断当前行是否需要显示展开按钮
		if(currentRow > rows){  
			// 为当前行添加溢出隐藏样式 
			el.classList.add('textEllipsis')
			el.setAttribute('style',`-webkit-line-clamp:${rows};--rows:${rows};--lineHeight:${getComputedStyle(el).lineHeight};--right:${getComputedStyle(el).paddingRight}`)
			// 创建一个展开收起的DOM
			let newDom = document.createElement('span') 
			let foldText = '... 展开'
			let unfoldText = '收起'
			newDom.innerHTML = foldText
			newDom.classList.add('windOrUn')
			newDom.style.color = '#4772A6'
			newDom.setAttribute('isUnfold','unfold') // 未展开状态
			newDom.addEventListener('click',(e)=>{
				// 阻止冒泡
				if(window.event){ 
					// ie 和 谷歌支持阻止冒泡
					window.event.cancelBubble = true; 
				} 
				else{ 
					// 火狐和谷歌支持的阻止冒泡
					e.preventDefault(); 
				}  
				if(e.target.getAttribute('isUnfold') == 'unfold'){
					e.target.setAttribute('isUnfold','fold')  
					e.target.innerHTML = unfoldText
					e.target.classList.remove('windOrUn') 
					
					el.classList.remove('textEllipsis')
				}else{
					e.target.setAttribute('isUnfold','unfold') 
					e.target.innerHTML = foldText
					e.target.classList.add('windOrUn')
					 
					el.classList.add('textEllipsis')
				}  
			})
			el.appendChild(newDom)
		}
	  }, 
	};

scss部分

 // 展开收起样式
.textEllipsis{
	 overflow: hidden;
	text-overflow: ellipsis;
	display: -webkit-box;
	word-wrap:break-word;
	word-break: break-all;
	white-space: normal;  
	-webkit-box-orient: vertical;
	position: relative;
	 .windOrUn{ 
		position: absolute;  
		top: calc(var(--lineHeight) * (var(--rows) - 1));
		height: var(--lineHeight);
		right: var(--right); 
		background: #fff;
		color: #4772A6; 
	 } 
}    

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Web_Lys

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值