vue封装个日历,样式参考vant

news2024/12/30 1:21:53

vue封装个日历,样式参考vant
结果展示
在这里插入图片描述


<template>
    <div class="report">
      <Header title="工作日历"  :isShowLeft="true" @onClickBack="goBack" />
      <div class="report-content">
        <van-icon name="arrow-left" class="img3" size="13"  @click="prevYear()" />
        <van-icon name="arrow-left" class="img1" size="13"  @click="prevMonth()" />
        <van-icon name="arrow"  class="img2" size="13"  @click="nextMonth()" />
        <van-icon name="arrow"  class="img4" size="13"  @click="nextYear()" />
          <div class="calendar">
          <div class="header">
            <span>{{ year }}{{ month }}</span>
          </div>
          <div class="box">
              <div class="box-top">
              <div class="box-top-content">
                  <div class="week-box"></div>
                  <div class="week-box"></div>
                  <div class="week-box"></div>
                  <div class="week-box"></div>
                  <div class="week-box"></div>
                  <div class="week-box"></div>
                  <div class="week-box"></div>
              </div>
              </div>
              <div class="box-bottom">
              <div class="box-mark">{{ month }}</div>
              <div class="box-bottom-content" v-for="(week, index) in weeks" :key="index">
                  <div class="box-bottom-content-box" v-for="(day, i) in week" :key="i" :class="{ today: day.today, selected: day.selected }" @click="selectDay(day)">
                  {{ day.date && day.date.getDate() }}
                  </div>
              </div>
              </div>
          </div>
          </div>
      </div>
      <FloatIcons :padding="'10 10 60 10'" class="icons-warp">
        <div @click="backToday">
          <div class="float-icon-item">
            <span style="font-size: 15px;"></span>
          </div>
        </div>
      </FloatIcons>
    </div>
    
  </template>
  
  <script>
  import Header from "@/components/header/Header.vue";
  import { useRouter } from 'vue-router'
  import FloatIcons from "@/components/s-icons";
  export default {
    components:{
        Header,
        FloatIcons
    },
    data() {
      return {
        router: useRouter(),
        year: new Date().getFullYear(),
				month: new Date().getMonth() + 1 ,
        selectedDate: null,
      };
    },
    computed: {
      weeks() {
        const weeks = [];
        const firstDayOfMonth = new Date(this.year, this.month - 1, 1);
        const lastDayOfMonth = new Date(this.year, this.month, 0);
        const daysInMonth = lastDayOfMonth.getDate();
        let dayOfWeek = firstDayOfMonth.getDay();
        let date = 1;
  
        for (let i = 0; i < 6; i++) {
          const week = [];
  
          for (let j = 0; j < 7; j++) {
            if (i === 0 && j < dayOfWeek) {
              week.push({ date: null });
            } else if (date > daysInMonth) {
              week.push({ date: null });
            } else {
              const today = new Date();
              const selected = this.selectedDate && this.selectedDate.getTime() === new Date(this.year, this.month - 1, date).getTime();
              week.push({ date: new Date(this.year, this.month - 1, date), today: today.getTime() === new Date(this.year, this.month - 1, date).getTime(), selected });
              date++;
            }
          }
  
          weeks.push(week);
        }
        return weeks.filter((e, i) => i === 5 ? !!e[0].date : true);
      },
    },
    mounted(){
      this.setSelectDate()
    },
    methods: {
      setSelectDate(){
        this.selectedDate = new Date(this.year, this.month - 1, this.selectedDate?.getDate() || new Date().getDate())
      },
      prevMonth() {
        if (this.month === 1) {
          this.year--;
          this.month = 12;
        } else {
          this.month--;
        }
        this.setSelectDate()
      },
      prevYear(){
        this.year--;
        this.setSelectDate()
      },
      nextMonth() {
        if (this.month === 12) {
          this.year++;
          this.month = 1;
        } else {
          this.month++;
        }
        this.setSelectDate()
      },
      nextYear(){
        this.year++;
        this.setSelectDate()
      },
      selectDay(day) {
        if (day.date) {
          this.selectedDate = day.date;
        }
      },
      /** 返回 */
      goBack(){
          this.router.go(-1)
      },
      /** 返回今天 */
      backToday(){
        this.year = new Date().getFullYear()
				this.month = new Date().getMonth() + 1 
        this.selectedDate = new Date(this.year, this.month - 1, new Date().getDate())
      
      },
    },
  };
  </script>
  
<style  scoped lang="less">
.report{
    height: 100%;
    width: 100%;
    /* background: #F3F8FC; */
    .report-content{
        height: calc(~'100% - 46px');
        width: 100%;
        position: relative;
        // overflow: scroll;
        .calendar {
            font-family: Arial, sans-serif;
            /* width: 238px; */
            background: #fff;
            margin: 0 auto;
            .header {
                display: flex;
                justify-content: center;
                align-items: center;
                margin-bottom: 10px;
                height: 34px;
            }
            .header span {
                background-color: transparent;
                font-size: 18px;
            }
            .box {
                width: 100%;
                border-collapse: collapse;
                padding: 0;
            }
            .box-top{
              box-shadow:  0 2px 10px rgba(125, 126, 128, .16);;
            }
            .box-top-content {
                display: flex;
                justify-content: space-between;
            }
            .box-top-content > div {
                width: 34px;
                height: 34px;
                display: flex;
                justify-content: center;
                align-items: center;
            }
            .box-mark{
              position: absolute;
              top: 164px;
              left: 50%;
              z-index: 0;
              color: red;
              font-size: 160px;
              transform: translate(-50%,-50%);
              pointer-events: none;
            }
            .box-bottom {
                display: flex;
                flex-direction: column;
            }
            .box-bottom-content {
                display: flex;
                justify-content: space-between;
            }
            .box-bottom-content-box {
                width: 34px;
                height: 34px;
                display: flex;
                justify-content: center;
                align-items: center;

                position: relative;
    
                font-size: 14px;
                font-family: PingFangSC, PingFangSC-Regular;
                font-weight: 400;
                text-align: center;
                // line-height: 34px;
            }
            
            .today {
                background-color: #eee;
            }
            
            .selected {
                background-color: #007bff;
                color: #fff;
                border-radius: 50%;
            }
        }
    }
}
.week-box{
    opacity: 0.65;
    font-size: 14px;
    font-family: PingFangSC, PingFangSC-Medium;
    font-weight: 500;
    color: #666666;
}
.img1,
	.img2,
    .img3,
    .img4 {
		width: 22px;
		height: 22px;
    line-height: 22px;
    position: absolute;
		top: 8px;
		background: #f2f2f2;
		border-radius: 6px;
	}

	.img1 {
		left: 85px;
	}

	.img2 {
		right: 85px;
	}
    .img3 {
		left: 45px;
	}

	.img4 {
		right: 45px;
	}
  
  .icons-warp {
  border-radius: 20px;
  background-color: #99a9bf;
  z-index: 99999;
  height: 35px;
  line-height: 35px;
  width: 35px;
  border-radius: 50%;
}
  
  
</style>
  

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

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

相关文章

Vue 菜单导航栏,轮播图

导航菜单栏结构和样式代码实现 一级导航栏 views/HomeView.vue <template><div><Shortcut></Shortcut><Header></Header><div class"inner"><Navigation></Navigation></div><div>我是主页&l…

多人协作使用git如何解决冲突?

什么情况会产生冲突 git merge XXX(合并分支时的冲突)&#xff1a; 当你尝试将一个分支的更改合并到另一个分支时&#xff0c;如果两个分支都修改了相同的文件的相同部分&#xff0c;Git 将无法自动解决冲突&#xff0c;因此会发生冲突。你需要手动解决这些冲突&#xff0c;然后…

外汇天眼:在2023年Expo上探索金融科技的未来!

从2020年初至2022年年底&#xff0c;全球范围内爆发的新冠疫情蔓延&#xff0c;对各国经济造成了严重冲击&#xff0c;导致贸易活动几近停滞&#xff0c;国际人员流动受限&#xff0c;产业链陷入危机。为应对这一局面&#xff0c;美欧经济体采取了前所未有的扩张性财政和货币政…

【已解决】取消 el-aside 默认宽度|不再用 !important

文章目录 问题原因解决方法 问题原因 element-ui 的 el-aside 组件有 width props&#xff0c;默认为 300px 解决方法 给 el-aside 标签添加 width"" width 为空&#xff08;不正确的css样式/写法&#xff09;样式将会失效。 就可以在 style 中修改 el-aside 宽…

【小尘送书-第十期】《ChatGPT进阶:提示工程入门》

大家好&#xff0c;我是小尘&#xff0c;欢迎你的关注&#xff01;大家可以一起交流学习&#xff01;欢迎大家在CSDN后台私信我&#xff01;一起讨论学习&#xff0c;讨论如何找到满意的工作&#xff01; &#x1f468;‍&#x1f4bb;博主主页&#xff1a;小尘要自信 &#x1…

Windows原生蓝牙编程 第一章 获取本地蓝牙并扫描周围蓝牙信息并输出【C++】

蓝牙系列文章目录 第一章 获取本地蓝牙并扫描周围蓝牙信息并输出 文章目录 前言头文件一、获取本地蓝牙的句柄和信息1.1 wstring转string1.2 获取MAC地址1.3 扫描附近设备并输出1.4 主函数 二、全部代码三、输出结果编译并运行查看结果 MAC地址我就打个码v ![在这里插入图片描述…

拼多多商品数据分析接口|竞品分析接口|支持高并发|拼多多商品价格|拼多多商品优惠券|拼多多已拼人数|API接口申请指南

拼多多提供了一些API接口&#xff0c;可以通过这些接口获取拼多多的商品数据。具体使用方法如下&#xff1a; 获取API接口提供的URL。在API文档中&#xff0c;可以找到获取商品信息的API接口URL。 根据需要获取的信息&#xff0c;选择响应的API。例如&#xff0c;如果想获取商…

AD教程(二)元件库(原理图库)介绍及电阻容模型的创建

AD教程&#xff08;二&#xff09;元件库&#xff08;原理图库&#xff09;介绍及电阻容模型的创建 元件模型组成 主要由元件边框、管脚&#xff08;包括管脚序号和管脚名称&#xff09;、元件名称和元件说明组成&#xff0c;对尺寸大小没有严格要求&#xff0c;注意耦合&…

视频无痕去水印怎么去,这三个神器轻松去除

视频无痕去水印怎么去&#xff1f;各位小伙伴在初学剪视频的时候是不是和我一样经常会碰到一个烦人的问题&#xff1a;在网上找到的视频素材总是带着讨厌的水印&#xff0c;不仅影响美观还挡住了视频的一些部分&#xff0c;让人特别不爽&#xff0c;我想各位遇到这种情况的时候…

vue3中,使用html2canvas截图包含视频、图片、文字的区域

需求&#xff1a;将页面中指定区域进行截图&#xff0c;区域中包含了图片、文字、视频。 第一步&#xff0c;先安装 npm install html2canvas第二步&#xff0c;在页面引入&#xff1a; import html2canvas from html2canvas;第三步&#xff0c;页面使用&#xff1a; 1&…

实现接口自动化测试

最近接到一个接口自动化测试的case&#xff0c;并展开了一些调研工作&#xff0c;最后发现&#xff0c;使用pytest测试框架并以数据驱动的方式执行测试用例&#xff0c;可以很好的实现自动化测试。这种方式最大的优点在于后续进行用例维护的时候对已有的测试脚本影响很小。当然…

2023/10/30 JAVA学习

JAVA浮点型运算会出现精度问题 如果没break,不会立刻停止,会执行下一个语句,并且不会判断条件,执行完后break 也可以这样写定义动态数组 两个变量地址相同,指向了同一个数组对象,所以更改一个另一个也会进行更改 方法其实就是函数 OUT: 外部标签,一种神奇的方式, print是输出括…

软考系统架构师知识点集锦七:计算机系统基础知识

一、考情分析 二、考点精讲 2.1计算机系统概述 2.1.1计算机系统组成 2.1.2 存储系统 时间局部性:指程序中的某条指令一旦执行&#xff0c;不久以后该指令可能再次执行,典型原因是由于程序中存在着大量的循环操作。 空间局部性:指一旦程序访问了某个存储单元&#xff0c;不久…

ICS T8310输入输出模块

输入输入模块&#xff08;Input/Output Modules&#xff0c;简称I/O模块&#xff09;是产业自动化和掌握体系中的症结组件&#xff0c;用于衔接传感器、履行器和掌握装备&#xff0c;以兑现数据收罗、监测和掌握。以下是输入输入模块的一些主要特征&#xff1a; 多通道输入和输…

新手如何重装Win10系统?新手一键重装Win10系统教程

新手如何重装Win10系统&#xff1f;新手用户不是很了解专业的系统知识&#xff0c;自己重装系统的难度会比较大&#xff0c;所以特别想知道适合新手的重装方法。接下来小编给大家介绍关于新手用户重装Win10系统的简单步骤教程&#xff0c;帮助更多的新手用户完成Win10系统的重装…

数据结构(三):栈及面试常考的算法

一、栈介绍 1、定义 栈也是一种数据呈线性排列的数据结构&#xff0c;不过在这种结构中&#xff0c;我们只能访问最新添加的数据。从栈顶放入元素的操作叫入栈&#xff0c;取出元素叫出栈。 2、优缺点及使用场景 优点&#xff1a;高效的操作、简单易用、空间效率高等 缺点&…

【C语言实现扫雷小游戏——可展开一片】

文章目录 1. 游戏分析和设计1.1扫雷游戏的功能说明1.2数据结构的分析与设计 2.代码实现2.1基本框架2.2初始化棋盘2.3打印棋盘2.4布置雷2.4统计周围雷的个数2.5排查雷2.6展开一片 3.完成代码3.1game.h3.2 game.c3.3test.c 学习完了函数和数组&#xff0c;让我们做个扫雷小游戏巩…

怎样才能把视频号的视频保存到相册,怎么下载视频号视频两个方法轻松解决

在微信客户端想要下载视频号视频却不知道怎么保存到本地相册&#xff1f;让不少网友犯了难&#xff0c;不用在纠结怎么样才可以将视频号视频下载下来&#xff0c;今天就分享两个小程序将视频号视频提取出来&#xff0c;另外在告诉大家一个下载技巧&#xff0c;一定要看到到结尾…

【Leetcode】 94. 二叉树的中序遍历

给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2] 示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[] 示例 3&#xff1a; 输入&#xff1a;root [1] 输出&#xff1a;[1] 提…