【HTMLとCSSとJavaScript】月ごとに変わるお掃除当番表

いろいろ参考にして、
月ごとに変動するお掃除当番表を作りました。
HTMLとCSSとJavaScriptを使用しています。

HTML

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
    <title>今月のお掃除</title> 
</head>
<body>

<div>
<h2 style="text-align:center"><span id="kongetu"></span>月のお掃除</h2>

<div class="box">
    <div class="chart_souji_soto">
        <div class="label_shouji label_shouji-1">掃除1</div>
        <div class="label_shouji label_shouji-2">掃除2</div>
        <div class="label_shouji label_shouji-3">掃除3</div>
        <div class="label_shouji label_shouji-4">掃除4</div>
        <div class="label_shouji label_shouji-5">掃除5</div>
    </div>
    <div class="chart_souji">
    </div>
    <div class="chart_tantou">
    <!-- <div id="chart_tantou_css" class="chart_tantou"> -->
        <div class="label_tantou label_tantou-1"><ui id="pid0"></ui></div>
        <div class="label_tantou label_tantou-2"><ui id="pid1"></ui></div>
        <div class="label_tantou label_tantou-3"><ui id="pid2"></ui></div>
        <div class="label_tantou label_tantou-4"><ui id="pid3"></ui></div>
        <div class="label_tantou label_tantou-5"><ui id="pid4"></ui></div>
    </div>
</div>

<script src="touban.js"></script>

<script type="text/javascript">
    document.getElementById("kongetu").innerHTML = showDay();
    function showDay() {
        var now = new Date();
        let month = nowdate.getMonth() + 1
         ;
        return month;
    }
</script>

<link rel="stylesheet" href="touban.css">

</body>
</html>

CSS

:root {
  --r: 100px;
  --r_soto: 240px;
  --r_tantou: 75px;
 }

 body {
  font-family: "MS ゴシック" ;
  }
  

 .box{
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%,-50%);
}

/* 掃除内容の円の外側に凡例を置くための、透明の円のCSS */
.chart_souji_soto {
  position: relative;
   width: calc(var(--r_soto) * 4);
   height: calc(var(--r_soto) * 4);
   border-radius: 50%;
   background-image: conic-gradient(
     #009afa00 0% 20%,
     #2daaf800 20% 40%,
     #63c3ff00 40% 60%,
     #8fd3fd00 60% 80%,
     #bae5ff00 80% 100%
   );
}

/* 掃除内容の円のCSS */
.chart_souji {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: calc(var(--r) * 4);
height: calc(var(--r) * 4);
border-radius: 50%;
background-image: conic-gradient(
  #009afa 0% 20%,
  #2daaf8 20% 40%,
  #63c3ff 40% 60%,
  #8fd3fd 60% 80%,
  #bae5ff 80% 100%
);
}

/* 掃除内容のラベルのCSS */
.label_shouji {
  position: absolute;
  top: 50%;
  left: 50%;
  font-size: calc(var(--r) * 0.25);
  color: midnightblue;
}

.label_shouji-1 {
  --start: 0;
  --end: 0.2;
  --percentage: calc((var(--start) + var(--end)) / 2);
  --angle: calc(var(--percentage) * 360deg);
  --deg: calc(-90deg + var(--angle));
  translate: calc(cos(var(--deg)) * var(--r_soto) - 50%) calc(sin(var(--deg)) * var(--r_soto)  - 50%) ;
}

.label_shouji-2 {
  --start: 0.2;
  --end: 0.4;
  --percentage: calc((var(--start) + var(--end)) / 2);
  --angle: calc(var(--percentage) * 360deg);
  --deg: calc(-90deg + var(--angle));
  translate: calc(cos(var(--deg)) * var(--r_soto) - 50%) calc(sin(var(--deg)) * var(--r_soto)  - 50%) ;
}

.label_shouji-3 {
  --start: 0.4;
  --end: 0.6;
  --percentage: calc((var(--start) + var(--end)) / 2);
  --angle: calc(var(--percentage) * 360deg);
  --deg: calc(-90deg + var(--angle));
  translate: calc(cos(var(--deg)) * var(--r_soto) - 50%) calc(sin(var(--deg)) * var(--r_soto)  - 50%) ;
}

.label_shouji-4 {
  --start: 0.6;
  --end: 0.8;
  --percentage: calc((var(--start) + var(--end)) / 2);
  --angle: calc(var(--percentage) * 360deg);
  --deg: calc(-90deg + var(--angle));
  translate: calc(cos(var(--deg)) * var(--r_soto) - 50%) calc(sin(var(--deg)) * var(--r_soto)  - 50%) ;
}

.label_shouji-5 {
  --start: 0.8;
  --end: 1;
  --percentage: calc((var(--start) + var(--end)) / 2);
  --angle: calc(var(--percentage) * 360deg);
  --deg: calc(-90deg + var(--angle));
  translate: calc(cos(var(--deg)) * var(--r_soto) - 50%) calc(sin(var(--deg)) * var(--r_soto)  - 50%) ;
}

/* 担当者の円のCSS */
.chart_tantou {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: calc(var(--r_tantou) * 4);
  height: calc(var(--r_tantou) * 4);
  border-radius: 50%;
  background-image: conic-gradient(
    #ffffbc 0% 20%,
    #bcffbc 20% 40%,
    #bcffff 40% 60%,
    #bcbcff 60% 80%,
    #ffbcff 80% 100%
  );
}

/* 担当者のラベルのCSS */
.label_tantou {
  position: absolute;
  top: 50%;
  left: 50%;
  font-size: calc(var(--r_tantou) * 0.35);
  color: midnightblue;
}

.label_tantou-1 {
  --start: 0;
  --end: 0.2;
  --percentage: calc((var(--start) + var(--end)) / 2);
  --angle: calc(var(--percentage) * 360deg);
  --deg: calc(-90deg + var(--angle));
  translate: calc(cos(var(--deg)) * var(--r_tantou) - 50%) calc(sin(var(--deg)) * var(--r_tantou)  - 50%) ;
}

.label_tantou-2 {
  --start: 0.2;
  --end: 0.4;
  --percentage: calc((var(--start) + var(--end)) / 2);
  --angle: calc(var(--percentage) * 360deg);
  --deg: calc(-90deg + var(--angle));
  translate: calc(cos(var(--deg)) * var(--r_tantou) - 50%) calc(sin(var(--deg)) * var(--r_tantou)  - 50%) ;
}

.label_tantou-3 {
  --start: 0.4;
  --end: 0.6;
  --percentage: calc((var(--start) + var(--end)) / 2);
  --angle: calc(var(--percentage) * 360deg);
  --deg: calc(-90deg + var(--angle));
  translate: calc(cos(var(--deg)) * var(--r_tantou) - 50%) calc(sin(var(--deg)) * var(--r_tantou)  - 50%) ;
}

.label_tantou-4 {
  --start: 0.6;
  --end: 0.8;
  --percentage: calc((var(--start) + var(--end)) / 2);
  --angle: calc(var(--percentage) * 360deg);
  --deg: calc(-90deg + var(--angle));
  translate: calc(cos(var(--deg)) * var(--r_tantou) - 50%) calc(sin(var(--deg)) * var(--r_tantou)  - 50%) ;
}

.label_tantou-5 {
  --start: 0.8;
  --end: 1;
  --percentage: calc((var(--start) + var(--end)) / 2);
  --angle: calc(var(--percentage) * 360deg);
  --deg: calc(-90deg + var(--angle));
  translate: calc(cos(var(--deg)) * var(--r_tantou) - 50%) calc(sin(var(--deg)) * var(--r_tantou)  - 50%) ;
}

JavaScript

//担当者を回していくためのスクリプト
let shoki_date =  "2024/4/1"; //掃除当番表を始める年月(1日始まりにする)
let tantou = ["担当1", "担当2", "担当3", "担当4", "担当5"]; //担当者の初期値
let r =  "100px";
let r_soto =  "240px";
let r_tantou =  "75px";

//担当者の色
let tantou_color = ['#ffffbc','#bcffbc','#bcffff','#bcbcff','#ffbcff'];

//ここで経過月を算出
//まずは今月の1日の日付取得
let nowdate = new Date();

let year = nowdate.getFullYear();
let month = nowdate.getMonth() + 1;
let day = nowdate.getDate();
let dayofweek = nowdate.getDay();

let noe_date_tuitati = new Date(year + '/' + month + '/1');

//「掃除当番表を始める年月」からの経過月を取得
let keikatuki =  funGetKeikaDate(shoki_date, noe_date_tuitati)

let new_tantou = new Array();
let new_tantou_color = new Array();
for (let i = 0; i < keikatuki; i++) {
    new_tantou = []
    for (let j = 4; j >= 0; j--) {
        new_tantou[j] =  tantou[j-1];
    }
    new_tantou[0] =  tantou[4]
    tantou = new_tantou;

    new_tantou_color = []
    for (let j = 4; j >= 0; j--) {
        new_tantou_color[j] =  tantou_color[j-1];
    }
    new_tantou_color[0] =  tantou_color[4]
    tantou_color = new_tantou_color;    
}


for (let i = 0; i <= 4; i++) {
    //担当者の円のラベルをHTMLに出力
    var span = document.createElement('span');
    span.className = 'circle_tantou';
    span.innerHTML     = tantou[i];
    document.getElementById('pid'+i ).appendChild(span);
}

//担当者の色をCSSに設定
document.querySelector('.chart_tantou').style.backgroundImage = 'conic-gradient('+ tantou_color[0] +' 0% 20%, '+ tantou_color[1] +' 20% 40%, '+ tantou_color[2] +' 40% 60%, '+ tantou_color[3] +' 60% 80%, '+ tantou_color[4] +' 80% 100%)';

//何月経ったかを算出
 function funGetKeikaDate(dt1, dt2) {

    const date1 = new Date(dt1)
    const date2 = new Date(dt2)

    let months
    months = (date2.getFullYear() - date1.getFullYear()) * 12
    months -= date1.getMonth() + 1
    months += date2.getMonth() + 1

    return months
  };


この記事が気に入ったらサポートをしてみませんか?