当前位置: 首页 > news >正文

50 Projects 50 Days - Expanding Cards 学习记录

50 Projects 50 Days不使用任何前端框架,适合初学者练手,巩固前端基础,在这里记录一下学习过程,尤其是一些细节上的问题。

项目地址

Expanding Cards

展示效果

Expanding Cards
在这里插入图片描述

实现思路

其实很简单,就是利用flex布局中设置不同的拉伸比例来实现展开效果,通过设置一个特殊的class,这个class的拉伸比例设置为较大的值,再通过JavaScript将该class的设置与点击事件进行绑定即可实现。

实现细节

HTML结构

使用container包裹作用只是为了限制左右宽度而已,去掉container结构对样式影响不大。
container内,每个div只包含一个H3标题子元素,图片部分通过背景样式填充。

<div class="container">
     <div class="panel active" id="World">
         <h3>World</h3>
     </div>
     <div class="panel" id="Forest">
         <h3>Forest</h3>
     </div>
     <div class="panel" id="Beach">
         <h3>Beach</h3>
     </div>
     <div class="panel" id="City">
         <h3>City</h3>
     </div>
     <div class="panel" id="Mountains">
         <h3>Mountains</h3>
     </div>
 </div>

跟原项目有一些区别的是我并没有把背景图片链接直接写在div里,而是通过id在css中设置,两者其实效果一致,无非就是这样看起来HTML文件更简洁一些。

CSS样式

body部分
1. 设置flex主要是为了让元素在整个页面中都是居中显示
2. margin清零则是为了消除浏览器的用户代理样式表对显示效果的影响。
3. height设置100%视高可以让网页全屏显示,实际本地调试发现不设置也OK。

body {
	height: 100vh;
	display: flex;
	align-items: center;
	justify-content: center;
	margin: 0;
}

container部分利用flex布局来控制下面的卡片伸缩,这里需要设置一个宽度,否则子元素卡片由于父级没有设置宽度不能撑开盒子尺寸。

.container{
    display: flex;
    width: 90vw;
}

panel部分就是卡片主体
1. 设置高度,可以在这里设置,也可以再container统一设置,差别就是有margin的时候在外面设置高度要纳入计算
2. 设置flex拉伸比例flex: 0.5这里如果不设置拉伸比例默认是flex: 0 1 auto,表示不会拉伸,同时由于卡片自身没有设置宽度,子元素又因为绝对定位并不会撑开尺寸,flex布局将会使卡片尺寸缩小至0
3. 背景图片需要调整,background-size: cover表示优先考虑卡片自身尺寸将背景图覆盖,background-position: center将背景图片中心和卡片中心对齐,background-repeat: no-repeat在这里可设可不设,表示不会重复
4. 设置为相对定位是为了给子元素标题绝对定位使用
5. 设置一个特殊class,只改变flex的拉伸比例

.panel{
    height:80vh;
    flex: 0.5;
    margin: 10px;
    border-radius: 50px;
    background-size: cover;
    background-position: center;
    background-repeat: no-repeat;
    position:relative;
    transition:all 0.7s ease-in;
    cursor: pointer;
}

.panel.active{
    flex: 5;
}

不设置拉伸比例的结果,所有元素都会缩到一起,因为尺寸是0:
不设置拉伸比例的结果

panel h3卡片子元素
1. 改为绝对定位,将标题设置到卡片的左下角,这样之后脱离文档流,父元素将不再拥有基本尺寸,需要注意设置其拉伸比例。
2. 默认透明,特殊class时显示。

.panel h3{
    position: absolute;
    bottom: 20px;
    left: 20px;
    color: #fff;
    opacity: 0;
}

.panel.active h3{
    opacity: 1;
    transition:opacity 0.4s ease-in 0.3s;
}

JavaScript逻辑

将所有panel卡片绑定点击事件,回调函数中先是遍历所有元素清楚掉active的class,再给响应事件的对应卡片再加上active。

const panels = document.querySelectorAll('.panel');

const removeActiveClass = () => {
    panels.forEach(panel => panel.classList.remove('active'));
}

panels.forEach(panel => {
    panel.addEventListener('click', ()=>{
        removeActiveClass();
        panel.classList.add('active');
    })
});

最后要提醒的是,这段脚本要想生效,必须是在body内部引入,因为绑定事件的程序需要再页面加载时就要执行,而如果放在head部分,dom还没有加载出来就已经装载,也不会立即执行,只有在调用的地方才会执行,因此并不能成功给卡片绑定事件。

<body>
    <div class="container">
        <!-- elements -->
    </div>
    <script src="script.js"></script>
</body>

相关文章:

  • Go语言精修(尚硅谷笔记)第十一章
  • 【EHub_tx1_tx2_E100】不止科技NVISTAR ROC 300激光雷达Ubuntu18.04+ROS1ROS2 评测
  • WebRTC API
  • 大数据之Spark开发环境准备
  • 什么是Java运算?Java运算好学吗?
  • abaqus子程序vumat安装使用
  • 【Java项目】Minio的安装部署以及SpringBoot整合Minio
  • 架构设计第一讲:架构设计相关面试题汇总
  • LeetCode笔记:Biweekly Contest 101
  • 【python实操】马上毕业了,你还不懂什么是守护线程、线程、进程?(附12306抢票程序-源代码)
  • Springboot整合rabbitmq并实现消息可靠性和持久性
  • ChatGPT可以作为一个翻译器吗?
  • 一文学会 Spring MVC 表单标签
  • 【联邦学习(Federated Learning)】- 横向联邦学习与联邦平均FedAvg
  • 免费一键生成原创文章-原创文章批量生成
  • 【刷算法】从上往下打印二叉树
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • git 常用命令
  • GraphQL学习过程应该是这样的
  • JS函数式编程 数组部分风格 ES6版
  • Js基础知识(四) - js运行原理与机制
  • maven工程打包jar以及java jar命令的classpath使用
  • underscore源码剖析之整体架构
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 06-01 点餐小程序前台界面搭建
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (二)Eureka服务搭建,服务注册,服务发现
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (生成器)yield与(迭代器)generator
  • (转)JAVA中的堆栈
  • (转)程序员疫苗:代码注入
  • (转)项目管理杂谈-我所期望的新人
  • (转载)PyTorch代码规范最佳实践和样式指南
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .NET 反射 Reflect
  • .NET 服务 ServiceController
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • .NET构架之我见
  • .pub是什么文件_Rust 模块和文件 - 「译」
  • /etc/sudoer文件配置简析
  • @GlobalLock注解作用与原理解析
  • [ element-ui:table ] 设置table中某些行数据禁止被选中,通过selectable 定义方法解决
  • [1]-基于图搜索的路径规划基础
  • [22]. 括号生成
  • [4.9福建四校联考]