vue3 使用实现签到活动demo静态布局详解

文章目录

  • 1. 实现效果
  • 2. 签到设置7天布局
    • 2.1 实现代码
  • 3 签到设置15天布局
    • 3.1 思路分享
  • 4 完整demo代码
  • 5. 总结

1. 实现效果

实现一个签到活动的h5页面布局,需求如下

  1. 签到活动天数可配置,可配置7天,15天,30天等默认天数
  2. 要求展示2行进行展示,天数过多的时候进行横向滚动展示
  3. 要求默认第一版页面,首屏展示4个
  4. 要求比如是最后一个签到日期,最后一天签到日期的盒子默认占据两行进行展示

请添加图片描述

2. 签到设置7天布局

1.设置签到日期一共为7天,第一排展示4个,第二排展示3个,最后一个占两列布局
这个比较简单
在这里插入图片描述

2.1 实现代码

<div class="sign"><divv-for="(item, index) in arrLength":class="['item',index + 1 == arrLength && 'large']"><div class="day">第 {{ index + 1 }} 天</div></div>
</div>
<script setup lang="ts">
const arrLength = ref(7);
</script>
.sign {display: grid;grid-template-columns: repeat(4, 1fr);grid-gap: 8px;.item {/* 最后一个占两行 */&.large {grid-column: span 2;}}
}

3 签到设置15天布局

问题:当我们设置天数为15天时候,grid布局因为自适应问题,导致并没有横向滚动

const arrLength = ref(15);

在这里插入图片描述

3.1 思路分享

想要两排布局,超出横向滚动,其实就是需要动态计算 grid-template-columns 的值

比如是7天,那么 grid-template-columns 的值就应该是 repeat(4, 1fr)
比如是15天,那么 grid-template-columns 的值就应该是 repeat(8, 1fr)

so,通过一个 gridColumns 去计算值根据 Math.ceil(arrLength.value / 2) 获取

<script setup lang="ts">
const arrLength = ref(15);
const gridColumns = ref("");onMounted(async () => {// 设置一排分为多少列// Math.ceil([15/2]) = 8 结果,就是每列8个 repeat(8, 1fr)gridColumns.value = `repeat(${Math.ceil(arrLength.value / 2)}, 1fr)`;
});
</script>
<div class="sign" :style="{ gridTemplateColumns: gridColumns }">
</div>

好,在看看效果

在这里插入图片描述
嗯,虽然设置了两排布局了,但是并没用滚动,grid布局因为自适应问题,导致并没有横向滚动,所以必须也控制每个盒子的宽度

每个盒子的宽度 = 容器的宽度 / 4

so,继续撸代码,style 动态设置每个盒子的宽度

<div:style="{width:arrLength == index + 1 &&arrLength % 2 == 1? `${(signContainerWidth / 4 - 16) * 2 + 8}px`: `${signContainerWidth / 4 - 16}px`}"
><div class="day">第 {{ index + 1 }} 天</div>
</div>
<script setup lang="ts">
const signContainerRef = ref<DIVElement>(null);
const signContainerWidth = ref(0);onMounted(async () => {// 获取容器宽度signContainerWidth.value = signContainerRef.value? signContainerRef.value.offsetWidth: 0;
});
</script>

好,在看看效果,终于可以了请添加图片描述

4 完整demo代码

<template><div class="body"><div class="sign-container" ref="signContainerRef"><div class="title">签到功能</div><div class="sign" :style="{ gridTemplateColumns: gridColumns }"><divv-for="(item, index) in arrLength":class="['item',index + 1 == arrLength && arrLength % 2 == 1 && 'large']":style="{width:arrLength == index + 1 &&arrLength % 2 == 1? `${(signContainerWidth / 4 - 16) * 2 + 8}px`: `${signContainerWidth / 4 - 16}px`}"><div class="day">第 {{ index + 1 }} 天</div></div></div></div></div>
</template><script setup lang="ts">
const signContainerRef = ref<DIVElement>(null);
const arrLength = ref(15);
const signContainerWidth = ref(0);
const gridColumns = ref("");onMounted(async () => {// 设置一排分为多少列// Math.ceil([15/2]) = 8 结果,就是每列8个 repeat(8, 1fr)gridColumns.value = `repeat(${Math.ceil(arrLength.value / 2)}, 1fr)`;// 获取宽度signContainerWidth.value = signContainerRef.value? signContainerRef.value.offsetWidth: 0;
});
</script><style lang="scss" scoped>
.body {background-size: 100% 100%;min-height: 100vh;background: #7c8ac3;position: relative;.title {font-weight: bold;font-size: 24px;text-align: center;margin: 10px auto;}.sign-container {width: 100vw;position: absolute;top: 50%;transform: translateY(-50%);padding: 12px;z-index: 2;.sign {margin-top: 12px;background: #191a1e;border-radius: 4px;padding: 8px;display: grid;grid-template-columns: repeat(4, 1fr);grid-gap: 8px;overflow-x: scroll;.item {height: 113px;background: #876868;border-radius: 5px;position: relative;.day {font-size: 12px;font-family: PingFang SC, PingFang SC-Regular;text-align: center;color: #fff;line-height: 113px;margin-top: 8px;}/* 最后一个占两行 */&.large {grid-column: span 2;}}}}
}
</style>

5. 总结

虽然这个功能看上去比较简单,但是着仅仅是一个简单的demo,还要很多细节处理判断,比如

  1. 当天已签到时,展示已签到图标
  2. 当天未签到时,金币添加光圈旋转并且左右晃动动画
  3. 签到天数为8天时候,进去后默认横向滚动到第8天动画实现
    请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/504937.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Github配置ssh key的步骤

1. 检查本地主机是否已经存在ssh key 是否存在 id_rsa 和 id_rsa.pub文件&#xff0c;如果存在&#xff0c;说明已经有SSH Key 如下图所示&#xff0c;则表明已经存在 如果存在&#xff0c;直接跳到第三步 2. 生成ssh key 如果不存在ssh key&#xff0c;使用如下命令生…

数据结构篇十:红黑树

文章目录 前言1. 红黑树的概念2. 红黑树的性质3. 红黑树节点的定义4. 红黑树的插入4.1 情况一&#xff1a; cur为红&#xff0c;p为红&#xff0c;g为黑&#xff0c;u存在且为红4.2 情况二: cur为红&#xff0c;p为红&#xff0c;g为黑&#xff0c;u不存在/u存在且为黑。4.2.1 …

单源最短路的建图方式

1129. 热浪 - AcWing题库 这道题可以有三种方法来做&#xff0c;朴素版的dijkstra、堆优化版的dijkstra和spfa算法 &#xff08;1&#xff09;spfa算法 这里的队列用循环队列&#xff0c;而不是像模板那样用普通队列是因为它的队列长度不确定 import java.util.*;public class…

【论文阅读】基于图像处理和卷积神经网络的板式换热器气泡识别与跟踪

Bubble recognizing and tracking in a plate heat exchanger by using image processing and convolutional neural network 基于图像处理和卷积神经网络的板式换热器气泡识别与跟踪 期刊信息&#xff1a;International Journal of Multiphase Flow 2021 期刊级别&#xff1a;…

03、MongoDB -- MongoDB 权限的设计

目录 MongoDB 权限的设计演示前准备&#xff1a;启动 mongodb 服务器 和 客户端 &#xff1a;1、启动单机模式的 mongodb 服务器2、启动 mongodb 的客户端 MongoDB 权限的设计1、MongoDB 的每个数据库都可以保存用户&#xff0c;不止admin数据库可以保存用户。2、保存用户的数据…

JVM的内存区域划分

目录 1.什么是JVM 2.JVM内存区域划分 2.1各区域详解 2.2经典笔试题: 1.什么是JVM JVM也称为Java虚拟机,它是Java代码的运行环境,Java属于半编译半解释形的语言.它的运行环境在虚拟机上,而不是物理设备.Java这么设定主要是为了跨平台,即一套代码,多处使用.我们只需要编译出一…

技巧 文本编辑器 B列每一行数据换行合并到A列中

一. 需求背景 ⏹A列是我们制作的日文版歌词&#xff0c;B列是中文版译文歌词 现在想让B列的每一行歌词&#xff0c;按下图箭头所示插入到A列的每一行后面 二. 通过文本编辑器的替换功能解决 将Excel中的A和B列的数据复制粘贴到文本编辑器中Excel中的列和列之前是通过Tab来分隔…

Matlab|【免费】基于合作博弈的综合能源系统利益分配优化调度

目录 主要内容 部分代码 结果一览 下载链接 主要内容 该程序实现的模型为综合能源系统利益分配优化调度&#xff0c;采用合作博弈方法&#xff0c;模型针对IES系统的P2G、电解槽、甲烷反应器、储氢罐、CHP和燃气锅炉等设备进行建模&#xff0c;实现基于合作博弈的…

环形链表详解(让你彻底理解环形链表)

文章目录 一.什么是环形链表&#xff1f;二.环形链表的例题&#xff08;力扣&#xff09; 三.环形链表的延伸问题 补充 一.什么是环形链表&#xff1f; 环形链表是一种特殊类型的链表数据结构&#xff0c;其最后一个节点的"下一个"指针指向链表中的某个节点&#xff…

代码随想录【数组】 ---- 二分查找

代码随想录【数组】 ---- 二分查找 704.二分查找方法一&#xff1a;二分查找 35.搜索插入位置方法一&#xff1a;二分查找 34.在排序数组中查找元素的第一个和最后一个位置方法一&#xff1a;二分查找 69.x的平方根方法一&#xff1a;袖珍计算器方法二&#xff1a;二分查找方法…

抖音小店的产品价格怎么设置?都需要什么价位的产品?

大家好&#xff0c;我是电商花花。 做抖音小店&#xff0c;一个合理的商品的价格也可以说是非常重要的&#xff0c;价格合理才会吸引到用户这购买。 可能说到价格&#xff0c;很多人第一反应认为随便定就可以了&#xff0c;其实定价是很复杂了&#xff0c;定价定多少&#xf…

一份简单的前端开发指南

文章目录 一、HTML1、表格2、常见标签3、行内、块级4、行内块级元素 二、CSS1、三种样式2、链接样式3、浮动4、清除浮动5、伪类&#xff0c;伪元素6、position7、后代选择器8、弹性布局 三、JavaScripts1、null和undefined的区别2、var let const3、原生数据类型4、双等和三等5…