"Tear off calendar"
Bootstrap 4.1.1 Snippet by koshikojha

<link href="//maxcdn.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css" rel="stylesheet" id="bootstrap-css"> <script src="//maxcdn.bootstrapcdn.com/bootstrap/4.1.1/js/bootstrap.min.js"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> <!------ Include the above in your HEAD tag ----------> <div class="calendar"> <div class="pages"></div> </div>
*, *::before, *::after { box-sizing: border-box; } body { display: flex; justify-content: center; align-items: center; height: 100vh; font-family: 'Zilla Slab', serif; background: linear-gradient(60deg, #f79533, #f37055, #ef4e7b, #a166ab, #5073b8, #1098ad, #07b39b, #6fba82); } overflow: hidden; } p { margin: 0 0 3px; line-height: 1; letter-spacing: 1px; pointer-events: none; } .calendar { position: relative; width: 152px; cursor: default; user-select: none; &::before, &::after { content: ''; position: absolute; top: -28px; left: 40px; width: 10px; height: 10px; border-radius: 5px; background: #ddd; z-index: 3; } &::after { left: initial; right: 40px; } } .pages { position: relative; text-align: center; background: #eee; box-shadow: 0 10px 0 0px #a5a4a4;; &::before { content: ''; position: absolute; width: 100%; height: 45px; background: indianred; bottom: 100%; left: 0; z-index: 2; } } .page { position: relative; padding: 20px 30px 15px; background: #eee; &::before { content: ''; position: absolute; bottom: 99%; left: 0; display: block; background: linear-gradient(-45deg, #eee 10px, #eee 10px, #eee 10px, transparent 0), linear-gradient(45deg, #eee 10px, transparent 0); background-position: left top; background-repeat: repeat-x; background-size: 10px 18px; height: 10px; width: 100%; } } .month, .day-name { text-transform: uppercase; font-weight: 600; } .day { font-size: 60px; font-weight: 700; margin: 0 0 15px; } .year { font-size: 12px; } .tear { position: absolute; top: 0; left: 0; width: 100%; height: 100%; z-index: 1; transform-origin: top left; box-shadow: 0 0 10px -1px rgba(0,0,0,0.5); pointer-events: none; animation: tear-animation .8s linear forwards; } @keyframes tear-animation { 0% { transform: rotate(0deg); top: 0; opacity: 1; } 20% { transform: rotate(9deg); top: 0; opacity: 1; } 70% { opacity: 1; } 100% { top: 200px; opacity: 0; } }
const pages = document.querySelector('.pages'); const locale = window.navigator.language || 'en-us' let date = new Date(); let dayNum = date.getDate(); let month = date.getMonth(); let dayName = date.toLocaleString(locale, { weekday: 'long' }); let monthName = date.toLocaleString(locale, { month: 'long' }); let year = date.getFullYear(); function daysInMonth (month, year) { return new Date(year, month + 1, 0).getDate(); } function getNewDate () { if (dayNum < daysInMonth(month, year)) { dayNum++; } else { dayNum = 1; } if (dayNum === 1 && month < 11) { month++; } else if (dayNum === 1 && month === 11) { month = 0; } if (dayNum ===1 && month === 0) { year++; } const newDate = new Date(year, month, dayNum); dayName = newDate.toLocaleString('en-us', { weekday: 'long' }); monthName = newDate.toLocaleString('en-us', { month: 'long' }); } function handleClick (e) { getNewDate(); updateCalendar(e.target); } function updateCalendar (target) { if (target && target.classList.contains('page')) { target.classList.add('tear'); setTimeout(() => { pages.removeChild(target); }, 800); } else { return; } renderPage(); } function renderPage () { const newPage = document.createElement('div'); newPage.classList.add('page'); newPage.innerHTML = ` <p class="month">${monthName}</p> <p class="day">${dayNum}</p> <p class="day-name">${dayName}</p> <p class="year">${year}</p> `; pages.appendChild(newPage); } renderPage(); pages.addEventListener('click', handleClick);

Related: See More


Questions / Comments: