利用css实现,多行文字显示指定行,且展开收起支持动画

由《CSS世界》中利用max-height属性结合checkbox标签得到的启发

先说明,该方案本身就不支持显示指定行,但它对我后面实现该功能提供了方向,所以先带大家看看张鑫旭大神是如何实现 仅利用CSS实现隐藏多余内容,且展开收起支持动画 的吧

html代码:

    <div class="box">
        <input type="checkbox" id="showMoreOrLess">
        <p class="content">该方案是摘抄自张鑫旭--《CSS世界》其具体实现是:将多余的文案放入另一个容器(more-content)中,</p>
        <p class="more-content">
            在初始化的时候,more-content设置max-height: 0; overflow: hidden; transition: max-height .3s;
            点击展开时,再配合checkbox的checked属性,more-content设置max-height: /*一个足够大的最大高度值*/
        </p>
        <label for="showMoreOrLess" class="show-more">展开</label>
        <label for="showMoreOrLess" class="show-less">收起</label>
    </div>

class="more-content"<p>标签里面放的就是初始要隐藏的内容,可以看到,这里是需要将要隐藏的内容和初始要展示的内容分在两个容器中放置的,我想这不是一个理想的方案,但是这不影响我们学习它,后面我会尝试给出更好的方案。
checkbox用在这里是很巧妙的,CSS可以通过:checked属性处理当checkbox被勾选时的特定样式,这里当checkbox被勾选时,代表“展开”,取消勾选时,代表“隐藏”
接下来我们为html设置一些样式:

        .box {
            max-width: 300px; 
            margin: auto;
        }
        .show-less { //初始时隐藏该选项
            display: none;
        }
        .show-more {
            display: block;
        }
        input[type='checkbox'] {
            opacity: 0;
        }

more-content设置的初始样式是关键:

        .more-content {
            max-height: 0; //初始高度设置为0,约等于设置了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; /*设置一个足够大的最大高度*/
        }

解释一下代码中的max-height: 600px, 这里的最大高度一定是要大于more-content的文案高度的,但它是“足够大”不是“最大”,因为太大了动画切换会很奇怪。

可以看到,我们非常依赖兄弟选择器~,如果你尝试将<input type="checkbox" id="showMoreOrLess">移到more-content, show-more, show-less任何一个元素的后面,你会发现这个选择器失效了。我对兄弟选择器使用甚少,我想这个原因还是DOM树的渲染顺序问题吧。

我的想法:结合line-height做到指定行数

总结一下上面的方案还存在的问题:

将多余行的内容放在了单独的容器里,前端仍然需要通过JS切分外露的内容和隐藏的内容,而切分有一个很大的问题,就是只能切指定数量的字符,无法控制行数,同样数量的字符,当外部容器宽度不一样、字体大小不一样、字符类型不一样(汉字、英文字母)等等,展示的行数都会不一样的

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

对于像文本这样的纯内联元素,line-height就是高度计算的基石,比如,line-height设置为16px,则一行文字高度是16px,两行就是32px,三行就是48px,所有浏览器渲染解析都是这个值,1像素都不会差。

既然都这么说了,那是不是只要我将文本的容器设置为内联元素,然后设置其line-height为某个值,设此时要求外露n行,那么外层容器的最大高度就是n * line-height,当点击“展开“时,再把它的最大高度设置为“一个足够大的最大高度值”不就可以了吗?这样我也不用再有什么more-content的容器了,而且还能指定行数!!
html代码:

    <input type="checkbox" id="showMoreOrLess">
    <div class="box">
        <p class="content">该方案是摘抄自张鑫旭--《CSS世界》其具体实现是:将多余的文案放入另一个容器(more-content)中,
        在初始化的时候,more-content设置max-height: 0; overflow: hidden; transition: max-height .3s;
            点击展开时,再配合checkbox的checked属性,more-content设置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; /*很重要!!*/
            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标签设置为display: inline; 让它变成内联元素

这是我认为一个比较方便且完美的实现多行文字的显示与隐藏了,我在百度上搜索关键字,前面的文章全都是使用-webkit-line-clamp属性的,这个属性的兼容性嘛,看看吧:

-webkit-line-clamp兼容性

大家酌情参考,是否可以直接用这个属性吧。

另外:checked选择器也有局限,第一是只能用于单选按钮和复选框,第二是也有兼容性问题:

:checked的兼容问题

改用js动态添加类名也是一个不错的选择:

//html
   <input type="checkbox" id="showMoreOrLess" onchange="showMoreOrLessChange()">
//js
    var showMoreOrLess = document.getElementById('showMoreOrLess')
    function showMoreOrLessChange() {
        showMoreOrLess.setAttribute('class', showMoreOrLess.checked ? 'checked' : '')
    }
关于line-height和font-size对内联元素高度的影响

其实我在看到line-height完全决定了像文本元素这种内联元素的高度时,就有所疑问了,在我的印象里,font-size同样也会影响,所以我也做了一个实验,将font-size的值设置得比line-height更大,然后看效果

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

发现文字会被截断:

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

所以,使用这种方案时,一定要保证,font-size值比line-height小,否则显示会有问题。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,012评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,589评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,819评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,652评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,954评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,381评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,687评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,404评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,082评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,355评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,880评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,249评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,864评论 3 232
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,007评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,760评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,394评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,281评论 2 259

推荐阅读更多精彩内容

  • CSS 是什么 css(Cascading Style Sheets),层叠样式表,选择器{属性:值;属性:值}h...
    崔敏嫣阅读 1,441评论 0 5
  • 本课来自http://www.imooc.com/learn/9请不要用作商业用途。 HTML5 HTML介绍 H...
    PYLON阅读 3,105评论 0 5
  • HTML 5 HTML5概述 因特网上的信息是以网页的形式展示给用户的,因此网页是网络信息传递的载体。网页文件是用...
    阿啊阿吖丁阅读 3,360评论 0 0
  • 一:在制作一个Web应用或Web站点的过程中,你是如何考虑他的UI、安全性、高性能、SEO、可维护性以及技术因素的...
    Arno_z阅读 1,087评论 0 1
  • 选择qi:是表达式 标签选择器 类选择器 属性选择器 继承属性: color,font,text-align,li...
    love2013阅读 2,278评论 0 11