太妙了!!使用CSS实现多行文本的[...展开]效果!

要求:

话不用多说了直接上要求吧!

三行的时候省略(内容字数是不限的,内容文字是随机的),在内容末尾自动加上省略号,最后面增加展开按钮,并且希望展开和省略号之前有一定的间距。

目前暂时不需要考虑什么时候换行,展开后又怎么操作,现在只需要实现这样一个效果!

效果图:

如果你现在正在看这篇文章,又恰好有一点空闲时间,不妨试试怎么实现。

如果你做出来了,那么可以在评论区分享你的效果或者 show me your code!!

最开始的思路

为了不影响大家的思路,我把实现代码放到最后面,当然想看代码的可以直接跳过这一部分。

先分享一下最开始我的思路吧,一开始看见这个效果的时候,我的内心是这样的。

我心想这不挺简单的

结果。。。还是我太菜了。。。

一开始看到我的首要想法是使用定位 ,我想着使用定位,定到右下角,完了再给文字背景改成白色,再增加一定的宽度盖住原来的文字不就实现了吗?确实是可以的,但是这样有一定的缺点,就是我们无法精准的盖住之前的文字,可能会有只盖住一半的情况,比如这样:

文字相同的情况下对比一下正确的实现效果:

相信聪明的童鞋已经看出哪不对劲了,确实使用定位是有一些不精准的,那有的同学会说我再加宽一下正好盖住不就行了,我想说这样的话总有盖不住的时候。。。

最终的实现

那经过上面的测试我们已经知道定位实现不了,那应该怎么办呢?

在 flex 如此流行的今天,相信大家已经忘记了还有一种布局方式,那就是:float

什么是 float

float - CSS:层叠样式表 | MDN (mozilla.org)

看完这张图大家应该恍然大悟了吧,我们只需要给元素增加 floa t即可。

css 复制代码
    .open {
        float: right;
        clear: both;
        margin-left: 7px;
        padding-left: 0;
        font-size: 15px;
        color: #2a3aff;
      }

那如果只使用浮动,初级目标已经实现了,我们如何放到第三行右下角呢?

我们知道如果我们同时写了两个浮动元素,并且给他们分别清除浮动之后的效果是这样的:

这样基本已经实现了,但是我们并不想看到上面的浮动,只想看到展开。

这里有两种方法:

一种是给上面的浮动元素的宽度设置为0;

另一种是删掉上面的浮动元素标签,给外层元素添加伪元素,宽度同样为0;

这两个效果一致,只不过后者不会在页面中多写一个标签。

JS 复制代码
//第一种前者      
    .float {
            float: right;
            width: 0;
            height: calc(100% - 28px);
            clear: both;
          }   
//第二种后者   
    .outerElement::before {
            content: '';
            background-color: yellow;
            float: right;
            height: calc(100% - 28px);
          }

写在最后

之所以分享这个效果,一是觉得挺有意思的,二是也是感慨目前随着前端技术的发展,一些新技术慢慢已经取代了老技术,就比如 flex 和 float,我们在工作中可能更多的是使用 flex 进行布局(也有使用float的),而慢慢的忽视了 float,而真正需要 float 登场的时候,又想不起来什么时候要去使用它了。

源码

HTML 复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      html,
      body {
        height: 100%;
      }
      .outerElement {
        width: 600px;
        height: 100%;
        max-height: 80px;
        overflow: hidden;
        line-height: 1.6;
        position: relative;
        overflow: hidden; /*必须结合的属性,当内容溢出元素框时发生的事情*/
        text-overflow: ellipsis; /*可以用来多行文本的情况下,用省略号"..."隐藏超出范围的文本 。*/
        display: -webkit-box; /*必须结合的属性 ,将对象作为弹性伸缩盒子模型显示 。*/
        -webkit-line-clamp: 3; /*用来限制在一个块元素显示的文本的行数。*/
        -webkit-box-orient: vertical; /*必须结合的属性 ,设置或检索伸缩盒对象的子元素的排列方式 。*/
      }
      .outerElement::before {
        content: '';
        background-color: yellow;
        float: right;
        height: calc(100% - 28px);
      }
      .open {
        float: right;
        clear: both;
        margin-left: 7px;
        padding-left: 0;
        font-size: 15px;
        color: #2a3aff;
      } 
    </style>
  </head>
  <body>
    <div class="outerElement">
      <div class="open">展开</div>
      对目前的知识星球来说,一个个星球是创作者和用户们的领地,有时候,在地球解决不了的问题,可以抛向星空,或许来自火星或者月亮的人看见了,就解决了。111111
      如果星球和星空能够互补,后续陆续会做上网页版,也会结合知识星球的App进行迭代在星空回答过问题,用户能访问到你的星球。觉得开星球太重,可以先到星空感受感受气氛。
    </div>
  </body>
</html>
相关推荐
Domain-zhuo10 分钟前
Git和SVN有什么区别?
前端·javascript·vue.js·git·svn·webpack·node.js
雪球不会消失了14 分钟前
SpringMVC中的拦截器
java·开发语言·前端
李云龙I25 分钟前
解锁高效布局:Tab组件最佳实践指南
前端
m0_7482370529 分钟前
Monorepo pnpm 模式管理多个 web 项目
大数据·前端·elasticsearch
JinSoooo32 分钟前
pnpm monorepo 联调方案
前端·pnpm·monorepo
m0_7482449641 分钟前
【AI系统】LLVM 前端和优化层
前端·状态模式
明弟有理想41 分钟前
Chrome RCE 漏洞复现
前端·chrome·漏洞·复现
平行线也会相交42 分钟前
云图库平台(二)前端项目初始化
前端·vue.js·云图库平台
shimmer00843 分钟前
抖音小程序登录(前端通过tt.login获取code换取openId)
前端·小程序·状态模式
嘤嘤怪呆呆狗1 小时前
【开发问题记录】使用 Docker+Jenkins+Jenkins + gitee 实现自动化部署前端项目 CI/CD(centos7为例)
前端·vue.js·ci/cd·docker·gitee·自动化·jenkins