- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用 Vuejs、momentjs 和 css-grids 布局制作了一个简单的日历。但是一周从星期天开始(美式)。如何更改代码以使其从星期一开始(欧式日历)?我尝试更改 column
方法,将其递减为 2,但只正确显示八月,其他月份以错误的工作日开始。另外我想我需要以某种方式更改 css 选项 grid-template-columns
以支持星期一作为一周的第一天。
这是代码笔:https://codepen.io/moogeek/pen/oNWyWvM
const calendar = new Vue({
el: '#app',
data() {
return {
date:moment(),
days: [],
monthName: '',
}
},
methods: {
column(index) {
if (index == 0) {
return this.days[0].day() + 1
}
},
isToday(day) {
return moment().isSame(day, 'day')
},
updateMonth(){
this.monthName = this.date.format("MMMM YYYY")
let monthDate = this.date.startOf('month');
this.days = [...Array(monthDate.daysInMonth())].map((_, i) => monthDate.clone().add(i, 'day'))
},
nextMonth(){
this.date.add(1,'month')
this.updateMonth()
},
previousMonth(){
this.date.subtract(1,'month')
this.updateMonth()
},
},
mounted() {
this.updateMonth()
}
})
html {
overflow:hidden;
}
#app {
width:100%;
height:100%;
font-size: 100%;
user-select: none;
overflow:hidden;
}
.page-content {
overflow: hidden;
}
.calendar-wrap {
padding-top:4vh;
}
.calendar-header {
width: 100vw;
font-size: 170%;
text-align:center;
background-color: transparent;
}
.calendar-header .month-name, .calendar-header button{
display: inline-block;
}
.calendar-header .month-name{
color:#000;
font-size:150%;
}
.calendar-header .current-month-value {
color:#000;
}
.calendar-header .link, .calendar-header .link:hover,.calendar-header .link:active {text-decoration:none;}
.calendar-header .calendar-prev-month-button {
margin-right: 1vh;
}
.calendar-header .calendar-next-month-button {
margin-left: 1vh;
}
.calendar-wrapper {
align-items: center;
box-sizing: border-box;
display: flex;
justify-content: center;
padding: 0 2em 0 2em;
}
#calendar{
display: grid;
grid-template-columns: repeat(7, 1fr);
max-width: 1024px;
width: 100%;
transition: transform .3s ease 0s;
}
#calendar > *{
align-items: center;
display: flex;
justify-content: center;
}
#calendar > *::before {
content: "";
display: inline-block;
height: 0;
padding-bottom: 100%;
width: 1px;
}
#calendar > *.today{
color: black;
border: 0.1em solid black;
border-radius: 100%;
}
#calendar > .day {
border-radius: 100%;
margin:3px;
}
<html>
<head>
<meta charset="utf-8">
<title>Calendar</title>
</head>
<body>
<div id="app" class="page-content">
<div class="calendar-wrap">
<section class="calendar-header">
<a @click="previousMonth()"class="link icon-only calendar-prev-month-button"><i class="icon icon-prev"></i></a>
<a class="current-month-value link">{{ monthName }}</a>
<a @click="nextMonth()" class="link icon-only calendar-next-month-button"><i class="icon icon-next"></i></a>
</section>
<section id="calendar-wrapper" class="calendar-wrapper skeletons">
<main id="calendar">
<div class="weekday">S</div>
<div class="weekday">M</div>
<div class="weekday">T</div>
<div class="weekday">W</div>
<div class="weekday">T</div>
<div class="weekday">F</div>
<div class="weekday">S</div>
<div v-for="(day, index) in days"
:data-date="day.format('DD.MM.YYYY')"
:style="{ gridColumn: column(index) }"
:class="{ day, today: isToday(day) }">
<span>{{ day.format('D') }}</span>
</div>
</main>
</section>
</div>
</div>
</body>
</html>
更新。好吧,也许我找到了一个更好的解决方案,将工作日和日子包装在单独的容器中,并将 grid-column:7
属性添加到第一天的 child 。还更改了列函数,因此它不会添加额外的偏移量:
https://codepen.io/moogeek/pen/ExmRzgb
现在 8 月份的 onmount 显示正确,但如果我单击上个月/下个月,它会以某种方式克隆出 9 月的天数...请告诉我我做错了什么以及如何更正代码所以它可以正确显示所有月份:
最佳答案
我的现代解决方案 date-fns可以在github上找到:https://github.com/kissu/so-date-fns-calendar
它也托管在这里:https://so-date-fns-calendar.netlify.app/
这是实现所有这些的相关代码
<template>
<div>
<div>
<button @click="substractOneMonth">previous</button>
<span style="margin-left: 2rem">
current: {{ format(currentMonth, 'MMM yyyy') }}
</span>
<button style="margin-left: 2rem" @click="addOneMonth">next</button>
</div>
<div class="week-days">
<p v-for="weekName in weekNames" :key="weekName">{{ weekName }}</p>
</div>
<div class="days">
<p
v-for="(day, index) in daysOfCurrentMonth"
:key="day"
class="day"
:style="`grid-column: column(${index}); grid-column-start: ${
index === 0 ? weekdayOffset : '0' // basically first-child with a param
}; color: ${isToday(day) ? 'red' : 'black'};`"
>
{{ format(day, 'dd') }}
</p>
</div>
<button @click="resetToToday">Go back to today</button>
</div>
</template>
<script>
import {
startOfMonth,
addMonths,
format,
subMonths,
addDays,
startOfWeek,
sub,
add,
eachDayOfInterval,
getDay,
isToday,
} from 'date-fns'
import fr from 'date-fns/locale/fr'
export default {
data() {
return {
currentMonth: startOfMonth(new Date()),
firstDayOfWeek: startOfWeek(new Date(), {
locale: fr,
weekStartsOn: 1, // monday
}),
}
},
computed: {
previousMonth() {
return startOfMonth(subMonths(new Date(this.currentMonth), 1))
},
nextMonth() {
return startOfMonth(addMonths(new Date(this.currentMonth), 1))
},
daysOfCurrentMonth() {
return eachDayOfInterval({
start: this.currentMonth,
end: sub(this.nextMonth, { days: 1 }),
})
},
weekNames() {
return [...Array(7)].map((_, index) =>
format(addDays(this.firstDayOfWeek, index), 'EEEEEE')
)
},
weekdayOffset() {
return (getDay(this.currentMonth) + 7) % 7 || 7 // `|| 7` is basically for sunday, edge case
},
},
methods: {
format,
isToday,
substractOneMonth() {
this.currentMonth = sub(this.currentMonth, { months: 1 })
},
addOneMonth() {
this.currentMonth = add(this.currentMonth, { months: 1 })
},
resetToToday() {
this.currentMonth = startOfMonth(new Date())
},
},
}
</script>
<style scoped>
.days,
.week-days {
display: grid;
grid-template-columns: repeat(7, 50px);
grid-column: 7;
}
</style>
我在 1 年前和 1 年后检查过,一切看起来都很好。
如果您需要任何其他评论或类似信息,请告诉我!
顺便说一句,我的应用程序是 Nuxt 应用程序,因为我只是想快速旋转一些东西而且我已经习惯了,但是这里的代码与 vanilla Vue 100% 兼容。
关于javascript - 如何使用 CSS Grid、Vue 和 moment/date-fns 制作一个简单的日历,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68610561/
System.Math.MomentSkewKurtosis 声明为 procedure MomentSkewKurtosis(const Data: array of Double; var M1,
我尝试在应用程序中使用 moment.js 和 moment-timezone-with-data.js 来显示任何时区的日期。 我已将这两个 js 文件的 CDN 包含在我的 index.html
我对 Moment 函数的工作原理有点困惑(例如 startOf()、weekday() 等)。 我的问题是:如何从预定义的日期获取一周的开始? 考虑 9/21/16 上的这两个调用: moment(
阅读react-datepicker doc's后我尝试按照文档的说明更改日期选择器语言: Globally by calling moment.locale(lang) Picker-specifi
我有一个服务器生成的位置列表,采用国家/城市格式,即 Beijing London 我想使用 JS/Jquery 和 Moment Timezone 来执行此操作: 从每个项目中提取 data-tim
我有一个时刻对象和一个单独的时间字符串,如下所示: var selectedDay = moment(); var time = '6 PM'; 我想将两者结合起来,我无法从文档中弄清楚,就像这样。
我有一个时刻对象,我正在尝试添加几天。但是,它返回的结果是相同的 moment 对象。 但是,如果我只是尝试在当前日期执行此操作,则效果很好。 另外,请注意,我总是收到一个需要添加天数的时刻对象。 代
我有一个名为 date 的时刻对象: ( Tue Apr 09 2019 00:00:00 ...) 我想在最后一刻将其替换为同一天,如下所示: (Tue Apr 09 2019 23:59:59 .
目前我有一个输入字段,允许您通过输入两位数字来选择一个小时。例如,您可以选择 12 表示 12 小时。 有没有办法使用 MomentJS 将该数字转换为毫秒? 目前我必须做以下数学运算。我在 Mome
moment().format() 根据 moment().isValid() 创建无效日期 示例如下: > moment.version "2.14.1" > moment.locale() "fr
我正在使用 moment.js,但在测试 moment.js 库时,我继续收到错误。 var back30Days=moment().subtract(30, 'days').format("dddd
在使用 moment 构建 angular 8 项目时,我遇到了以下错误消息: ng build @myproject/common Error: Cannot call a namespace ('
我安装了 moment.js 库并准备稍微玩弄它,当我收到此错误时。我尝试了很多不同的东西,但没有任何效果。有任何想法吗? 我有一个文件夹,我已经将 moment.js 安装到(npm install
我有一个时间戳的初始值(在 User-1 的时区中创建),我正在从 firebase 的 firestore 中检索。其格式为 Unix 纪元的 UTC 秒数。 我的目标是获取初始时间戳值,并将其转换
有一个从元素的 innerText 设置的 startTime。然后使用 moment(startTime) 将该字符串转换为 Moment.js 对象。然后如何将其转换为以分钟为单位的数字值? Ja
我使用 moment.js 创建了一个 js 脚本,我想通过 cron 作业复制它。因此,它将使用 PHP。 所以,我搜索了 moment.js 的等价物,我找到了这个 https://github.
我得到一个文本值,它的格式如下:“9/19/2018 10:00 AM”。您将如何使用 moment.js 或仅使用 javascript 将其转换为纪元时间戳? 示例: console.log(mo
$> moment.version '2.18.1' $> moment('Mon, 02 Jan 2017 06:00:00 -0800').format() '2017-01-02T01:00:0
我有一个jsfiddle here 。 它是空白的,因为我想做的事情不起作用...... 我已经调用了适当的外部脚本。 我正在尝试将这个令人难以置信的库实现到我的网站中,但我不确定我做错了什么。 最终
我有 moment 对象,我想将其转换为格式为 dd.mm.yy 的字符串。使用 moment.js 执行此操作的最佳方法是什么? 我尝试了toString函数,但它返回的日期格式为Wed Mar 2
我是一名优秀的程序员,十分优秀!