05JS实现弹性相册
05 Flex Panel Gallery打卡指南
作者:@sandystar
简介:JavaScript30 是 Wes Bos 推出的一个 30 天挑战。项目免费提供了 30 个视频教程、30 个挑战的起始文档和 30 个挑战解决方案源代码。目的是帮助人们用纯 JavaScript 来写东西,不借助框架和库,也不使用编译器和引用。现在你看到的是这系列指南的第 5 篇。完整代码已经放到github上了,欢迎访问!
实现效果
要实现一个这样的弹性相册。当鼠标点击相片时,相片变宽并且压缩其他图片,有文字浮入。再次点击图片时,图片会压缩,同时会挤走上下两端的文字。
思路
关于这类的动态效果,我们可以想想,其实动态效果都是使用css来实现的,而JavaScript就是使其css动态的改变。所以我们可以这样做:
- 先定义好起始的css样式效果
- 接着定义改变后的css样式效果
- 然后使用JavaScript去动态添加或删除相应的css样式
- 这期间想要做到顺滑的过渡要定义好
transition
属性
步骤
1. 定义初始的css样式
我们可以看到最初的相册是整体均分空间,并且当点击某一图片可以做到挤压其余图片扩展自己空间,这里可以想到使用flex布局
来实现。
并且设置好过渡的 transition
效果:
.panels {min-height: 100vh;overflow: hidden;display: flex;}.panel {background: #6B0F9C;box-shadow: inset 0 0 0 5px rgba(255,255,255,0.1);color: white;text-align: center;align-items: center;/* Safari transitionend event.propertyName === flex *//* Chrome + FF transitionend event.propertyName === flex-grow */transition: /*添加动画效果*/font-size 0.7s cubic-bezier(0.61,-0.19, 0.7,-0.11),flex 0.7s cubic-bezier(0.61,-0.19, 0.7,-0.11),background 0.2s;font-size: 20px;background-size: cover;background-position: center;flex: 1;justify-content: center;display: flex;flex-direction: column;
}/*设置第一行和第三行元素在缩放时隐藏,这里将他们滑出可视区域*/.panel > *:first-child { transform: translateY(-100%); }.panel > *:last-child { transform: translateY(100%); }
2. 定义变化后的css样式
这里的 .open-active
和 .open
都是动态添加的样式,表示转换后给元素添加上的动态效果。
/*当照片打开时将第一行和第三行的元素滑入可视区*/.panel.open-active > *{transform: translateY(0);}/*定义图片打开时的样式---动态添加*/.panel.open {flex: 5; /*宽度扩展*/font-size: 40px; /*字体变大*/}
3. 用JavaScript控制css的效果
获取每个图片的 .panel
属性,遍历 .panels
为每个模块添加监听事件,当点击时就触发监听函数:
const panels = document.querySelectorAll('.panel');function toggleOpen(){//console.log(this);this.classList.toggle('open'); //toggle:如果类值已存在,就移除它,否则就添加}function toggleActive(e){console.log(e.propertyName);if(e.propertyName.includes('flex')){this.classList.toggle('open-active');}}panels.forEach(panel => panel.addEventListener('click',toggleOpen));panels.forEach(panel => panel.addEventListener('transitionend',toggleActive));
这里的
toggle
表示如果类值已存在,就移除它,否则就添加它,可以完美解决伸缩和扩展时对类的添加和删除。
思考
原方案的解决方法是定义了两个
click触发时间的函数,将文字的移动用 .open-active
来控制,同时还加上了 transitionend
的监听事件。
但是这样做不仅麻烦还有一个问题:当快速点击两下时,会出现相反的结合(图片缩小 + 上下文字出现)。这显然不是我们想要的效果。
其实可以都只用一个 .open
类来实现,既然效果是 图片扩展+文字滑入 ,那可以利用 transition
的 delay
属性,来实现文字延迟与图片滑入。
.panel > * {/* ... */transition:transform 0.5s 0.7s;
}/* 修改 .open-actived -> .open*/
.panel.open > * {transform: translateY(0);
}
const panels = document.querySelectorAll('.panel');function toggleOpen(){//console.log(this);this.classList.toggle('open'); //toggle:如果类值已存在,就移除它,否则就添加}panels.forEach(panel => panel.addEventListener('click',toggleOpen));
这样就完美解决了问题又简化了代码。
所获
Flex
这一个挑战的关键部分就在于理解如何使用 Flexbox,挑战的文档里嵌套了三个 flex 容器,作为弹性盒子,它们各自的作用是:
.panels
:使其中的.panel
按横向的 flex 等分排布(此处为五等分).panel
:使其中的<p>
按纵向的 flex 等分排布(此处为三等分)p
:借用 flex 相对于主轴及侧轴的对齐方式,使其中的文字垂直水平居中
针对 Flex items 的特性(Children)
flex-growth
:伸展值flex-shrink
:可接受的压缩值flex-basis
:元素默认的尺寸值flex
:以上三个值按顺序的缩写
针对 Flex container 的特性(Parent)
display: flex
:将这个元素设置成弹性盒子flex-direction
:主轴方向
row
:横向column
:纵向
justify-content
:沿主轴的的对齐方式align-items
:沿侧轴的对齐方式align-content
:子元素中文本沿侧轴的对齐方式(只有一行时无效)
可以在下面几个地方试一下 Flex 的各种特性:
- http://demo.agektmr.com/flexbox/
- http://the-echoplex.net/flexyboxes/
- http://codepen.io/justd/pen/yydezN
classList
Element.classList
是一个只读属性,返回一个元素的类属性的实时 DOMTokenList
集合。
相比将 element.className
作为以空格分隔的字符串来使用,classList
是一种更方便的访问元素的类列表的方法。
toggle
DOMTokenList
接口的 toggle()
方法从列表中删除一个给定的标记 并返回 false
。 如果标记 不存在,则添加并且函数返回 true
。
CN/docs/Web/API/DOMTokenList/toggle)
DOMTokenList
接口的 toggle()
方法从列表中删除一个给定的标记 并返回 false
。 如果标记 不存在,则添加并且函数返回 true
。
05JS实现弹性相册相关推荐
- java手风琴代码_[Java教程]18款jquery抽屉式手风琴导航特效代码
[Java教程]18款jquery抽屉式手风琴导航特效代码 0 2015-11-12 21:00:05 jquery hover抽屉式导航图片展开收缩代码 jQuery仿瑞丽鼠标滑过图片手风琴展开特效 ...
- html5手机手风琴相册,纯js带弹性动画的手风琴图片相册特效
这是一款使用纯javascript来制作的带弹性动画的手风琴图片相册特效.该手风琴图片相册在鼠标滑过时,相应的图片会水平展开,而图片的说明文字则会垂直滑动上来,形成一些视觉差的感觉. 使用方法 在页面 ...
- 3d相册 html 代码_HTML5 3D立体图片相册
插件简介 HTML5非常强大,尤其是和CSS3结合,有时候能达到非同凡响的网页动画效果.今天要分享的这款HTML5应用就是一款很酷的3D立体图片相册应用,它可以用鼠标拖拽从多个角度浏览相册图片,点击图 ...
- android在主程序中调用图片,009android初级篇之APP中使用系统相机相册等集成应用...
009android初级篇之APP中使用系统相机相册等集成应用 android应用中使用相机功能,大致有两种方式实现: 直接调用系统内部的相机程序,显示的也是系统预设的界面(简单,只有简单的拍照功能) ...
- 8个超炫酷的jQuery相册插件欣赏
在网页中,相册应用十分常见,如果你经常逛一些社交网站,那么你应该会注意到很多各式各样的网页相册应用.今天我们要来分享一些最新收集的jQuery相册插件,这些精美的jQuery相册插件可以帮助你快速搭建 ...
- CSS3与页面布局学习笔记(四)——页面布局大全(负边距、双飞翼、多栏、弹性、流式、瀑布流、响应式布局)
一.负边距与浮动布局 1.1.负边距 所谓的负边距就是margin取负值的情况,如margin:-100px,margin:-100%.当一个元素与另一个元素margin取负值时将拉近距离.常见的功能 ...
- 相册服务器维护,相册云服务器
相册云服务器 内容精选 换一换 该任务指导用户使用已注册成功的ISO镜像创建弹性云服务器.登录管理控制台.选择"计算 > 镜像服务".进入镜像服务页面.进入镜像服务页面.单击 ...
- 空间相册显示服务器错误,空间相册服务器繁忙
空间相册服务器繁忙 内容精选 换一换 在Linux操作系统云服务器中创建文件时提示空间不足:No space left on device磁盘分区block空间使用率达到100%.磁盘分区inode空 ...
- 相册服务器位置,如何将相册存放在云服务器
如何将相册存放在云服务器 内容精选 换一换 华为云帮助中心,为用户提供产品简介.价格说明.购买指南.用户指南.API参考.最佳实践.常见问题.视频帮助等技术文档,帮助您快速上手使用华为云服务. 本文主 ...
最新文章
- visual paradigm 表示选择关系_css3选择器用法介绍
- 实验报告三c语言,C语言实验报告三
- Delphi 与 DirectX 之 DelphiX(33): TDIB.SmoothRotateWrap();
- 数据结构:循环链表解决约瑟夫问题
- python处理滑块验证码_使用python实现滑动验证码
- mysql 临时索引_MYSQL临时表创建索引
- keil5建立工程步骤_5个步骤建立实践社区
- Integer类的toBinaryString源码分析
- c语言程序设计19,C语言程序设计19.pdf
- 推荐系统思维导图——第二章
- python自学行吗-没有编程基础,可以自学Python吗?
- zoj 3620 Escape Time II dfs
- bing翻译接口appID申请教程【TranslateApiException: AppId is over the quota 】
- 微信数据清空了怎么办?误删微信聊天记录怎么恢复
- Linux命令:查看服务器IP地址
- 云计算学习笔记3——分布式通信
- luogu1330 封锁阳光大学
- MATLAB中PS是什么意思,matlab与pscad的区别
- Apple Watch如何重新配对
- Postman发送一个请求
热门文章
- 数据库一条insert插入多条记录
- 2022年十三届蓝桥杯国赛(C/C++大学B组)个人题解
- EasyExcel的导入excel文件
- Parse error in application web.xml file at jndi:/localhost/ipws/WEB-INF/web.xml
- 硬件基础:台式电脑上的常用的几个接口!
- 食物语服务器什么时候维护,食物语更新公告
- c语言 英文课本词汇表的生成,【C/C++】词汇表生成
- 如何让Word 2003识别Docx文件
- 2021年,自媒体人该怎么建立自媒体矩阵?
- 注册表 关闭打印机服务器,Windows 2016 server部署打印机服务器后 重启服务器,出现“重定向的打印机”,如何来删除?...