優(yōu)雅的使用Js或CSS處理文本的截?cái)嗯c展示

歡迎訪問我的博客券犁,一起交流學(xué)習(xí)术健,共同進(jìn)步。

之前遇見一個(gè)問題粘衬,就是處理文本截?cái)嘬窆溃缓罂梢允謩?dòng)切換文本是全展示和手動(dòng)展示,因?yàn)檫@個(gè)問題比較常見稚新,而且其實(shí)現(xiàn)方式有多種勘伺,于是決定總結(jié)一下,與讀者分享枷莉。

前言

首先娇昙,我們看這樣一個(gè)場景:

展開更多

其html 結(jié)構(gòu)如下:


    <p class="text-slice">
        鄭成月的經(jīng)歷就是一部中國社會(huì)歷史!很有價(jià)值的笤妙!不管是社會(huì)研究還是真心糾錯(cuò)冒掌,都是非常好的案例噪裕。歷史就是用各種個(gè)人經(jīng)歷寫成的,那樣就很有實(shí)在感股毫。作家們沒有素材膳音?都在書寫歌功頌德之文?想要把自己的作品流傳后世铃诬,這就是最好的素材
    </p>
    <label class="expand-more">更多</label>

樣式如下:


    .text-slice {
        display: -webkit-box;
        -webkit-box-orient: vertical;
        -webkit-line-clamp: 3;
        overflow: hidden;
        text-overflow: ellipsis;
    }

如圖祭陷,我們對文字默認(rèn)展示內(nèi)容有限制:限制默認(rèn)最多顯示三行,未超出三行時(shí)不需要展示更多按鈕趣席;超出內(nèi)容被截?cái)鄷r(shí)兵志,可以點(diǎn)擊更多,展示全部內(nèi)容宣肚,此時(shí)更多文字變成取消想罕,再次點(diǎn)擊的時(shí)候文字收起。

實(shí)現(xiàn)上述功能霉涨,常見的是使用JavaScript按价,本文將介紹使用JavaScript和CSS共三種方式實(shí)現(xiàn):

  • Js實(shí)現(xiàn)
  • CSS :target偽類 實(shí)現(xiàn)
  • CSS :checked偽類 + ~(臨近兄弟節(jié)點(diǎn)選擇符)實(shí)現(xiàn)

Js實(shí)現(xiàn)

先從最常見的Js實(shí)現(xiàn),通常我們綁定點(diǎn)擊事件實(shí)現(xiàn)切換文本截?cái)嗯c展示全部:

點(diǎn)擊查看效果


    <script>
        $(function() {
            var $para = $('.content');
            var $more = $('.expand-more');
            $more.on('click', function() {
                $para.toggleClass('text-slice');
                if ($para.hasClass('text-slice')) {
                    $more.html('更多');
                } else {
                    $more.html('收起');
                }
            });
        });
    </script>

如上笙瑟,給按鈕綁定點(diǎn)擊事件楼镐,在事件回調(diào)中為文本切換實(shí)現(xiàn)截?cái)鄻邮降念惷⑼瑫r(shí)修改按鈕文字往枷,很簡單框产。

但是,到目前為止我們應(yīng)該發(fā)現(xiàn)一個(gè)問題吧师溅,假如文本內(nèi)容少于三行或者剛好三行茅信,我們怎么判斷是否需要展示切換按鈕呢盾舌?

思考墓臭。。妖谴。窿锉。。膝舅。

要判斷文本是否發(fā)生截?cái)辔嗽兀趺刺幚砟兀?br> 計(jì)算字?jǐn)?shù)肯定不可行,因?yàn)樯婕暗讲煌謾C(jī)仍稀,不同瀏覽器洼滚,不同字符,會(huì)有差異技潘;
計(jì)算高度遥巴,比較展示全部和添加截?cái)鄷r(shí)的高度值是否相等千康,相等時(shí),說明不會(huì)截?cái)嗖徊幌嗟葎t說明發(fā)生截?cái)唷?/p>

判斷文本是否截?cái)?/h2>

我們不能直接使用該段落元素做判斷拾弃,用戶體驗(yàn)很不好,我們可以添加一個(gè)輔助段落元素:


    <p class="fake-content text-slice">
        鄭成月的經(jīng)歷就是一部中國社會(huì)歷史摆霉!很有價(jià)值的豪椿!不管是社會(huì)研究還是真心糾錯(cuò),都是非常好的案例携栋。歷史就是用各種個(gè)人經(jīng)歷寫成的搭盾,那樣就很有實(shí)在感。作家們沒有素材婉支?都在書寫歌功頌德之文增蹭?想要把自己的作品流傳后世,這就是最好的素材
    </p>

樣式如下:


    .fake-content {
        position: absolute;
        z-index: -1; /* 隱藏 */
        opacity: 0; /* 透明 */
        pointer-events: none; /*元素不可交互/點(diǎn)擊*/
    }

然后比較此元素在設(shè)置截?cái)鄻邮胶筒辉O(shè)置截?cái)鄻邮綍r(shí)高度磅摹,相等即不會(huì)發(fā)生截?cái)嘧搪酰幌嗟燃窗l(fā)生截?cái)啵?/p>


    // 文本是否發(fā)生截?cái)?    function hasTextSliced($ele) {
        var initHeight = $ele.height();
        var height;
        $ele.removeClass('text-slice'); // 刪除截?cái)鄻邮?        height = $ele.height();
        
        if (initHeight < height) {
            // 發(fā)生截?cái)?            return true;
        }
        
        return false;
    }

如上,在刪除截?cái)鄻邮胶蠡模舾叨茸兇蟊樱瑒t說明發(fā)生文本截?cái)啵駝t不發(fā)生截?cái)唷?/p>

CSS實(shí)現(xiàn)

CSS可以有兩種方式實(shí)現(xiàn):

  • :target偽類 實(shí)現(xiàn)
  • :checked偽類 + ~(臨近兄弟節(jié)點(diǎn)選擇符)實(shí)現(xiàn)

點(diǎn)擊查看實(shí)例

:target偽類

我們知道HTML中帝美,a鏈接可以設(shè)置錨點(diǎn)碍彭,點(diǎn)擊后該錨點(diǎn)可以使用:target偽類選擇獲取,于是可以為其設(shè)置文字不截?cái)鄻邮剑?/p>


    #content:target {
        overflow: auto;
        display: block;
    }

其html結(jié)構(gòu)如下:


    <p class="content text-slice" id="content">
        ...        
    </p>
    <p class="fake-content text-slice">
        ...
    </p>
    <a class="expand-more" href="#content">更多</a>

:checked偽類 + ~選擇符

此種方式原理是悼潭,選擇框可以使用CSS偽類:checked獲取庇忌,然后通過~選擇符給元素設(shè)置樣式不截?cái)辔谋荆?/p>


    #expand-check:checked ~ .content {
        overflow: auto;
        display: block;
    }

html結(jié)構(gòu)如:


    <input type="checkbox" id="expand-check" style="display: none;pointer-events: none;">
    <p class="content text-slice">
        ...
    </p>
    <p class="fake-content-2 text-slice">
        ...
    </p>
    <label class="expand-more" for="expand-check">更多</label>

如上,通過在文本前面添加一個(gè)隱藏的·<input type="checkbox">元素舰褪,在更多按鈕中使用label的for屬性皆疹,通過設(shè)置<label class="expand-more" for="expand-check">使其點(diǎn)擊時(shí)可以改變前面添加的選擇框元素的checked狀態(tài),從而實(shí)現(xiàn)切換效果占拍。

總結(jié)

不同的方式都能實(shí)現(xiàn)效果略就,那什么情況適合使用哪一種呢,現(xiàn)進(jìn)行比較:

  • 對比Js和CSS方式晃酒,Js實(shí)現(xiàn)可配置性表牢,操作性強(qiáng),而CSS實(shí)現(xiàn)有一定限制贝次,無法在切換展示的同時(shí)進(jìn)行其他Js處理崔兴;但是CSS實(shí)現(xiàn)更穩(wěn)定,高效,代碼敲茄,出錯(cuò)性小螺戳,js錯(cuò)誤不影響此功能,在內(nèi)容展示型頁面適合使用折汞。
  • 對比:target偽類和:checked偽類倔幼,前者代碼量少,不需要添加額外元素爽待,但是我們知道錨點(diǎn)點(diǎn)擊時(shí)损同,頁面是會(huì)滾動(dòng)錨點(diǎn)元素到當(dāng)前頁面頂部的,這不適合長頁面鸟款。
  • :checked偽類方式需要為每一個(gè)需要切換展示的段落都添加額外輔助元素膏燃,因此不適于在長列表中使用,如評論列表何什,新聞簡介列表頁组哩。

本篇中實(shí)例詳細(xì)代碼參考https://github.com/codingplayboy/web_demo/tree/master/smallcase/expand_more

此篇關(guān)于文本截?cái)嗲袚Q展示的總結(jié),主要出于學(xué)習(xí)與實(shí)用的目的处渣,若喜歡請點(diǎn)贊伶贰,文筆水平有限,望包含罐栈。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末黍衙,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子荠诬,更是在濱河造成了極大的恐慌琅翻,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柑贞,死亡現(xiàn)場離奇詭異方椎,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)钧嘶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進(jìn)店門棠众,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人康辑,你說我怎么就攤上這事摄欲。” “怎么了疮薇?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長我注。 經(jīng)常有香客問我按咒,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任励七,我火速辦了婚禮智袭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘掠抬。我一直安慰自己吼野,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布两波。 她就那樣靜靜地躺著瞳步,像睡著了一般。 火紅的嫁衣襯著肌膚如雪腰奋。 梳的紋絲不亂的頭發(fā)上单起,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天,我揣著相機(jī)與錄音劣坊,去河邊找鬼嘀倒。 笑死,一個(gè)胖子當(dāng)著我的面吹牛局冰,可吹牛的內(nèi)容都是我干的测蘑。 我是一名探鬼主播,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼康二,長吁一口氣:“原來是場噩夢啊……” “哼帮寻!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起赠摇,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤固逗,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后藕帜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體烫罩,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年洽故,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了贝攒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,861評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡时甚,死狀恐怖隘弊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情荒适,我是刑警寧澤梨熙,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站刀诬,受9級特大地震影響咽扇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一质欲、第九天 我趴在偏房一處隱蔽的房頂上張望树埠。 院中可真熱鬧,春花似錦嘶伟、人聲如沸怎憋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绊袋。三九已至,卻和暖如春耽装,著一層夾襖步出監(jiān)牢的瞬間愤炸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工掉奄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留规个,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓姓建,卻偏偏與公主長得像诞仓,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子速兔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案墅拭? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,761評論 1 92
  • 本文轉(zhuǎn)載自:眾成翻譯譯者:為之漫筆鏈接:http://www.zcfy.cc/article/239原文:http...
    極樂君閱讀 7,380評論 1 62
  • 轉(zhuǎn)載請聲明 原文鏈接地址 關(guān)注公眾號(hào)獲取更多資訊 第一部分 HTML 第一章 職業(yè)規(guī)劃和前景 職業(yè)方向規(guī)劃定位...
    程序員poetry閱讀 16,562評論 32 459
  • 1、早起:本周早起堅(jiān)持的異常糟糕涣狗,打卡也時(shí)常忘記谍婉。好不容易脫開了倆娃,竟然有種睡也睡不醒的狀態(tài)镀钓,似乎一下打開了瞌睡...
    溫暖的微笑00閱讀 151評論 0 1
  • 今天穗熬,股市是一個(gè)世界性的話題,它被許多事情影響和刺激著丁溅,其中之一就是一些非投資者正在盡力成為投資者唤蔗。 ...
    大臉櫻木閱讀 169評論 0 1