vue和react等项目中更简单的实现展开收起更多等效果示例
作者:Haorooms 发布时间:2024-05-29 22:47:35
标签:vue,展开,收起
前言
本文题目中虽然写有vue和react,但是并非vue和react相关知识,而是最基本的html5和css3的一些知识,之所以写vue,是因为我最近项目中用到了类似效果,我用vue相关知识实现并不雅观,用html5和css3实现,则更加完美。
项目案例
项目中有如下效果:
好多展开收起,对于这个的实现,我一开始用了vue一些比较挫的dom操作,就是父元素toggleClass一个类名,进行子元素的显示和隐藏。
由于这个方法是通用方法,项目中好多地方使用,代码大概如下:
toggleShow() {
let target = window.event.srcElement;
if (target.nodeName == "SPAN") {
target.parentNode.parentNode.classList.toggle("toggleclass");
target.classList.toggle("el-icon-arrow-right");
} else {
target.parentNode.classList.toggle("toggleclass");
target.children[0].classList.toggle("el-icon-arrow-right");
}
}
这样写,既不友好,后期又难以维护。最近重构项目的时候,把这些地方都重构了,用了今天介绍的方法!更多重构要点,请点击vue项目重构技术要点 这篇文章。
html5和css3实现展开收起
代码如下:
<details class="haorooms" open>
<summary>图表参数</summary>
<content>这里是包含的div等其他展示元素</content>
</details>
css代码
.haorooms{position:relative}
.haorooms summary{
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
outline: 0;
}
/* 自定义的三角 */
.haorooms summary::after {
content: '';
position: absolute;
left:0;
top:0;
width: 15px; height: 15px;
background: url(./haorooms.png) no-repeat; /* 自定义的三角图片 */
background-size: 100% 100%;
transition: transform .2s;
}
.haorooms:not([open]) summary::after {
transform: rotate(90deg);
}
/* 隐藏默认三角 */
.haorooms ::-webkit-details-marker {
display: none;
}
.haorooms ::-moz-list-bullet {
font-size: 0;
}
代码解释
html5的detail和summary本身就是一个展开收起的效果。假如不了解, 可以查看 。
隐藏默认三角如下:
.haorooms ::-webkit-details-marker {
display: none;
}
.haorooms ::-moz-list-bullet {
font-size: 0;
}
details和summary的ui优化
张鑫旭有篇文章,对details和summary介绍的很详细
对应其UI的优化,主要有如下几个方面:
1、小三角的优化,包括颜色、隐藏、位置、替换。
2、outline轮廓的去除
小三角颜色修改
.haorooms ::-webkit-details-marker {
color: gray;
}
.haorooms ::-moz-list-bullet {
color: gray;
}
小三角位置修改-右侧显示
.haorooms summary {
width: -moz-fit-content;
width: fit-content;
direction: rtl;
}
.haorooms ::-webkit-details-marker {
direction: ltr;
}
.haorooms ::-moz-list-bullet {
direction: ltr;
}
outline轮廓的去除
我上面用的是
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
outline: 0;
这样对无障碍访问非常不友好,优化方案可以看张鑫旭大神的做法。
details和summary其他应用
1、更多效果
<details>
<summary>
<p>测试内容测试内容</p>
<div class="more">
<p>haorooms测试内容测试内容...</p>
</div>
<a>更多</a>
</summary>
</details>
css代码
::-webkit-details-marker {
display: none;
}
::-moz-list-bullet {
font-size: 0;
float: left;
}
summary {
user-select: none;
outline: 0;
}
.more {
display: none;
}
[open] .more {
display: block;
}
[open] summary a {
font-size: 0;
}
[open] summary a::before {
content: '收起';
font-size: 14px;
}
2、悬浮菜单效果
CSS代码:
/* 隐藏默认三角 */
::-webkit-details-marker {
display: none;
}
::-moz-list-bullet {
font-size: 0;
float: left;
}
summary {
display: inline-block;
padding: 5px 28px;
text-indent: -15px;
user-select: none;
position: relative;
z-index: 1;
}
summary::after {
content: '';
position: absolute;
width: 12px; height: 12px;
margin: 4px 0 0 .5ch;
background: url(./arrow-on.svg) no-repeat;
background-size: 100% 100%;
transition: transform .2s;
}
[open] summary,
summary:hover {
background-color: #fff;
box-shadow: inset 1px 0 #ddd, inset -1px 0 #ddd;
}
[open] summary::after {
transform: rotate(180deg);
}
.box {
position: absolute;
border: 1px solid #ddd;
background-color: #fff;
min-width: 100px;
padding: 5px 0;
margin-top: -1px;
}
.box a {
display: block;
padding: 5px 10px;
color: inherit;
}
.box a:hover {
background-color: #f0f0f0;
}
.box sup {
position: absolute;
color: #cd0000;
font-size: 12px;
margin-top: -.25em;
}
HTML代码:
<div class="bar">
<details>
<summary>我的消息</summary>
<div class="box">
<a href>我的回答<sup>12</sup></a>
<a href>我的私信</a>
<a href>未评价订单<sup>2</sup></a>
<a href>我的关注</a>
</div>
</details>
</div>
<p>这里放一段文字表明上面的是悬浮效果。</p>
3、树形菜单效果
CSS代码:
/* 隐藏默认三角 */
::-webkit-details-marker {
display: none;
}
::-moz-list-bullet {
font-size: 0;
float: left;
}
details {
padding-left: 20px;
}
summary::before {
content: '';
display: inline-block;
width: 12px; height: 12px;
border: 1px solid #999;
background: linear-gradient(to right, #999, #999) no-repeat center, linear-gradient(to top, #999, #999) no-repeat center;
background-size: 2px 10px, 10px 2px;
vertical-align: -2px;
margin-right: 6px;
margin-left: -20px;
}
[open] > summary::before {
background: linear-gradient(to right, #999, #999) no-repeat center;
background-size: 10px 2px;
}
HTML代码:
<details>
<summary>我的视频</summary>
<details>
<summary>爆肝工程师的异世界狂想曲</summary>
<div>tv1-720p.mp4</div>
<div>tv2-720p.mp4</div>
...
<div>tv10-720p.mp4</div>
</details>
<details>
<summary>七大罪</summary>
<div>七大罪B站00合集.mp4</div>
</details>
<div>珍藏动漫网盘地址.txt</div>
<div>我们的小美好.mp4</div>
</details>
来源:http://www.haorooms.com/post/zhankaishouqigengduo
0
投稿
猜你喜欢
- Tuple 是不可变 list。 一旦创建了一个 tuple 就不能以任何方式改变它。Tuple 与 list 的相同之处定义 tuple
- 接着上篇文章《解析SQL 表结构信息查询 含主外键、自增长》里面提到了INFORMATION_SCHEMA视图,其实到了SQL 2005微软
- 通过 register_shutdown_function 方法,可以让我们设置一个当执行关闭时可以被调用的另一个函数。也就是说,当我们的脚
- 一,什么是JSON文件JSON和XML都是互联网上数据交换的主要载体。在JSON出现之前,大家一直用XML来传递数据。因为XML是一种纯文本
- 1提取 PDF 内容# pip install PyPDF2 安装 PyPDF2import PyPDF2from PyPDF2
- Python 3中的File对象不支持next()方法。 Python 3有一个内置函数next(),它通过调用其next ()方法从迭代器
- 使用工具:Python2.7 点我下载scrapy框架sublime text3一。搭建python(Windows版本) 1.安
- Python应用编程需要用到的针对不同数据库引擎的数据库接口:http://wiki.python.org/moin/DatabaseInt
- 8大基础定位driver.find_element_by_id() # id定位driver.find_element_by_name()
- 1. 安装PyYAMLpip install PyYAML2. 加载yaml文件直接使用yaml.load()函数demo.yml :kin
- 本文实例讲述了Python运算符重载用法。分享给大家供大家参考。具体分析如下:python中,我们在定义类的时候,可以通过实现一些函数来实现
- 基本思路使用GDAL创建Shapefile数据的基本步骤如下:使用osgeo.ogr.Driver的CreateDataSource()方法
- 实战场景在项目实战中,会碰到一种特定的运维场景,对CDN访问进行限制,一般手段是开启 referer 防盗链,开启 IP黑白名单,开启UA黑
- 使用wordcloud模块,生成云图,测试文本为:Betty Botter bought some butter but she said
- 每天你都可能会执行许多重复的任务,例如阅读新闻、发邮件、查看天气、打开书签、清理文件夹等等,使用自动化脚本,就无需手动一次又一次地完成这些任
- 本文实例讲述了PHP中substr_count()函数获取子字符串出现次数的方法。分享给大家供大家参考,具体如下:PHP中的substr_c
- 一、网络请求在uni中可以调用uni.request方法进行请求网络请求需要注意的是:在小程序中网络相关的 API 在使用前需要配置域名白名
- 在python类当中,经常会遇到@classmethod和@staticmethod这两个装饰器,那么到底它们的区别和作用是啥子呢?具体来看
- 我们在开发项目的时候经常会在后台管理时用到批量展示功能来动态的修改数据库的值。下面以修改数据库的status状态值来实现批量展示功能。批量选
- compose函数compose函数可以将需要嵌套执行的函数平铺,嵌套执行就是一个函数的返回值将作为另一个函数的参数。我们考虑一个简单的需求