194 lines
4.9 KiB
HTML
194 lines
4.9 KiB
HTML
<!DOCTYPE html>
|
|
<html>
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta content="width=device-width,initial-scale=1.0" name="viewport">
|
|
</head>
|
|
<style>
|
|
* {
|
|
font-family: sans;
|
|
box-sizing:border-box;
|
|
}
|
|
body,html{
|
|
background-color:#ffa;
|
|
margin:0;
|
|
padding:0
|
|
}
|
|
|
|
.infinityScroll{
|
|
height:50vh;
|
|
overflow:scroll;
|
|
position:relative;
|
|
}
|
|
|
|
* {
|
|
font-family: sans;
|
|
}
|
|
|
|
|
|
/* disable pinch-zoom*/
|
|
:root {
|
|
touch-action: pan-x pan-y;
|
|
height: 100%
|
|
}
|
|
|
|
.monthview {
|
|
background-color:rgba(255,255,255,0.5);
|
|
border:2px solid rgba(0,0,0,0.5);
|
|
border-radius: 10%;
|
|
margin:5px;
|
|
min-height: 20vw;
|
|
/*margin:5px;*/
|
|
/* scroll-snap-align: center;*/
|
|
overflow:hidden;
|
|
}
|
|
|
|
.label{
|
|
background-color:#a44;
|
|
color:#fff;
|
|
font-size:10vw;
|
|
text-align:center;
|
|
}
|
|
|
|
.days{
|
|
display: grid;
|
|
width: 100%;
|
|
grid-template-columns: repeat(7, 1fr);
|
|
}
|
|
|
|
.days div {
|
|
text-align:center;
|
|
height: 2cm;
|
|
align:content;
|
|
border:1px solid grey;
|
|
}
|
|
.weekend{
|
|
color:red;
|
|
background-color:white;
|
|
}
|
|
|
|
#mainDiv{
|
|
box-sizing:border-box;
|
|
margin:0;
|
|
/* scroll-snap-type: y mandatory;*/
|
|
height:100vh;
|
|
overflow:scroll;
|
|
margin:0;
|
|
width:100vw;
|
|
}
|
|
|
|
.orig{
|
|
box-shadow: 0 0 10px grey;
|
|
}
|
|
|
|
</style>
|
|
<body>
|
|
<div id="mainDiv" class="infinityScroll"></div>
|
|
|
|
<script>
|
|
window.addEventListener("load",()=>{
|
|
|
|
var locale = window.navigator.userLanguage || window.navigator.language || "en";
|
|
|
|
function createMonthView(date = new Date()){
|
|
var monthviewDiv = document.createElement("div")
|
|
monthviewDiv.className = "monthview";
|
|
var labelDiv = document.createElement("div");
|
|
labelDiv.textContent = date.toLocaleString(locale,{"month":"long","year":"numeric"})
|
|
labelDiv.className = "label"
|
|
monthviewDiv.appendChild(labelDiv);
|
|
var daysDiv = document.createElement("div");
|
|
daysDiv.className="days";
|
|
monthviewDiv.appendChild(daysDiv);
|
|
monthviewDiv.scrollIntoView();
|
|
var day = new Date(date);
|
|
day.setDate(1);
|
|
while(day.getMonth() == date.getMonth()){
|
|
var dayDiv = document.createElement("div");
|
|
dayDiv.className = "day";
|
|
var column = day.getDay();
|
|
column = column == 0 ? 7: column;
|
|
if(column>=6){
|
|
dayDiv.classList.add("weekend");
|
|
}
|
|
dayDiv.style.gridColumn = column;
|
|
dayDiv.textContent = day.getDate()
|
|
daysDiv.appendChild(dayDiv);
|
|
day.setDate(day.getDate()+1);
|
|
}
|
|
return monthviewDiv;
|
|
}
|
|
|
|
|
|
function makeInfinityScroll(element){
|
|
element.nn=element.nn||{"position":0};
|
|
var mdate;
|
|
|
|
for(var i = -3; i< 3; i++){
|
|
mdate = new Date();
|
|
mdate.setMonth(mdate.getMonth()+i);
|
|
var nextMonth=createMonthView(mdate);
|
|
nextMonth.nnindex=i;
|
|
element.appendChild(nextMonth);
|
|
nextMonth.classList.add('orig');
|
|
}
|
|
|
|
element.children[3].scrollIntoView({block:"center"});
|
|
|
|
|
|
element.addEventListener("scroll",()=>{
|
|
if(element.scrollUpdateSchedule!=1){
|
|
element.scrollUpdateSchedule=1;
|
|
|
|
requestAnimationFrame(()=>{
|
|
element.scrollUpdateSchedule=0;
|
|
if(element.scrollTop < 3* element.clientHeight)
|
|
{
|
|
var beforeind=0;
|
|
if(element.firstChild.nnindex){
|
|
beforeind = element.firstChild.nnindex
|
|
}
|
|
mdate = new Date();
|
|
mdate.setMonth(mdate.getMonth()+beforeind-1);
|
|
var newBefore = createMonthView(mdate);
|
|
newBefore.nnindex=beforeind-1;
|
|
element.insertBefore(newBefore,element.firstChild);
|
|
|
|
while(element.scrollHeight>50*element.clientHeight){
|
|
element.lastChild.remove();
|
|
}
|
|
|
|
|
|
}
|
|
|
|
if(element.scrollTop > element.scrollHeight - 4* element.clientHeight)
|
|
{
|
|
var afterind=0;
|
|
if(element.lastChild.nnindex){
|
|
afterind = element.lastChild.nnindex
|
|
}
|
|
mdate = new Date();
|
|
mdate.setMonth(mdate.getMonth()+afterind+1);
|
|
var newAfter = createMonthView(mdate);
|
|
newAfter.nnindex=afterind+1;
|
|
element.appendChild(newAfter);
|
|
|
|
while(element.scrollHeight>50*element.clientHeight){
|
|
element.firstChild.remove();
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
}
|
|
},false);
|
|
}
|
|
|
|
document.querySelectorAll('.infinityScroll').forEach(makeInfinityScroll);
|
|
|
|
},false);
|
|
|
|
window.addEventListener("error",(error)=>{ document.body.innerHTML = "<h1>error</h1><pre>" + error.filename + "\nline:" + error.lineno + "\n"+error.message +"</pre>"; },false);
|
|
</script>
|
|
</body>
|
|
</html>
|