利用css實現(xiàn)癌压,多行文字顯示指定行,且展開收起支持動畫

由《CSS世界》中利用max-height屬性結(jié)合checkbox標簽得到的啟發(fā)

先說明荆陆,該方案本身就不支持顯示指定行滩届,但它對我后面實現(xiàn)該功能提供了方向,所以先帶大家看看張鑫旭大神是如何實現(xiàn) 僅利用CSS實現(xiàn)隱藏多余內(nèi)容被啼,且展開收起支持動畫 的吧

html代碼:

    <div class="box">
        <input type="checkbox" id="showMoreOrLess">
        <p class="content">該方案是摘抄自張鑫旭--《CSS世界》其具體實現(xiàn)是:將多余的文案放入另一個容器(more-content)中帜消,</p>
        <p class="more-content">
            在初始化的時候,more-content設(shè)置max-height: 0; overflow: hidden; transition: max-height .3s;
            點擊展開時浓体,再配合checkbox的checked屬性泡挺,more-content設(shè)置max-height: /*一個足夠大的最大高度值*/
        </p>
        <label for="showMoreOrLess" class="show-more">展開</label>
        <label for="showMoreOrLess" class="show-less">收起</label>
    </div>

class="more-content"<p>標簽里面放的就是初始要隱藏的內(nèi)容,可以看到命浴,這里是需要將要隱藏的內(nèi)容和初始要展示的內(nèi)容分在兩個容器中放置的娄猫,我想這不是一個理想的方案,但是這不影響我們學習它生闲,后面我會嘗試給出更好的方案媳溺。
checkbox用在這里是很巧妙的,CSS可以通過:checked屬性處理當checkbox被勾選時的特定樣式碍讯,這里當checkbox被勾選時悬蔽,代表“展開”,取消勾選時捉兴,代表“隱藏”
接下來我們?yōu)閔tml設(shè)置一些樣式:

        .box {
            max-width: 300px; 
            margin: auto;
        }
        .show-less { //初始時隱藏該選項
            display: none;
        }
        .show-more {
            display: block;
        }
        input[type='checkbox'] {
            opacity: 0;
        }

more-content設(shè)置的初始樣式是關(guān)鍵:

        .more-content {
            max-height: 0; //初始高度設(shè)置為0蝎困,約等于設(shè)置了display:none
            overflow: hidden;
            transition: max-height .5s;
        }

好了缅帘,接下來是勾選了checkbox的樣式:

        input[type='checkbox']:checked ~ .show-less {
            display: block;
        }
        input[type='checkbox']:checked ~ .show-more {
            display: none;
        }
        input[type='checkbox']:checked ~ .more-content {
            max-height: 600px; /*設(shè)置一個足夠大的最大高度*/
        }

解釋一下代碼中的max-height: 600px, 這里的最大高度一定是要大于more-content的文案高度的,但它是“足夠大”不是“最大”难衰,因為太大了動畫切換會很奇怪钦无。

可以看到,我們非常依賴兄弟選擇器~盖袭,如果你嘗試將<input type="checkbox" id="showMoreOrLess">移到more-content, show-more, show-less任何一個元素的后面失暂,你會發(fā)現(xiàn)這個選擇器失效了。我對兄弟選擇器使用甚少鳄虱,我想這個原因還是DOM樹的渲染順序問題吧弟塞。

我的想法:結(jié)合line-height做到指定行數(shù)

總結(jié)一下上面的方案還存在的問題:

將多余行的內(nèi)容放在了單獨的容器里,前端仍然需要通過JS切分外露的內(nèi)容和隱藏的內(nèi)容拙已,而切分有一個很大的問題决记,就是只能切指定數(shù)量的字符,無法控制行數(shù)倍踪,同樣數(shù)量的字符系宫,當外部容器寬度不一樣、字體大小不一樣建车、字符類型不一樣(漢字扩借、英文字母)等等,展示的行數(shù)都會不一樣的

我在《CSS世界》中看到了對line-height的介紹:

對于像文本這樣的純內(nèi)聯(lián)元素缤至,line-height就是高度計算的基石潮罪,比如,line-height設(shè)置為16px领斥,則一行文字高度是16px嫉到,兩行就是32px,三行就是48px月洛,所有瀏覽器渲染解析都是這個值何恶,1像素都不會差。

既然都這么說了膊存,那是不是只要我將文本的容器設(shè)置為內(nèi)聯(lián)元素导而,然后設(shè)置其line-height為某個值,設(shè)此時要求外露n行隔崎,那么外層容器的最大高度就是n * line-height今艺,當點擊“展開“時,再把它的最大高度設(shè)置為“一個足夠大的最大高度值”不就可以了嗎爵卒?這樣我也不用再有什么more-content的容器了虚缎,而且還能指定行數(shù)!!
html代碼:

    <input type="checkbox" id="showMoreOrLess">
    <div class="box">
        <p class="content">該方案是摘抄自張鑫旭--《CSS世界》其具體實現(xiàn)是:將多余的文案放入另一個容器(more-content)中实牡,
        在初始化的時候陌僵,more-content設(shè)置max-height: 0; overflow: hidden; transition: max-height .3s;
            點擊展開時,再配合checkbox的checked屬性创坞,more-content設(shè)置max-height: /*一個足夠大的最大高度值*/
        </p>
    </div>
    <label for="showMoreOrLess" class="show-more">展開</label>
    <label for="showMoreOrLess" class="show-less">收起</label>

CSS樣式:

        .box {
            max-width: 300px;
            margin: auto;
            max-height: 48px;
            overflow: hidden;
            transition: max-height .5s;
        }
        .content {
            display: inline; /*很重要M攵獭!*/
            line-height: 24px;
        }
        .show-less {
            display: none;
        }
        .show-more {
            display: block;
        }
        input[type='checkbox'] {
            opacity: 0;
        }
        input[type='checkbox']:checked ~ .box .show-less {
            display: block;
        }
        input[type='checkbox']:checked ~ .box .show-more {
            display: none;
        }
        input[type='checkbox']:checked ~ .box {
            max-height: 600px;
        }

注意:一定不要忘記將p標簽設(shè)置為display: inline; 讓它變成內(nèi)聯(lián)元素

這是我認為一個比較方便且完美的實現(xiàn)多行文字的顯示與隱藏了题涨,我在百度上搜索關(guān)鍵字偎谁,前面的文章全都是使用-webkit-line-clamp屬性的,這個屬性的兼容性嘛纲堵,看看吧:

-webkit-line-clamp兼容性

大家酌情參考巡雨,是否可以直接用這個屬性吧。

另外:checked選擇器也有局限席函,第一是只能用于單選按鈕和復選框铐望,第二是也有兼容性問題:

:checked的兼容問題

改用js動態(tài)添加類名也是一個不錯的選擇:

//html
   <input type="checkbox" id="showMoreOrLess" onchange="showMoreOrLessChange()">
//js
    var showMoreOrLess = document.getElementById('showMoreOrLess')
    function showMoreOrLessChange() {
        showMoreOrLess.setAttribute('class', showMoreOrLess.checked ? 'checked' : '')
    }
關(guān)于line-height和font-size對內(nèi)聯(lián)元素高度的影響

其實我在看到line-height完全決定了像文本元素這種內(nèi)聯(lián)元素的高度時,就有所疑問了茂附,在我的印象里正蛙,font-size同樣也會影響,所以我也做了一個實驗何之,將font-size的值設(shè)置得比line-height更大跟畅,然后看效果

        .content {
            display: inline; /*很重要!溶推!*/
            line-height: 24px;
            font-size: 30px;
        }

發(fā)現(xiàn)文字會被截斷:

屏幕快照 2019-11-03 下午5.03.14.png

所以,使用這種方案時奸攻,一定要保證蒜危,font-size值比line-height小,否則顯示會有問題睹耐。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末辐赞,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子硝训,更是在濱河造成了極大的恐慌响委,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窖梁,死亡現(xiàn)場離奇詭異赘风,居然都是意外死亡,警方通過查閱死者的電腦和手機纵刘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門邀窃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人假哎,你說我怎么就攤上這事瞬捕。” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵矢赁,是天一觀的道長哮幢。 經(jīng)常有香客問我,道長扇救,這世上最難降的妖魔是什么秆剪? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮爵政,結(jié)果婚禮上仅讽,老公的妹妹穿的比我還像新娘。我一直安慰自己钾挟,他們只是感情好洁灵,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著掺出,像睡著了一般徽千。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上汤锨,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天双抽,我揣著相機與錄音,去河邊找鬼闲礼。 笑死牍汹,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的柬泽。 我是一名探鬼主播慎菲,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼锨并!你這毒婦竟也來了露该?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤第煮,失蹤者是張志新(化名)和其女友劉穎解幼,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體包警,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡撵摆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了揽趾。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片台汇。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出苟呐,到底是詐尸還是另有隱情痒芝,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布牵素,位于F島的核電站严衬,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏笆呆。R本人自食惡果不足惜请琳,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赠幕。 院中可真熱鬧俄精,春花似錦、人聲如沸榕堰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逆屡。三九已至圾旨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間魏蔗,已是汗流浹背砍的。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留莺治,地道東北人廓鞠。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像产雹,于是被迫代替她去往敵國和親诫惭。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

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

  • CSS 是什么 css(Cascading Style Sheets)蔓挖,層疊樣式表,選擇器{屬性:值馆衔;屬性:值}h...
    崔敏嫣閱讀 1,482評論 0 5
  • 本課來自http://www.imooc.com/learn/9請不要用作商業(yè)用途瘟判。 HTML5 HTML介紹 H...
    PYLON閱讀 3,229評論 0 5
  • HTML 5 HTML5概述 因特網(wǎng)上的信息是以網(wǎng)頁的形式展示給用戶的,因此網(wǎng)頁是網(wǎng)絡(luò)信息傳遞的載體角溃。網(wǎng)頁文件是用...
    阿啊阿吖丁閱讀 3,899評論 0 0
  • 一:在制作一個Web應(yīng)用或Web站點的過程中拷获,你是如何考慮他的UI、安全性减细、高性能匆瓜、SEO、可維護性以及技術(shù)因素的...
    Arno_z閱讀 1,167評論 0 1
  • 選擇qi:是表達式 標簽選擇器 類選擇器 屬性選擇器 繼承屬性: color,font驮吱,text-align茧妒,li...
    love2013閱讀 2,315評論 0 11