通过自定义指令实现展开收起;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; 
	 } 
}    

猜你喜欢

转载自blog.csdn.net/lys20000913/article/details/130990830