Idioma:

Como fazer um Calendário HTML simples (opções com código e sem código)

Quatro formas de colocar um calendário no seu site — desde código HTML/CSS para copiar e colar até incorporar o Google Calendar em um widget de calendário de eventos totalmente configurado. Cada método inclui exemplos funcionais, notas honestas sobre trade-offs e um framework de decisão para você escolher a abordagem certa para a sua situação.
Veja o que o ChatGPT acha Abra o Editor de Widgets ao Vivo
How to Make a Simple HTML Calendar (Code and No-Code Options)

Muitos tutoriais de calendário HTML se concentram no básico: uma grade mensal estática construída com markup simples e estilos. Mas, para um calendário de site ao vivo, normalmente você vai querer recursos como navegação, responsividade e suporte a eventos, para que os visitantes possam realmente interagir com ele e ficar atualizados.

Este artigo aborda quatro abordagens para adicionar um calendário HTML ao seu site: exibir um mês estático com CSS Grid, adicionar JavaScript para navegação dinâmica, incorporar o Google Calendar via iframe e usar um widget de calendário sem código. Cada método atende a uma situação diferente, e o framework de decisão no final ajuda você a escolher o mais adequado para o seu caso.

O que você vai aprender:
  • Código HTML de calendário pronto para copiar e colar usando CSS Grid — versões estáticas e dinâmicas
  • Como adicionar navegação por mês e destaque de hoje com JavaScript puro.
  • Configuração de incorporação do Google Calendar, incluindo as limitações em dispositivos móveis
  • Configuração de widget de calendário sem código com gerenciamento de eventos e filtragem
  • Uma estrutura de decisão que alinha métodos de calendário a casos de uso específicos

Métodos Comparados

Antes de decidir por uma abordagem, uma comparação rápida ajuda a reduzir suas opções. Os quatro métodos diferem no que conseguem fazer, na quantidade de configuração necessária e para quem foram criados:

MétodoIdeal paraDificuldadeCustomizaçãoEventos DinâmicosPreço
HTML/CSS estáticoGrade de meses apenas para exibiçãoBásico (copiar e colar)Total (seu CSS)NãoGratuito
Calendário JS DinâmicoCalendário mensal navegávelIntermediárioCompleto (seu código)Navegação por mêsGratuito
Incorporação do Google CalendarOrganizações que utilizam o Google CalendarFácil (iframe)Muito limitadoSim (sincroniza com o Google)Gratuito
Widget sem códigoListagens de eventos, filtros e links RSVPFácil (sem código)Total (Editor Visual)Sim (manual + sincronização com Google)Gratuito – Pago

Resumo: Um calendário estático em HTML/CSS funciona bem para layouts visuais simples, como portfólios, horários ou elementos de design. Adicionar JavaScript permite navegação por mês e renderização automática de datas. Um embed do Google Calendar é adequado se você já gerencia eventos no Google e quer uma exibição rápida e de baixa manutenção. Um widget de calendário HTML sem código oferece mais flexibilidade, incluindo gestão de eventos, eventos recorrentes, filtragem e personalização visual sem precisar de codificação.

Método 1: Calendário HTML/CSS estático

Este é o código HTML de calendário mais simples que você pode criar — uma exibição de um único mês usando CSS Grid. É a base sobre a qual o Método 2 se apoia, e funciona como um modelo independente se tudo que você precisa é de um layout mensal visual.

CSS Grid calendar example

O código usa CSS Grid com repeat(7, 1fr) para o layout diário de sete colunas. O Grid tem aproximadamente 95% de suporte global aos navegadores, então a compatibilidade não é uma preocupação. Ao contrário de fluxos de trabalho mais antigos que utilizam tabelas HTML com atributos obsoletos como cellspacing e bgcolor, o Grid oferece um layout responsivo com marcação limpa e moderna.

Copie o código abaixo e cole em qualquer arquivo HTML ou bloco de código de CMS. Ele exibe um calendário de junho de 2026 — altere o título do mês e os números dos dias para exibir outro mês.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Static HTML Calendar</title>
<style>
  .calendar {
    --accent: #2563eb;          /* change this to match your brand */
    max-width: 480px;
    margin: 0 auto;
    font-family: system-ui, sans-serif;
  }
  .calendar-header {
    display: flex;
    justify-content: center;
    align-items: center;
    padding: 0.75rem 0;
    font-size: 1.2rem;
    font-weight: 600;
    color: var(--accent);
  }
  .calendar-grid {
    display: grid;
    grid-template-columns: repeat(7, 1fr);  /* 7 equal columns */
    gap: 2px;
    text-align: center;
  }
  .day-name {
    padding: 0.5rem 0;
    font-size: 0.8rem;
    font-weight: 600;
    color: #64748b;
  }
  .day {
    padding: 0.6rem 0;
    font-size: 0.95rem;
    border-radius: 6px;
  }
  .day:hover { background: #f1f5f9; }
  .today {
    background: var(--accent);
    color: #fff;
    font-weight: 600;
  }
  .today:hover { background: var(--accent); }
</style>
</head>
<body>

<div class="calendar">
  <div class="calendar-header">Junho de 2026</div>
  <div class="calendar-grid">
    <span class="day-name">Seg</span>
    <span class="day-name">Ter</span>
    <span class="day-name">Qua</span>
    <span class="day-name">Qui</span>
    <span class="day-name">Sex</span>
    <span class="day-name">Sáb</span>
    <span class="day-name">Dom</span>
    <!-- Junho de 2026 começa na segunda-feira — sem deslocamento necessário -->
    <span class="day today">1</span>
    <span class="day">2</span><span class="day">3</span><span class="day">4</span>
    <span class="day">5</span><span class="day">6</span><span class="day">7</span>
    <span class="day">8</span><span class="day">9</span><span class="day">10</span>
    <span class="day">11</span><span class="day">12</span><span class="day">13</span>
    <span class="day">14</span><span class="day">15</span><span class="day">16</span>
    <span class="day">17</span><span class="day">18</span><span class="day">19</span>
    <span class="day">20</span><span class="day">21</span><span class="day">22</span>
    <span class="day">23</span><span class="day">24</span><span class="day">25</span>
    <span class="day">26</span><span class="day">27</span><span class="day">28</span>
    <span class="day">29</span><span class="day">30</span>
  </div>
</div>

</body>
</html>">

A propriedade CSS personalizada --accent no topo controla a cor de destaque — altere-a uma vez e o cabeçalho e o marcador de hoje são atualizados. O layout é responsivo por padrão, porque as unidades 1fr dividem o espaço disponível igualmente, em vez de larguras fixas em pixels. Em telas menores, as células encolhem proporcionalmente sem quebrar.

Se o mês que você está exibindo não começar na segunda-feira, use grid-column-start na célula do primeiro dia para movê-lo para a coluna correta. Por exemplo, se o mês começar na quarta-feira, adicione style="grid-column-start: 3" à primeira <span class="day">. Isso posiciona o primeiro dia na terceira coluna sem precisar de células de preenchimento vazias — uma das vantagens do CSS Grid sobre um layout baseado em tabelas.

Observação: Para transformar este simples código HTML de calendário em um modelo de calendário HTML reutilizável, salve o arquivo e troque o título do mês e os números de dia sempre que precisar de um mês diferente. Para qualquer coisa além de uma única exibição estática, o Método 2 faz isso automaticamente.

Método 2: Calendário JavaScript dinâmico

A versão estática funciona como uma captura, mas a maioria dos casos práticos exige navegação por mês e data atual renderizada automaticamente. Esta versão baseia-se na mesma estrutura CSS Grid e acrescenta cerca de 50 linhas de JavaScript puro para renderização dinâmica.

Dynamic JavaScript Calendar example

O código HTML de calendário abaixo identifica o mês e o ano atuais, mostra o número exato de dias, alinha o primeiro dia à coluna correta, destaca o dia de hoje e permite que os visitantes avancem ou recuem entre os meses. A transição entre anos (Dezembro para Janeiro, ou Janeiro para Dezembro) é automática.

Dois detalhes de JavaScript que vale destacar. Primeiro, new Date(year, month, 1).getDay() retorna o dia da semana do primeiro dia, porém o JavaScript considera o domingo como 0. A conversão (firstDay + 6) % 7 desloca o índice para que segunda-feira seja 0 e domingo seja 6, combinando com o layout da grade que começa na segunda. Em segundo lugar, new Date(year, month + 1, 0).getDate() é uma abreviação para obter o número de dias de qualquer mês — o dia 0 do mês seguinte retorna o último dia do mês atual.

</font>decrementar um ano.

JavaScript calendar library, is usually a more practical option.”> Limitação: Este calendário dinâmico lida com exibição e navegação, mas não com eventos, horários recorrentes ou sincronização de calendário. Recursos como detalhes de eventos, filtragem ou horários salvos exigem infraestrutura e código adicionais. Se você precisa de gerenciamento de eventos, o Método 3 ou 4, ou uma biblioteca de calendário em JavaScript, costuma ser uma opção mais prática.

Método 3: Incorporação do Google Calendar

Se a sua organização já gerencia a agenda no Google Agenda, incorporá-la como iframe dispensa totalmente a etapa de codificação. O resultado é um calendário de eventos em HTML ao vivo que se atualiza automaticamente sempre que você adicionar ou alterar eventos no Google Agenda.

Processo de configuração

  1. Torne o calendário público. No Google Calendar, abra as Configurações do calendário que deseja incorporar. Em “Permissões de acesso a eventos”, marque “Tornar disponível publicamente”. Apenas calendários públicos aparecem na incorporação — calendários privados ou compartilhados não serão renderizados.
  2. <strong>Abrir as configurações de incorporação.</strong> No mesmo painel de configurações, role até “Integrar calendário.” Clique no botão “Personalizar” para abrir a ferramenta de personalização.
  3. Configure a exibição. A ferramenta de personalização permite definir o título, a visualização padrão (Mês, Semana ou Agenda), largura e altura em pixels, data de início, fuso horário e ativar/desativar elementos como botões de navegação, cabeçalho da data, ícone de impressão e abas do calendário. Também é possível combinar vários calendários públicos em uma única incorporação.
  4. Copie o código do iframe. Clique em “Copiar” para obter o <iframe> embed code. Ele fica assim: <iframe src="https://calendar.google.com/calendar/embed?src=..." width="800" height="600"></iframe>
  5. Cole no seu site. Adicione o iframe a qualquer página HTML ou bloco HTML Personalizado no CMS. Para um guia mais detalhado, incluindo instruções de colagem específicas por plataforma, consulte este guia para adicionar o Google Calendar a qualquer site.

Compensações

A incorporação do Google Calendar funciona bem para exibir rapidamente um calendário gratuito, mas tem limitações. O iframe usa dimensões fixas e não é totalmente responsivo, o que pode tornar a visualização em dispositivos móveis desconfortável.

Como ele é carregado a partir do domínio do Google, você não pode personalizar totalmente o design com seus CSS ou JavaScript próprios, então ele sempre parecerá um produto incorporado do Google. Os visitantes podem ver eventos e abrir detalhes, mas a interação fica limitada à visualização, sem a possibilidade de reservar ou RSVP diretamente.

Observação: Essas concessões funcionam bem para páginas voltadas para uso interno, sites da comunidade ou qualquer contexto em que a marca visual não seja essencial, e seu público estiver predominantemente em desktop. Para qualquer conteúdo público em que a experiência móvel e a consistência do design importem, um widget sem código oferece mais controle.

Método 4: Widget de Calendário Sem Código

Quando você precisa de gerenciamento de eventos, personalização visual e design responsivo sem escrever código, um widget de calendário dedicado fecha a lacuna entre um calendário HTML básico e um aplicativo de calendário completo. O Elfsight Event Calendar é uma opção nesta categoria – e leva apenas 5 minutos para configurá-lo. Aqui está o processo, em linhas gerais:

  1. Abrir o Calendário construtor e selecione um modelo.
  2. Adicione seus Eventos e configure o estilo.
  3. Clique em “Adicionar ao site” e copie o código de incorporação.
  4. Cole o código no backend do seu site e publique.

Crie seu próprio calendário aqui mesmo no editor visual interativo ↓

Recursos de destaque

Tudo o que se segue é uma funcionalidade que um calendário HTML/JS feito manualmente não oferece pronto — e que exigiria muito tempo de desenvolvimento para construir do zero.

  • Sete tipos de layout — Lista, Grade, Masonry, Slider e visualizações de calendário para Mês, Semana e Dia. Um único widget pode exibir layouts diferentes em páginas distintas.
  • Três fontes de eventos — adicione eventos manualmente via editor visual, importe em lote via CSV, ou sincronize de forma unidirecional com o Google Calendar (com suporte de local, anfitrião, tags, tipo de evento, etc.).
  • Eventos recorrentes — diários, semanais, mensais, anuais e frequências personalizadas com tratamento de exceções para ocorrências individuais.
  • Popups de Eventos — os visitantes clicam em um evento para ver detalhes completos, um mapa de localização, um botão de CTA e uma opção de “Adicionar ao Calendário” que gera um arquivo .ics universal.
  • <strong>Cinco filtros + pesquisa</strong> — data, tipo de evento, local, anfitrião e tags, além de uma barra de busca por palavra-chave. Os filtros aparecem inline ou em um menu suspenso.
  • Ajuste do fuso horário do visitante — os horários dos eventos são ajustados automaticamente ao fuso horário local de cada visitante, essencial para eventos virtuais ou entre fusos horários.
Appointment Booking widget for scheduling use cases”>Dica profissional: O widget faz links para páginas externas para venda de ingressos ou registro, mas não processa pagamentos nem gerencia RSVP internamente. A Elfsight tem um widget separado de Agendamento de Consultas para cenários de agendamento

Alemão

Qual método funciona para a sua situação

O método certo depende do que o seu calendário precisa fazer, não de quão técnico você é. A tabela abaixo relaciona cenários comuns à abordagem que melhor atende a cada um.

SituaçãoMelhor métodoPor quê
Portfólio ou site pessoal que precisa de exibição mensalHTML/CSS estáticoControle total de design, sem dependências, código mínimo
Site que precisa de um calendário navegável sem eventosCalendário JS DinâmicoNavegação mensal e destaque de hoje sem backend
Organização já usa o Google Calendar para agendamentoIncorporação do Google CalendarSincroniza automaticamente, sem código, sem manutenção.
Publicação de listas de eventos para locais como auditórios, academias, escolas ou igrejas.Widget sem códigoGestão de eventos, filtragem, eventos recorrentes, botões de CTA
Desenvolvedor construindo uma aplicação de calendário personalizadaBiblioteca JS (FullCalendar, etc.)Arraste e solte, regras de eventos recorrentes e suporte a API
Site de comércio eletrônico exibindo datas de venda ou lançamentoHTML/CSS estático ou widget de contagem regressivaUm calendário completo costuma ser demais — basta exibir apenas a data.
Freelancer ou consultor exibindo disponibilidadeWidget sem código ou ferramenta de agendamentoA exibição de disponibilidade requer lógica de agendamento, não apenas uma grade.

A linha que separa codificar um calendário de usar uma ferramenta costuma depender de gestão de eventos. Um calendário JavaScript básico com navegação por mês é relativamente simples, mas recursos como eventos recorrentes, sincronização com o Google Calendar, fuso horário, filtragem ou links RSVP rapidamente ampliam o escopo. Nesse ponto, um widget ou biblioteca de calendário costuma ser a opção mais prática e eficiente em termos de tempo.

Catálogo de Modelos

Explore mais de 30 modelos de Calendário de Eventos

Confira mais templates prontos para qualquer caso de uso ou crie o seu próprio.
HTML Interactive Calendar template
Incorpore um calendário envolvente no seu site para que os usuários sintam vontade de voltar.
Crie um calendário prático no seu site para otimizar o agendamento.
HTML Conference Agenda template
Adicione uma agenda ao seu site para exibir a programação dos palestrantes e os horários das sessões.
Incorpore a programação de uma igreja no seu site para divulgar os próximos eventos e cultos.
Incorpore um calendário no seu site para manter seus visitantes atualizados sobre todos os eventos recorrentes do seu negócio.
Nenhum modelo adequado?
Você pode montar facilmente o widget de que precisa com nosso configurador simples de usar.

Bibliotecas JavaScript de Calendário

Se JavaScript puro não basta, mas um widget sem código não se encaixa no seu stack de desenvolvimento, algumas bibliotecas de código aberto ficam no meio. Elas oferecem componentes de calendário prontos com suporte a eventos, e você controla a integração.

BibliotecaPrincipais vantagensTamanho / AdoçãoLicença
FullCalendarGestão completa de eventos, arrastar e soltar, sistema de plugins.Mais de 19 mil estrelas no GitHub, mais de 1 milhão de downloads semanais no npmMIT (Padrão)
TUI CalendarSuporte a múltiplos calendários, localização robusta para a Ásia.8,2 mil estrelas no GitHubMIT
Vanilla Calendar ProLeve, sem dependências, com acessibilidade integradaLeve / em crescimentoMIT
Calendário de Eventos (vkurko)API no estilo FullCalendar com apenas 37kb comprimidosBaseado em Svelte, independente de frameworkMIT

calendar API with event handling, recurring events, and framework support (React, Vue, Angular). For simpler needs, Vanilla Calendar Pro provides built-in ARIA labels, keyboard navigation, and a smaller footprint.”>FullCalendar é a recomendação padrão para desenvolvedores que precisam de uma API de calendário pronta para produção, com gerenciamento de eventos, eventos recorrentes e suporte a frameworks (React, Vue, Angular). Para necessidades mais simples, o Vanilla Calendar Pro oferece rótulos ARIA integrados, navegação por teclado e menor pegada.

Acessibilidade e Dicas para Dispositivos Móveis

A maioria dos guias sobre como criar um calendário em HTML ignora a Acessibilidade. Adicionar alguns atributos ao código do calendário o torna utilizável por leitores de tela e por usuários que utilizam apenas o teclado, com esforço mínimo em comparação ao impacto.

Para os calendários baseados em código, nos Métodos 1 e 2, essas adições cobrem o básico:

  • Adicione aria-label=”June 2026″ (ou o mês/ano atual) ao contêiner da grade do calendário para que leitores de tela anunciem o que o calendário exibe
  • Use o abbr atributo em cabeçalhos day-name: <span class=”day-name” abbr=”Wednesday”>Wed</span>. Leitores de tela podem então anunciar o nome completo do dia em vez da abreviação
  • W3C APG date picker pattern defines the full interaction model, including arrow-key navigation between days and Page Up/Down for month changes”>Para o calendário interativo em JavaScript, adicione role=”grid” ao contêiner da grade e role=”gridcell” a cada célula de dia. O padrão de date picker W3C APG define o modelo completo de interação, incluindo a navegação com as setas entre os dias e Page Up/Down para mudanças de mês
  • Marque a data atual com aria-current=”date” além da classe visual .today.

Aviso de Acessibilidade

Uma observação sobre ARIA: adicione apenas atributos que você entende. Análise de milhões de páginas da web mostrou que páginas que usam ARIA apresentam, em média, 59,1 erros de acessibilidade detectáveis, em comparação com 42 em páginas sem ARIA. A marcação ARIA incorreta cria mais barreiras do que não usar ARIA.

Se você estiver criando apenas um calendário para exibição, uma tabela HTML nativa

com os cabeçalhos adequados
é a opção mais acessível por padrão — a “primeira regra do ARIA” é preferir semântica HTML nativa sempre que ela existir.

Grade CSS para dispositivos móveis

Para dispositivos móveis, o código CSS Grid em ambos os métodos é responsivo por padrão, pois as unidades fr dividem o espaço disponível de forma proporcional. Em telas muito pequenas (abaixo de 360px), dois ajustes ajudam: encurtar os nomes dos dias para letras únicas (M, T, W, T, F, S, S) e reduzir o preenchimento das células para 0.35rem. Teste em um dispositivo real antes de publicar — emuladores nem sempre refletem como os alvos de toque ficam em tamanhos menores.

Perguntas Frequentes





Posso criar um calendário HTML sem JavaScript?





CSS Grid ou uma tabela HTML: qual é a melhor opção para um layout de calendário?





Como tornar um calendário HTML responsivo em dispositivos móveis?





Posso adicionar eventos a um calendário HTML sem backend?





Qual é a diferença entre um calendário HTML e um widget de calendário?





Por onde começar

A abordagem certa depende do que seu calendário precisa fazer. Um grid mensal apenas para exibição leva cerca de 30 minutos com o código deste artigo. Um calendário navegável com destaque para o dia atual leva um pouco mais. Um calendário de eventos com filtros, eventos recorrentes e links RSVP exige uma ferramenta bem diferente — e reconhecer esse limite cedo economiza mais tempo do que qualquer otimização de código.

calendar widget you can embed without rebuilding from scratch, or a JavaScript library if you need full programmatic control. Either way, you’re building on a foundation that fits the job — not forcing a simple HTML calendar to do something it was never designed for.”>Comece com o método mais simples que atenda aos seus requisitos reais. Se precisar de ir além, a próxima etapa é clara: um widget de calendário que você pode incorporar sem refazer tudo do zero, ou uma biblioteca JavaScript se você precisar de controle total por meio de código. Em qualquer caso, você estará construindo com uma base que serve ao propósito — sem forçar um calendário HTML simples a fazer algo para o qual ele nunca foi projetado.

Artigo por
Gerenciador de Conteúdo
Sou gerente de conteúdo da Elfsight, criando guias práticos sobre soluções inteligentes para sites, para ajudar usuários a aprimorar seus projetos online. Meus artigos são escritos de forma simples, mostrando como os widgets podem impulsionar sites e torná-los mais eficazes.

Posts Relacionados

How To Embed Booking Calendar On Website
O Formulário Multietapas de Duas Colunas combina navegação passo a passo com um layout lado a lado, criando uma aparência moderna e compacta. É útil para cadastros, inscrições em eventos ou qualquer contexto em que você deseje otimizar o uso do espaço na tela.