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

news2024/11/24 19:28:48

文章目录

  • 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">
  <div
    v-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 }">
        <div
          v-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.coloradmin.cn/o/1489041.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

利用Python自动化日常任务

在快节奏的现代生活中&#xff0c;时间就是一切。幸运的是&#xff0c;Python提供了一系列强大的库和工具&#xff0c;可以帮助我们自动化那些乏味且重复的任务&#xff0c;从而释放我们的时间&#xff0c;让我们可以专注于更有创造性和有意义的工作。下面&#xff0c;我们将探…

MySQL的初学者教程—Navicat的基本操作方法

MySQL的初学者教程—Navicat的基本操作方法 1、运行Navicat 双击桌面的Navicat 12 for MySQL。 2、新建MySQL连接 点击【测试连接】。 zyyMySQL的连接创建成功&#xff01; 3、新建数据库 4、新建表 点击【保存】 表【usermanage】建好了。 点【usermanage】的鼠标右键&#…

chatgpt-next-web搭建教程,超低成本部署属于自己的ChatGPT

随着AI的应用变广&#xff0c;各类AI程序已逐渐普及&#xff0c;尤其是在一些日常办公、学习等与撰写/翻译文稿密切相关的场景&#xff0c;大家都希望找到一个适合自己的稳定可靠的ChatGPT软件来使用。 ChatGPT-Next-Web就是一个很好的选择。它是一个Github上超人气的免费开源…

06、MongoDB -- MongoDB 基本用法(删除文档、查询文档、查询运算符)

目录 MongoDB 基本用法演示前提&#xff1a;登录单机模式的 mongodb 服务器命令登录【admin】数据库的 mongodb 客户端命令登录【test】数据库的 mongodb 客户端命令 删除文档语法格式两个变体版本&#xff1a;1、remove&#xff1a;根据【name】字段删除一条文档2、deleteOne&…

pyqt程序打包成exe最新版保姆级教程

运行环境&#xff1a;win10、pycharm、pyqt5、pyinstaller 要求&#xff1a;将下面软件转换为可执行的exe文件&#xff0c;发送给别人使用。 操作步骤&#xff1a; 1、main.py为我们要转换的代码文件&#xff0c;icon中放着我们exe程序的图标&#xff08;注意&#xff1a;图标…

Stable Diffusion 模型分享:3D Animation Diffusion(3D动漫)

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八 下载地址 模型介绍 3D Animation Diffusion 是 Lykon 大神的 3D 动漫模型。 作者述&#xff1a;在迪士尼、皮…

CentOS7配置静态IP地址以及主机名

配置静态IP [rootwyx ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33TYPE"Ethernet" PROXY_METHOD"none" BROWSER_ONLY"no" BOOTPROTO"static" #将dhcp修改为static DEFROUTE"yes" IPV4_FAILURE_FATAL"no"…

神经网络3-时间卷积神经网络

在深度学习的知识宝库中&#xff0c;卷积神经网络&#xff08;CNN&#xff09;广泛应用于视觉&#xff0c;视频等二维或者多维的图像领域。卷积网络具有深度&#xff0c;可并行等多种优良特性&#xff0c;那么这种技术是否可以应用于解单维度的时间序列问题呢&#xff1f;本文介…

微信小程序中使用特使字体

1、首先下载字体文件 推荐几个常用下载字体的网站 https://font.chinaz.com/zhongwenziti.html https://www.hellofont.cn/ 2、转换字体 使用下面这个网站进行字体转换 https://transfonter.org/ 点击add fonts 按钮进行上传刚刚下载的字体文件选择formats格式&#xff1a;可…

数学建模【灰色关联分析】

一、灰色关联分析简介 一般的抽象系统,如社会系统、经济系统、农业系统、生态系统、教育系统等都包含有许多种因素&#xff0c;多种因素共同作用的结果决定了该系统的发展态势。人们常常希望知道在众多的因素中&#xff0c;哪些是主要因素&#xff0c;哪些是次要因素;哪些因素…

IO接口 2月5日学习笔记

1.fgetc 用于从文件中读取一个字符&#xff0c;fgetc 函数每次调用将会返回当前文件指针所指向的字符&#xff0c;并将文件指针指向下一个字符。 int fgetc(FILE *stream); 功能: 从流中读取下一个字符 参数: stream:文件流指针 返回值: …

Vue3 isProxy,isReactive,isReadonly 三者解析

1、isProxy 作用&#xff1a;判断当前数据是否为代理数据。 注意&#xff1a;它只对通过 reactive&#xff0c;readonly&#xff0c;shallowReactive&#xff0c;shallowReadonly 这四个方法包裹的数据返回true&#xff0c;对于 ref 以及通过 new Proxy 代理的数据返回都是fal…

支持向量机 SVM | 线性可分:硬间隔模型公式推导

目录 一. SVM的优越性二. SVM算法推导小节概念 在开始讲述SVM算法之前&#xff0c;我们先来看一段定义&#xff1a; 支持向量机(Support VecorMachine, SVM)本身是一个二元分类算法&#xff0c;支持线性分类和非线性分类的分类应用&#xff0c;同时通过OvR或者OvO的方式可以应用…

前端学习之HTML(第一天)

什么是HTML HTML是一种用来描述网页的一种语言&#xff0c;HTML不是一种编程语言&#xff0c;而是一种标记语言。 HTML标签 HTML 标签是由尖括号包围的关键词&#xff0c;比如 <html> HTML 标签通常是成对出现的&#xff0c;比如 <b> 和 </b> 标签对中的…

GraphPad Prism 10: 你的数据,我们的魔法 mac/win版

GraphPad Prism 10是GraphPad Software公司推出的一款功能强大的数据分析和可视化软件。它集数据整理、统计分析、图表制作和报告生成于一体&#xff0c;为科研工作者、学者和数据分析师提供了一个高效、便捷的工作平台。 GraphPad Prism 10软件获取 Prism 10拥有丰富的图表类…

【算法分析与设计】组合

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;算法分析与设计 ⛺️稳中求进&#xff0c;晒太阳 题目 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 示例 1&…

2023四色方法_RDHEI_Using_Four-Color_Approach

RRBE 仅供自己做学习笔记使用&#xff0c;切勿转载&#xff0c;如有侵权联系立删&#xff01; 一、创新 1、首次将四色定理应用在图像处理领域&#xff1b; 2、扩展了四色定理&#xff0c;以方便RDHEI。 二、四色定理 四色问题的内容&#xff1a;“任何一张地图只用四种颜…

Vue+SpringBoot打造高校学生管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 学生管理模块2.2 学院课程模块2.3 学生选课模块2.4 成绩管理模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 学生表3.2.2 学院课程表3.2.3 学生选课表3.2.4 学生成绩表 四、系统展示五、核心代码5.1 查询课程5.2 新…

Flutter输入框换行后自适应高度

Flutter输入框换行后输入框高度随之增加 效果 设计思想 通过TextEditingController在build中监听输入框&#xff0c;输入内容后计算输入框高度然后自定义适合的值&#xff0c;并且改变外部容器高度达到自适应高度的目的 参考代码 //以下代码中的值只适用于案例&#xff0c;…

深入理解快速排序算法:从原理到实现

目录 1. 引言 2. 快速排序算法原理 3. 快速排序的时间复杂度分析 4. 快速排序的应用场景 5. 快速排序的优缺点分析 5.1 优点&#xff1a; 5.2 缺点&#xff1a; 6. Java、JavaScript 和 Python 实现快速排序算法 6.1 Java 实现&#xff1a; 6.2 JavaScript 实现&#…