Ir ao conteúdo
  • Cadastre-se

CSS Calendário Com Cores Periódicas


Posts recomendados

Olá, estou tentando desenvolver um calendário de folgas de trabalho Com Cores utilizando javascript, Css e HTML. Todo ano tenho que fazer esse mesmo calendário manualmente no Excel para meu trabalho então pensei em tentar resolver esse meu problema com isso, estou tentando aprender a programar por hobbie mesmo e ainda não sei quase nada kkkk, até agora consegui seguindo um vídeo do youtube fazer o calendário mais não tenho ideia do que utilizar para fazer as cores funcionarem, a cada dois dias as cores devem mudar e a ideia era gerar isso automaticamente para que eu nunca mais eu precise fazer, vou deixar o exemplo do calendário que utilizo na empresa para vocês conseguirem entender como é, e os códigos que fiz até agora do calendário. gostaria de lembrar a vocês que meu principal objetivo e aprender portanto o que estou em duvida aqui e quais métodos ou ferramentas devo buscar para conseguir fazer isso, desde já gostaria de agradecer a paciência de vocês pra ajudar.

 

Em anexo imagem de exemplo do que estou tentando fazer: "Exemplo1 Escala de Folgas"

 

 

index.html :

 

<!DOCTYPE html>
<html lang="pt-BR" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>Calendar P Folga</title>
    <link rel="stylesheet" href="style.css">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Rounded:opsz,wght,FILL,[email protected],100..700,0..1,-50..200">
    <script src="script.js" defer></script>
  </head>
  <body>
    <div class="wrapper">
      <header>
        <p class="current-date"></p>
        <div class="icons">
          <span id="prev" class="material-symbols-rounded">chevron_left</span>
          <span id="next" class="material-symbols-rounded">chevron_right</span>
        </div>
      </header>
      <div class="calendar">
        <ul class="weeks">
          <li>Seg</li>
          <li>Ter</li>
          <li>Qua</li>
          <li>Qui</li>
          <li>Sex</li>
          <li>Sab</li>
          <li>Dom</li>
        </ul>
        <ul class="days"></ul>
      </div>
    </div>
    
  </body>
</html>

 

style.css :

 

/* Import Google font - Poppins */
@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600&display=swap');
*{
  margin: 0;
  padding: 0;
  box-sizing: border-box;
  font-family: 'Poppins', sans-serif;
}
body{
  display: flex;
  align-items: center;
  padding: 0 10px;
  justify-content: center;
  min-height: 100vh;
  background: #586f6b;
}
.wrapper{
  width: 450px;
  background: #fff;
  border-radius: 10px;
  box-shadow: 0 15px 40px rgba(0,0,0,0.12);
}
.wrapper header{
  display: flex;
  align-items: center;
  padding: 25px 30px 10px;
  justify-content: space-between;
}
header .icons{
  display: flex;
}
header .icons span{
  height: 38px;
  width: 38px;
  margin: 0 1px;
  cursor: pointer;
  color: #878787;
  text-align: center;
  line-height: 38px;
  font-size: 1.9rem;
  user-select: none;
  border-radius: 50%;
}
.icons span:last-child{
  margin-right: -10px;
}
header .icons span:hover{
  background: #f2f2f2;
}
header .current-date{
  font-size: 1.45rem;
  font-weight: 500;
}
.calendar{
  padding: 20px;
}
.calendar ul{
  display: flex;
  flex-wrap: wrap;
  list-style: none;
  text-align: center;
}
.calendar .days{
  margin-bottom: 20px;
}
.calendar li{
  color: #333;
  width: calc(100% / 7);
  font-size: 1.07rem;
}
.calendar .weeks li{
  font-weight: 500;
  cursor: default;
}
.calendar .days li{
  z-index: 1;
  cursor: pointer;
  position: relative;
  margin-top: 30px;
}
.days li.inactive{
  color: #aaa;
}
.days li.active{
  color: #fff;
}
.days li::before{
  position: absolute;
  content: "";
  left: 50%;
  top: 50%;
  height: 40px;
  width: 40px;
  z-index: -1;
  border-radius: 50%;
  transform: translate(-50%, -50%);
}
.days li.active::before{
  background: #586f6b;
}
.days li:not(.active):hover::before{
  background: #f2f2f2;
}

 

script.js :

 

const daysTag = document.querySelector(".days"),
currentDate = document.querySelector(".current-date"),
prevNextIcon = document.querySelectorAll(".icons span");

let date = new Date(),
currYear = date.getFullYear(),
currMonth = date.getMonth();

const months = ["Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho",
              "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"];

const renderCalendar = () => {
    let firstDayofMonth = new Date(currYear, currMonth, 1).getDay(), 
    lastDateofMonth = new Date(currYear, currMonth + 1, 0).getDate(), 
    lastDayofMonth = new Date(currYear, currMonth, lastDateofMonth).getDay(), 
    lastDateofLastMonth = new Date(currYear, currMonth, 0).getDate(); 
    let liTag = "";

    for (let i = firstDayofMonth; i > 0; i--) { 
        liTag += `<li class="inactive">${lastDateofLastMonth - i + 1}</li>`;
    }

    for (let i = 1; i <= lastDateofMonth; i++) { 
        let isToday = i === date.getDate() && currMonth === new Date().getMonth() 
                     && currYear === new Date().getFullYear() ? "active" : "";
        liTag += `<li class="${isToday}">${i}</li>`;
    }

    for (let i = lastDayofMonth; i < 6; i++) { 
        liTag += `<li class="inactive">${i - lastDayofMonth + 1}</li>`
    }
    currentDate.innerText = `${months[currMonth]} ${currYear}`; 
    daysTag.innerHTML = liTag;
}
renderCalendar();

prevNextIcon.forEach(icon => { 
    icon.addEventListener("click", () => { 
        currMonth = icon.id === "prev" ? currMonth - 1 : currMonth + 1;

        if(currMonth < 0 || currMonth > 11) { 
            date = new Date(currYear, currMonth);
            currYear = date.getFullYear(); 
            currMonth = date.getMonth(); 
        } else {
            date = new Date(); 
        }
        renderCalendar(); 
    });
});

 

Exemplo1 Escala de Folgas.jpeg

Link para o comentário
Compartilhar em outros sites

Olá!
É uma questão q eu tb vou gostar de ver a solução.
Se fosse só colorir a partir da primeira li, é fácil, mas seguindo a sequência de acordo com o dia e cor inicial, eu não sei fazer.

css alterado para apenas colorir, começando a primeria li com verde

/* Import Google font - Poppins */
@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600&display=swap');
* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
  font-family: 'Poppins', sans-serif;
}
body {
  display: flex;
  align-items: center;
  padding: 0 10px;
  justify-content: center;
  min-height: 100vh;
  background: #586f6b;
}
.wrapper {
  width: 450px;
  background: #fff;
  border-radius: 10px;
  box-shadow: 0 15px 40px rgba(0, 0, 0, 0.12);
}
.wrapper header {
  display: flex;
  align-items: center;
  padding: 25px 30px 10px;
  justify-content: space-between;
}
header .icons {
  display: flex;
}
header .icons span {
  height: 38px;
  width: 38px;
  margin: 0 1px;
  cursor: pointer;
  color: #878787;
  text-align: center;
  line-height: 38px;
  font-size: 1.9rem;
  user-select: none;
  border-radius: 50%;
}
.icons span:last-child {
  margin-right: -10px;
}
header .icons span:hover {
  background: #f2f2f2;
}
header .current-date {
  font-size: 1.45rem;
  font-weight: 500;
}
.calendar {
  padding: 20px;
}
.calendar ul {
  display: flex;
  flex-wrap: wrap;
  list-style: none;
  text-align: center;
}
.calendar .days {
  margin-bottom: 20px;
}
.calendar li {
  color: #333;
  width: calc(100% / 7);
  font-size: 1.07rem;
}
.calendar .weeks li {
  font-weight: 500;
  cursor: default;
}
.calendar .days li {
  width: calc((100% / 7) - 2px);
  z-index: 1;
  cursor: pointer;
  position: relative;
  margin: 1px;
  height: 48px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 4px;
}
.days li.inactive {
  opacity: 0.5;
}
.days li.active {
  color: #fff;
}
.days li::before {
  position: absolute;
  content: '';
  left: 50%;
  top: 50%;
  height: 40px;
  width: 40px;
  z-index: -1;
  border-radius: 50%;
  transform: translate(-50%, -50%);
}
.days li.active::before {
  background: #586f6b;
}
.days li:not(.active):hover::before {
  background: #f2f2f2;
}

/* COLORS */
ul.days li:nth-child(8n + 1),
ul.days li:nth-child(8n + 2) {
  background-color: lightgreen;
}
ul.days li:nth-child(8n + 3),
ul.days li:nth-child(8n + 4) {
  background-color: lightblue;
}
ul.days li:nth-child(8n + 5),
ul.days li:nth-child(8n + 6) {
  background-color: palegoldenrod;
}
ul.days li:nth-child(8n + 7),
ul.days li:nth-child(8n + 8) {
  background-color: lightcoral;
}

image.png.35da20bcdc38525798b605420d42af2e.png

  • Amei 1
Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...

Boa noite talvez isso ajude, vai parecer complexo  esse código no inicio mas eu quero que você leia e estude ele com calma:

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    * {
      box-sizing: border-box;
    }

    p {
      text-align: center;
    }

    table {
      margin: auto;
    }

    table,
    tr,
    td {
      border: 1px solid;
    }

    td {
      text-align: center;
      width: 100px;
      font-weight: bold;
    }
  </style>
</head>

<body>
  <button onclick="generateCalendar()">Gerar próximo mês</button>
  <p id="monthName"></p>
  <table id="table">
  </table>
  <script>
    const months = ["Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho",
      "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"];

    let month = -1;

    let colors = [
      "#69af4a",
      "#69af4a",
      "#599cda",
      "#599cda",
      "#f9ff64",
      "#f9ff64",
      "#fc3401",
      "#fc3401"
    ];

    const isSaturday = (day) => day.getDay() === 6;

    function generateCalendar() {
      month += 1;
      const monthName = months[month];
      document.getElementById("monthName").innerText = monthName;

      const today = new Date();

      const year = today.getFullYear();
      const firstDayOfMonth = new Date(year, month, 1);
      const lastDayOfMonth = new Date(year, month + 1, 0);
      const totalOfDaysMonth = lastDayOfMonth.getDate();

      /** @type {HTMLTableElement} **/
      const table = document.getElementById("table");
      table.innerHTML = ""
      table.insertRow(0);
      table.rows[0].innerHTML =
        "<tr>" +
        "<th>Dom</th>" +
        "<th>Seg</th>" +
        "<th>Ter</th>" +
        "<th>Qua</th>" +
        "<th>Qui</th>" +
        "<th>Sex</th>" +
        "<th>Sab</th>" +
        "</tr >";

      let days = [];
      for (let i = -firstDayOfMonth.getDay(); i < totalOfDaysMonth; i++) {
        const dayNumber = i + 1;
        days.push(dayNumber);
        if (isSaturday(new Date(year, month, dayNumber))) {
          const index = table.rows.length;
          table.insertRow(index);
          days.forEach((day, i) => {
            table.rows[index].insertCell(i)
            if (day > 0) {
              table.rows[index].cells[i].innerText = day
              table.rows[index].cells[i].style.backgroundColor = colors[new Date(year, month, day).getDay()]
            }
          })
          days = [];
          const lastColor = colors.pop();
          colors.unshift(lastColor);
        }
      }

      if (days.length < 7) {
        const index = table.rows.length;
        table.insertRow(index);
        days.forEach((day, i) => {
          table.rows[index].insertCell(i)
          table.rows[index].cells[i].innerText = day
          table.rows[index].cells[i].style.backgroundColor = colors[new Date(year, month, day).getDay()]
        })
      }
    }

    generateCalendar()
  </script>
</body>

</html>

Qualquer dúvidas estou a disposição.

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!