vue?指令版富文本溢出省略截取示例詳解
一、需求描述
文本溢出省略,說實話這些年也實踐過很多了,這次是針對富文本字符串,思量想去,也曾試圖了解一些知名站點的實現(xiàn)方案,但結(jié)果不甚理想。
今天記錄的這一版也并不完美,好在也能勉強(qiáng)解決問題。
大體需求就是:針對富文本字符串,即 html 字符串,實現(xiàn)文本溢出省略,并使用... + 【查看全文】結(jié)尾。
需求重點分析:
① 針對的是富文本字符串,html 字符串,所以需要特別處理掉 img、input、video、內(nèi)聯(lián)樣式 等內(nèi)容。但不能去除全部html標(biāo)簽,因為會有對檢索關(guān)鍵字標(biāo)紅的需求。
②需要實現(xiàn)溢出省略并使用... 和 【查看全文】結(jié)尾
③需要考慮兼容IE(IE退役了,但是能決定要兼容IE的人還在...)
④需要考慮單個中英文所占寬度的區(qū)別,也就是當(dāng)內(nèi)容是全英文的時候,溢出省略效果應(yīng)當(dāng)和中文差不多,看起來比較和諧。
⑤能跟隨寬度的響應(yīng)式變化而變化,省略效果最好保持一致。
二、實現(xiàn)思路
2.1 正則表達(dá)式過濾 img、video等標(biāo)簽
利用正則過濾 img、video等標(biāo)簽。如果不過濾,在列表首頁這樣的概覽場景,會顯得很奇怪,圖片之類的內(nèi)容應(yīng)當(dāng)去詳情或全文這樣的細(xì)覽場景中查看。
let text = el.innerHTML; // // 富文本內(nèi)容即是html字符串 // console.log("去除圖片img標(biāo)簽前:", text); // 過濾掉字符串中的 img 標(biāo)簽 let imgReg = /<(img|input|br|hr|p|video)[^>]*>/gi; // 匹配圖片中的img、input等標(biāo)簽 // let arr = text.match(imgReg); // 篩選出所有的img text = text.replaceAll(imgReg, ""); // replaceAll 替換符合條件的內(nèi)容為空串 // console.log("去除圖片img標(biāo)簽后:", text);
2.2 截取固定長度的字符數(shù)
對內(nèi)容截取固定長度的字符數(shù)。截取固定字符數(shù),顯然是有弊端的文本溢出省略方案,因為無法良好的跟隨寬度變化而變化。
盡管我們自己可以通過一些操作通過監(jiān)聽寬度范圍而指示截取對應(yīng)合適的長度,但這顯然沒有-webkit-box,-webkit-line-clamp的處理方式來得方便。但是很遺憾,兼容IE成為了攔路虎。所以,暫時還是選擇了截取固定字符數(shù)來處理文本溢出省略。
let text = el.innerHTML; // 富文本內(nèi)容即是html字符串 if (text.length > num) { let numNew = num; const subText = text.substr(0, num); el.innerHTML = text.substr(0, numNew - 3) + "..."; } else { el.innerHTML = text; // 因為 text 可能被改變,例如被除去了img標(biāo)簽,所以需要重新賦值 }
2.3 考慮小寫英文字符和數(shù)字寬度問題
因為會有全文英文的場景,所以得考慮相同字符數(shù),小寫字母和數(shù)字的寬度占比是比中文小的的問題。為此,決定為給全英文的文本,增加顯示的字符數(shù),以求全英文和全中文場景的文本溢出省略效果基本一致,看起來自然和諧一些。
這主要是通過正則表達(dá)式,統(tǒng)計小寫英文字母和數(shù)字在文本中的占比,來考慮適當(dāng)增加顯示的字符數(shù)。
let text = el.innerHTML; // 富文本內(nèi)容即是html字符串 if (text.length > num) { let numNew = num; const subText = text.substr(0, num); const n = subText.match(/[0-9]/g) || []; // 統(tǒng)計數(shù)字 const e = subText.match(/[a-z]/g) || []; // 統(tǒng)計小寫字母 // 小寫英文字母數(shù)字占字符串的70%以上,截取長度增加:主要考慮全英文場景頁面占寬問題 if (n.length + e.length > 0.7 * num) { numNew = num + (n.length + e.length); } el.innerHTML = text.substr(0, numNew - 3) + "..."; } else { el.innerHTML = text; // 因為 text 可能被改變,例如被除去了img標(biāo)簽 }
2.4 注冊為全局指令
因為是 Vue 項目,干脆就注冊為全局指令算了。這樣使用起來也方便些。為了方便指定顯示的字符數(shù),設(shè)置了支持自定義數(shù)量的 num 屬性。
下面是完整的文本溢出省略函數(shù),注冊為vue 全局指令的內(nèi)容。
// directives.js 全局指令文件
import Vue from "vue"; /** * 文本溢出截取,截取指定長度字符串,超出指定長度省略并展示...,未超出則不處理。 * 弊端:對寬度響應(yīng)式變化的頁面展示效果不友好。 * * @param el 指令作用的元素 * @param binding 綁定的內(nèi)容 binding.value.num 是指定要截取的字符串長度。 */ function overflowSubstr(el, binding) { Vue.nextTick(() => { // console.log(binding.value); const num = binding.value.num || 120; let text = el.innerHTML; // console.log("去除圖片img標(biāo)簽前:", text); // 過濾掉字符串中的 img 標(biāo)簽 let imgReg = /<(img|input|br|hr|p|video)[^>]*>/gi; // 匹配圖片中的img、input等標(biāo)簽 // let arr = text.match(imgReg); // 篩選出所有的img text = text.replaceAll(imgReg, ""); // console.log("去除圖片img標(biāo)簽后:", text); // 設(shè)置溢出隱藏(overflow = "hidden") // 將末尾的三個文字用...取代 if (!text) return; el.style.overflow = "hidden"; if (text.length > num) { let numNew = num; const subText = text.substr(0, num); const n = subText.match(/[0-9]/g) || []; // 統(tǒng)計數(shù)字 const e = subText.match(/[a-z]/g) || []; // 統(tǒng)計小寫字母 // 小寫英文字母數(shù)字占字符串的70%以上,截取長度增加:主要考慮全英文場景頁面占寬問題 if (n.length + e.length > 0.7 * num) { numNew = num + (n.length + e.length); } el.innerHTML = text.substr(0, numNew - 3) + "..."; } else { el.innerHTML = text; // 因為 text 可能被改變,例如被除去了img標(biāo)簽 } }); } // 文本溢出省略指令 Vue.directive("overflowSubstr", overflowSubstr);
directives.js 在入口文件 main.js 引入,即可使全局指令生效。
自定義指令 v-overflow-substr 的使用,類似常規(guī)指令的使用,例如下面這樣:
<div v-overflow-substr="{ num: num }" v-html="item.content" ></div>
2.5 文本尾部添加【查看全文】或【收起】
這個需求點的大致思路是,在尾部添加一個span標(biāo)簽,用以顯示 "收起" 或 "查看全文"。 因為要單獨控制每一條數(shù)據(jù)的展開收齊,所以需要給每條數(shù)據(jù)增加一個是否展示全部的字段 showAll,用以進(jìn)行展開或收齊操作。
需要注意的一點是,展開的時候展示的是完整的內(nèi)容,就是說可能包含圖片視頻的完整文本,因此要注意切換文本內(nèi)容。 下面是部分關(guān)鍵代碼。
<span v-if="item.content && item.content.length > num" @click="checkAll(item)" class="all-btn" > {{ item.showAll ? "收起" : "查看全文" }} <i :class="{ 'el-icon-arrow-down': !item.showAll, 'el-icon-arrow-up': item.showAll, }" ></i> </span>
三、效果
以上就是vue 指令版富文本溢出省略截取示例詳解的詳細(xì)內(nèi)容,更多關(guān)于vue 指令富文本溢出截取的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
想到頭禿也想不到的Vue3復(fù)用組件還可以這么hack的用法
這篇文章主要為大家介紹了想到頭禿也想不到的Vue3復(fù)用組件還可以這么hack的用法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04vue3+electron12+dll開發(fā)客戶端配置詳解
本文將結(jié)合實例代碼,介紹vue3+electron12+dll客戶端配置,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-06-06antd?Vue實現(xiàn)Login登錄頁面布局案例詳解?附帶驗證碼驗證功能
這篇文章主要介紹了antd?Vue實現(xiàn)Login登錄頁面布局案例詳解附帶驗證碼驗證功能,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-05-05vue實現(xiàn)錨點跳轉(zhuǎn)之scrollIntoView()方法詳解
這篇文章主要介紹了vue實現(xiàn)錨點跳轉(zhuǎn)之scrollIntoView()方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-09-09Vue+better-scroll 實現(xiàn)通訊錄字母索引的示例代碼
通訊錄字母索引是常用的一種功能,本文主要介紹了Vue+better-scroll 實現(xiàn)通訊錄字母索引,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06vue-print-nb實現(xiàn)頁面打印功能實例(含分頁打印)
在項目中,有時需要打印頁面的表格,在網(wǎng)上找了一個打印組件vue-print-nb,用了還不錯,所以下面這篇文章主要給大家介紹了關(guān)于vue-print-nb實現(xiàn)頁面打印功能的相關(guān)資料,需要的朋友可以參考下2022-08-08分享12個Vue開發(fā)中的性能優(yōu)化小技巧(實用!)
一般來說,你不需要太關(guān)心vue的運(yùn)行時性能,它在運(yùn)行時非常快,但付出的代價是初始化時相對較慢,下面這篇文章主要給大家分享介紹了十二個Vue開發(fā)中的性能優(yōu)化小技巧,需要的朋友可以參考下2022-02-02每天學(xué)點Vue源碼之vm.$mount掛載函數(shù)
這篇文章主要介紹了vm.$mount掛載函數(shù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03