效果

show more 是很常被使用的效果, 因为空间总是不够的丫.

比起 scroll, show more 的体验通常会好一些, 尤其在手机, 它有更好的引导.

实现思路

 

1. 卡片需要一个 max-height 限制内容, 同时 overflow: hidden

2. 做一个 overlay show more 绝对定位到最底部.

3. overlay 内部除了 button 以外还要有一个渐变 gradient 隐约阻挡内容, 这样就起到了引导作用.

4. show more 点击后解除 max-height 限制, 这里需要 JS 来实现.

注意: 如果内容没有超过 max-height show more 不应该出现. 这个也需要 JS 实现.

搭场景

HTML

<div class="container">
<div class="card">
<p>
Lorem ipsum dolor sit, amet consectetur adipisicing elit. Fuga nulla
doloremque totam id ipsam illum amet cum ipsum officia itaque magnam
earum suscipit vero, dicta, quibusdam maxime at incidunt, commodi
delectus quisquam. Quis, amet animi vel harum consequuntur eos nihil
quibusdam quam, nemo dignissimos minus maiores distinctio ea facilis
sapiente sed alias eveniet et totam tenetur? Qui facilis esse ad! Non
velit vitae delectus! Unde numquam iste ipsam. Enim, provident
pariatur rerum debitis libero ut reprehenderit nostrum? A voluptatem
fugiat consequuntur ratione natus maxime odio aliquam porro tempora
doloremque eius quaerat repudiandae molestias eos consectetur, esse
nemo. Impedit, praesentium assumenda.
</p>
</div>

一张卡片, 内容, 做简单的演示就好了

CSS Style

.container {
display: grid;
place-content: center;
height: 100vh;
.card {
width: 350px;
max-height: 350px;
border: 1px solid black;
p {
line-height: 1.5;
font-size: 1.5rem;
}
}
}

给点样式美化一下

效果

上样式

添加 show more HTML

添加 show more overlay HTML 到 card 里面

<div class="show-more-overlay show">
<div class="gradient"><span>Show More</span></div>
<button class="btn">Show More</button>
</div>

gradient 的高度为了和 buttom 一样, 所以也写了字撑高

限制高度

.container {
.card {
overflow: hidden;
}
}

定位 show more overlay

.card {
position: relative;
.show-more-overlay {
display: none;
// js 会负责给 .show 的 class
&.show {
display: revert;
} position: absolute;
left: 0;
bottom: 0;
width: 100%;
}
}

一开始是 display none 的, JS 会依据内容是否超过了 max-height 决定 show

button 和 gradient 样式

.card {
.show-more-overlay {
.gradient,
.btn {
padding: 1rem;
}
.gradient {
background-image: linear-gradient(
to top,
hsla(0, 0%, 95%, 1),
hsla(0, 0%, 95%, 0.01)
);
span {
visibility: hidden;
}
}
.btn {
border-width: 0; // reset CSS
width: 100%;
background-color: hsl(0, 0%, 95%);
}
}
}

gradient 的高度和颜色需要配合 button 哦

pointer-event

这里需要注意一下, button 是可以点击的, gradient 是要穿透的.

gradient 要穿透, 那么它的 parent 也必须要穿透, 要不 overlay 也会当着内容.

而 pointer-event 的规则是, 默认所以元素都是不穿透的, 但如果 parent pointer-event: none, 那么所有子孙就可穿透了. 子孙可以通过 pointer-event:auto override 回去.

所以这里的做法是让 overlay pointer-event none, 然后 button pointer-event:auto

.card {
.show-more-overlay {
pointer-events: none;
.btn {
cursor: pointer;
pointer-events: auto;
}
}
}

上 Javascript

const card = document.querySelector(".card");
if (card.scrollHeight > card.offsetHeight) {
const overlay = card.querySelector(".show-more-overlay");
overlay.classList.add("show");
const btn = overlay.querySelector(".btn");
btn.addEventListener("click", () => {
card.style.maxHeight = "initial";
overlay.classList.remove("show");
});
}

检查 height, 显示 show more

监听点击, hide show more, 解开 max-height 限制.

需要注意的是, 如果内容有图片这类的, 可能因为加载慢而计算错误哦, 可以写一个 resize observer 解决.

Final Core

HTML

<div class="container">
<div class="card">
<p>
Lorem ipsum dolor sit, amet consectetur adipisicing elit. Fuga nulla
doloremque totam id ipsam illum amet cum ipsum officia itaque magnam
earum suscipit vero, dicta, quibusdam maxime at incidunt, commodi
delectus quisquam. Quis, amet animi vel harum consequuntur eos nihil
quibusdam quam, nemo dignissimos minus maiores distinctio ea facilis
sapiente sed alias eveniet et totam tenetur? Qui facilis esse ad! Non
velit vitae delectus! Unde numquam iste ipsam. Enim, provident
pariatur rerum debitis libero ut reprehenderit nostrum? A voluptatem
fugiat consequuntur ratione natus maxime odio aliquam porro tempora
doloremque eius quaerat repudiandae molestias eos consectetur, esse
nemo. Impedit, praesentium assumenda.
</p>
<div class="show-more-overlay">
<div class="gradient"><span>Show More</span></div>
<button class="btn">Show More</button>
</div>
</div>
</div>

CSS Style

.container {
display: grid;
place-content: center;
height: 100vh;
.card {
width: 350px;
max-height: 350px;
border: 1px solid black;
p {
line-height: 1.5;
font-size: 1.5rem;
} overflow: hidden; position: relative;
.show-more-overlay {
display: none;
// js 会负责给 .show 的 class
&.show {
display: revert;
} position: absolute;
left: 0;
bottom: 0;
width: 100%; pointer-events: none;
.gradient,
.btn {
padding: 1rem;
}
.gradient {
background-image: linear-gradient(
to top,
hsla(0, 0%, 95%, 1),
hsla(0, 0%, 95%, 0.01)
);
span {
visibility: hidden;
}
}
.btn {
border-width: 0; // reset CSS
width: 100%;
background-color: hsl(0, 0%, 95%);
cursor: pointer;
pointer-events: auto;
}
}
}
}

JavaScript

const card = document.querySelector(".card");
if (card.scrollHeight > card.offsetHeight) {
const overlay = card.querySelector(".show-more-overlay");
overlay.classList.add("show");
const btn = overlay.querySelector(".btn");
btn.addEventListener("click", () => {
card.style.maxHeight = "initial";
overlay.classList.remove("show");
});
}

效果

CSS & JS Effect – Show More的更多相关文章

  1. CSS & JS 制作滚动幻灯片

    ==================纯CSS方式==================== <!DOCTYPE html> <html> <head> <met ...

  2. 【转】Maven Jetty 插件的问题(css/js等目录死锁)的解决

    Maven Jetty 插件的问题(css/js等目录死锁,不能自动刷新)的解决:   1. 打开下面的目录:C:\Users\用户名\.m2\repository\org\eclipse\jetty ...

  3. Css Js Loader For Zencart

    Css Js Loader 描述:这个插件很早就出来了,可能知道人非常少 这个插件的功能是整合所有的网站的CSS和JS内容到一个文件里边. 因为CSS和JS文件到了一个文件,加快了程序的运行 在配合其 ...

  4. 购物车数字加减按钮HTML+CSS+JS(有需要嫌麻烦的小伙伴拿走不谢)

    之前在写详情页的时候,如下图 因为自己嫌麻烦,就去看其他网站是怎么写的,想直接拿来用,后来看来看去觉得写得很麻烦,于是最后还是决定自己写,附上HTML+CSS+JS代码,一条龙一站式贴心服务2333 ...

  5. vs合并压缩css,js插件——Bundler & Minifier

    之前做了一个大转盘的抽奖活动,因为比较火,部分用户反馈看不到页面的情况,我怀疑js加载请求过慢导致,所以今天针对之前的一个页面进行调试优化. 首先想到的是对页面的js和css进行压缩优化,百度了下vs ...

  6. nginx资源定向 css js路径问题

    今天玩玩项目,学学nginx发现还不错,速度还可以,但是CSS JS确无法使用,原来Iginx配置时需要对不同类型的文件配置规则,真是很郁闷,不过想想也还是很有道理.闲暇之际,把配置贴上来.#user ...

  7. IIS7的集成模式下如何让自定义的HttpModule不处理静态文件(.html .css .js .jpeg等)请求

    今天将开发好的ASP.NET站点部署到客户的服务器上后,发现了一个非常头疼的问题,那么就是IIS7的应用程序池是集成模式的话,ASP.NET项目中自定义的HttpModule会处理静态文件(.html ...

  8. 网站加载css/js/img等静态文件失败

    网站加载css/js/img等静态文件失败,报网站http服务器内部500错误.而服务器中静态文件存在且权限正常. 从浏览器中直接访问文件,出来乱码.这种问题原因在于iis中该网站mime配置报错,不 ...

  9. 【前端】Sublime text3 插件HTML/CSS/JS prettify 格式化代码

    1.首先安装插件 菜单的preference->packages control,然后输入install .. 回车,再输入HTML/CSS/JS prettify 再回车,重启后就可以了. 2 ...

  10. CSS+JS实现兼容性很好的无限级下拉菜单

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DT ...

随机推荐

  1. 云服务器安装宝塔Linux面板教程(建议收藏)

    ​ 一.简介 宝塔面板是一款简单好用的服务器运维面板.它支持一键LAMP/LNMP/集群/监控/网站/FTP/数据库/JAVA等100多项服务器管理功能.对于新手用云服务器来建站的话,宝塔面板是一个非 ...

  2. 在Django中,多数据操作,你可以编写测试来查询另一个数据库服务器中的数据,并将结果导入当前Django项目的数据库表中

    在Django中,你可以编写测试来查询另一个数据库服务器中的数据,并将结果导入当前Django项目的数据库表中.下面是一个简单的示例: 假设你有一个Django应用程序,名为myapp,并且你希望从另 ...

  3. PN转Modbus RTU模块连接ACS4QQ变频器通信

    一台完整的机器在出厂前由许多部件组成.但是,由于各种原因,这些组件来自不同的制造商,导致设备之间的通信协议存在差异.Modbus和Profinet代表两种不同的通信协议,Profinet通常用于较新的 ...

  4. 题解:P10672 【MX-S1-T1】壁垒

    暑期集训=依托答辩. 分析 种类数是奇数一定无解. 否则每种数字先输出一次,在此过程中每增加两个数时,因为每个数字种类数都不一样,所以前缀种类数也同时增加 \(2\),保证一定为偶数. 然后输出完以后 ...

  5. CF30D King's Problem? 题解

    CF30D 题意 有 \(n+1\) 个点,其中的 \(n\) 个点在数轴上.求以点 \(k\) 为起点走过所有点的最短距离,允许重复. 思路 有两种情况: \(k\) 在数轴上(如图1). \(k\ ...

  6. NIO的三大核心组件详解,充分说明为什么NIO在网络IO中拥有高性能!

    一.写在开头 我们在上一篇博文中提到了Java IO中常见得三大模型(BIO,NIO,AIO),其中NIO是我们在日常开发中使用比较多的一种IO模型,我们今天就一起来详细的学习一下. 在传统的IO中, ...

  7. 【DataBase】MySQL 28 流程控制

    一.分支结构 1.IF函数 语法: IF(表达式1, 表达式2, 表达式3) 类似三元运算符,表达式1返回True Or False True执行表达式2,False执行表达式3 IF实现多分枝结构 ...

  8. 【Docker】01 概述

    什么是Docker? 一个开源的应用容器引擎 由Go语言开发而成,遵循Apache2.0开源协议 允许开发者打包自己的应用或者依赖包组件到一个轻量级可移植的容器中 Docker容器采用沙箱机制,相互之 ...

  9. AI领域的国产显卡如何在现有技术下吸引用户 —— 廉价增加显存 —— 大显存

    先给出一个不大准确的但相差不差的背景介绍: 同样性能级别的显卡,NVIDA的24G的要3W,32G的要5W,48G的要7W, 80G的要10W. 国产同同性能的显卡32G的要10W,48G的要15W, ...

  10. pycuda学习过程中的一些发现,cuda函数的初始化要在cuda内存空间初始化之后,否则会报错

    参考: https://www.cnblogs.com/devilmaycry812839668/p/15348610.html 最近在看WarpDrive的代码,其中cuda上运行的代码是使用pyc ...