05 Flex Panel Gallery打卡指南

作者:@sandystar

简介:JavaScript30 是 Wes Bos 推出的一个 30 天挑战。项目免费提供了 30 个视频教程、30 个挑战的起始文档和 30 个挑战解决方案源代码。目的是帮助人们用纯 JavaScript 来写东西,不借助框架和库,也不使用编译器和引用。现在你看到的是这系列指南的第 5 篇。完整代码已经放到github上了,欢迎访问!

实现效果

要实现一个这样的弹性相册。当鼠标点击相片时,相片变宽并且压缩其他图片,有文字浮入。再次点击图片时,图片会压缩,同时会挤走上下两端的文字。

思路

关于这类的动态效果,我们可以想想,其实动态效果都是使用css来实现的,而JavaScript就是使其css动态的改变。所以我们可以这样做:

  1. 先定义好起始的css样式效果
  2. 接着定义改变后的css样式效果
  3. 然后使用JavaScript去动态添加或删除相应的css样式
  4. 这期间想要做到顺滑的过渡要定义好 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类来实现,既然效果是 图片扩展+文字滑入 ,那可以利用 transitiondelay属性,来实现文字延迟与图片滑入。

.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 容器,作为弹性盒子,它们各自的作用是:

这里容易混淆的是不同 CSS 属性的应用对象,想区分很简单,只需记住针对容器内子元素的特性较少(只有 5 个),可以这样联想:针对某一个具体的小元素进行设置,可供发挥的空间比较少,而针对 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实现弹性相册相关推荐

  1. java手风琴代码_[Java教程]18款jquery抽屉式手风琴导航特效代码

    [Java教程]18款jquery抽屉式手风琴导航特效代码 0 2015-11-12 21:00:05 jquery hover抽屉式导航图片展开收缩代码 jQuery仿瑞丽鼠标滑过图片手风琴展开特效 ...

  2. html5手机手风琴相册,纯js带弹性动画的手风琴图片相册特效

    这是一款使用纯javascript来制作的带弹性动画的手风琴图片相册特效.该手风琴图片相册在鼠标滑过时,相应的图片会水平展开,而图片的说明文字则会垂直滑动上来,形成一些视觉差的感觉. 使用方法 在页面 ...

  3. 3d相册 html 代码_HTML5 3D立体图片相册

    插件简介 HTML5非常强大,尤其是和CSS3结合,有时候能达到非同凡响的网页动画效果.今天要分享的这款HTML5应用就是一款很酷的3D立体图片相册应用,它可以用鼠标拖拽从多个角度浏览相册图片,点击图 ...

  4. android在主程序中调用图片,009android初级篇之APP中使用系统相机相册等集成应用...

    009android初级篇之APP中使用系统相机相册等集成应用 android应用中使用相机功能,大致有两种方式实现: 直接调用系统内部的相机程序,显示的也是系统预设的界面(简单,只有简单的拍照功能) ...

  5. 8个超炫酷的jQuery相册插件欣赏

    在网页中,相册应用十分常见,如果你经常逛一些社交网站,那么你应该会注意到很多各式各样的网页相册应用.今天我们要来分享一些最新收集的jQuery相册插件,这些精美的jQuery相册插件可以帮助你快速搭建 ...

  6. CSS3与页面布局学习笔记(四)——页面布局大全(负边距、双飞翼、多栏、弹性、流式、瀑布流、响应式布局)

    一.负边距与浮动布局 1.1.负边距 所谓的负边距就是margin取负值的情况,如margin:-100px,margin:-100%.当一个元素与另一个元素margin取负值时将拉近距离.常见的功能 ...

  7. 相册服务器维护,相册云服务器

    相册云服务器 内容精选 换一换 该任务指导用户使用已注册成功的ISO镜像创建弹性云服务器.登录管理控制台.选择"计算 > 镜像服务".进入镜像服务页面.进入镜像服务页面.单击 ...

  8. 空间相册显示服务器错误,空间相册服务器繁忙

    空间相册服务器繁忙 内容精选 换一换 在Linux操作系统云服务器中创建文件时提示空间不足:No space left on device磁盘分区block空间使用率达到100%.磁盘分区inode空 ...

  9. 相册服务器位置,如何将相册存放在云服务器

    如何将相册存放在云服务器 内容精选 换一换 华为云帮助中心,为用户提供产品简介.价格说明.购买指南.用户指南.API参考.最佳实践.常见问题.视频帮助等技术文档,帮助您快速上手使用华为云服务. 本文主 ...

最新文章

  1. visual paradigm 表示选择关系_css3选择器用法介绍
  2. 实验报告三c语言,C语言实验报告三
  3. Delphi 与 DirectX 之 DelphiX(33): TDIB.SmoothRotateWrap();
  4. 数据结构:循环链表解决约瑟夫问题
  5. python处理滑块验证码_使用python实现滑动验证码
  6. mysql 临时索引_MYSQL临时表创建索引
  7. keil5建立工程步骤_5个步骤建立实践社区
  8. Integer类的toBinaryString源码分析
  9. c语言程序设计19,C语言程序设计19.pdf
  10. 推荐系统思维导图——第二章
  11. python自学行吗-没有编程基础,可以自学Python吗?
  12. zoj 3620 Escape Time II dfs
  13. bing翻译接口appID申请教程【TranslateApiException: AppId is over the quota 】
  14. 微信数据清空了怎么办?误删微信聊天记录怎么恢复
  15. Linux命令:查看服务器IP地址
  16. 云计算学习笔记3——分布式通信
  17. luogu1330 封锁阳光大学
  18. MATLAB中PS是什么意思,matlab与pscad的区别
  19. Apple Watch如何重新配对
  20. Postman发送一个请求

热门文章

  1. 数据库一条insert插入多条记录
  2. 2022年十三届蓝桥杯国赛(C/C++大学B组)个人题解
  3. EasyExcel的导入excel文件
  4. Parse error in application web.xml file at jndi:/localhost/ipws/WEB-INF/web.xml
  5. 硬件基础:台式电脑上的常用的几个接口!
  6. 食物语服务器什么时候维护,食物语更新公告
  7. c语言 英文课本词汇表的生成,【C/C++】词汇表生成
  8. 如何让Word 2003识别Docx文件
  9. 2021年,自媒体人该怎么建立自媒体矩阵?
  10. 注册表 关闭打印机服务器,Windows 2016 server部署打印机服务器后 重启服务器,出现“重定向的打印机”,如何来删除?...