Com opção de escolha mês e ano - #bootstrap 5 e #javascript puro. Responsivo e com #exemplo para busca de dados via API.

Este #componente é prático e intuitivo para que o usuário selecione períodos em #mes ou #ano sem a necessidade de digitar porque utiliza #buttons como manipulação.

Melhorias são sempre uma boa evolução para a ideia e o código é livre baixa baixar, modificar e compartilhar.

 

{label: "Agosto", mes: "8", ano: "2020"}
ano: "2020"
label: "Agosto"
mes: "8"
__proto__: Object

 


 

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

<head>
 <meta charset="utf-8">
 <title>Div meses</title>
 <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
 <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.9.1/font/bootstrap-icons.css">
 <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">

</head>
<!-- created by @BrCodeSnippets -->

<body>
 <div class="container-full mt-3">
 <div class="row m-0">
 <div class="col-12">
 <label for="">Selecione ano</label>
 <select class="form-select mb-3" name="ano" id="ano">
 <option value="2020">2020</option>
 <option value="2021">2021</option>
 <option value="2022">2022</option>
 <option value="2023">2023</option>
 <option value="2024">2024</option>
 <option value="2025">2025</option>
 </select>
 <div class="btn-group d-flex" role="group" aria-label="..." id="meses">
 </div>
 <div class=" alert-secondary fs-2 my-2 text-center p-3" id="mes">
 </div>
 Mês selecionado:
 <input id="inputMes" class="form-control" type="text" name="" value="" placeholder="Selecione um mês acima">
 <button class="btn btn-success w-100 mt-3 shadow" type="button" name="button">Avançar</button>
 </div>
 </div>
 </div>
</body>

<script type="text/javascript">
 // meses
 let dateNow = new Date();
 let mesAtual = dateNow.getMonth();
 let anoAtual = dateNow.getFullYear();
 let divMes = document.getElementById("mes");
 let divMeses = document.getElementById("meses");
 let inputMes = document.getElementById("inputMes");
 let inputAno = document.getElementById("ano");
 // aqui pode ser internacionalizado
 let meses = ['Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro'];
 let btnEsquerdo = ' <a data-acao="anterior" class="btn btn-success" href="#"> << <i class="fa fa-arrow-left" aria-hidden="true"></i> </a> ';
 let btnDireito = ' <a data-acao="proximo" class="btn btn-success" href="#"> <i class="fa fa-arrow-right" aria-hidden="true"></i> >> </a> ';

 divMes.innerHTML = meses[mesAtual]; //((d.getMonth() + 1) < 10 ? '0' + (d.getMonth() + 1) : (d.getMonth() + 1));

 function render(mesAtual) {
 mesAtual = (mesAtual < 1) ? 1 : ((mesAtual >= 11) ? 10 : mesAtual);
 htmlMeses = "";
 mesAnterior = (mesAtual - 1);
 mesProximo = (mesAtual + 1);

 htmlMeses += btnEsquerdo;

 for (i = mesAnterior; i <= mesProximo; i++) {
 htmlMeses += '<button id="m-' + (i + 1) + '" data-mes="' + (i + 1) + '" href="#" class="btn btn-info w-100"> ' + meses[i] + ' </button>';
 }

 htmlMeses += btnDireito;

 divMeses.innerHTML = htmlMeses;

 }
 // load
 render(mesAtual);

 // ações dentro da div meses []

 document.getElementById('meses').addEventListener('click', async function() {

 event.preventDefault();
 let target = event.target;

 if (target.tagName == 'A') {
 let acao = target.getAttribute('data-acao');
 mesAtual = (acao == "anterior") ? ((mesAtual < 2) ? 10 : ((mesAtual > 10) ? 10 : (mesAtual - 1))) : ((mesAtual <= 9) ? (mesAtual + 1) : 1);
 }

 if (target.tagName == 'BUTTON') {

 // Aqui poderíamos ter uma async function para um API buscar dados externos...
 const dados = await getData({
 label: meses[target.getAttribute('data-mes') - 1],
 mes: target.getAttribute('data-mes'),
 ano: inputAno.value
 });

 data_mes = target.getAttribute('data-mes');
 divMes.innerHTML = dados;
 inputMes.value = target.getAttribute('data-mes') + ' - ' + meses[target.getAttribute('data-mes') - 1];
 }
 render(mesAtual);
 });

 // Exemplo
 async function getData(obj) {
 console.log(obj);
 return 'Dados de (mes ' + obj.mes + ') ' + obj.label + ' de ' + obj.ano;
 }
</script>

</html>

Javascript

// meses
 let dateNow = new Date();
 let mesAtual = dateNow.getMonth();
 let anoAtual = dateNow.getFullYear();
 let divMes = document.getElementById("mes");
 let divMeses = document.getElementById("meses");
 let inputMes = document.getElementById("inputMes");
 let inputAno = document.getElementById("ano");
 // aqui pode ser internacionalizado
 let meses = ['Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro'];
 let btnEsquerdo = ' <a data-acao="anterior" class="btn btn-success" href="#"> << <i class="fa fa-arrow-left" aria-hidden="true"></i> </a> ';
 let btnDireito = ' <a data-acao="proximo" class="btn btn-success" href="#"> <i class="fa fa-arrow-right" aria-hidden="true"></i> >> </a> ';

 divMes.innerHTML = meses[mesAtual]; //((d.getMonth() + 1) < 10 ? '0' + (d.getMonth() + 1) : (d.getMonth() + 1));

 function render(mesAtual) {
 mesAtual = (mesAtual < 1) ? 1 : ((mesAtual >= 11) ? 10 : mesAtual);
 htmlMeses = "";
 mesAnterior = (mesAtual - 1);
 mesProximo = (mesAtual + 1);

 htmlMeses += btnEsquerdo;

 for (i = mesAnterior; i <= mesProximo; i++) {
 htmlMeses += '<button id="m-' + (i + 1) + '" data-mes="' + (i + 1) + '" href="#" class="btn btn-info w-100"> ' + meses[i] + ' </button>';
 }

 htmlMeses += btnDireito;

 divMeses.innerHTML = htmlMeses;

 }
 // load
 render(mesAtual);

 // ações dentro da div meses []

 document.getElementById('meses').addEventListener('click', async function() {

 event.preventDefault();
 let target = event.target;

 if (target.tagName == 'A') {
 let acao = target.getAttribute('data-acao');
 mesAtual = (acao == "anterior") ? ((mesAtual < 2) ? 10 : ((mesAtual > 10) ? 10 : (mesAtual - 1))) : ((mesAtual <= 9) ? (mesAtual + 1) : 1);
 }

 if (target.tagName == 'BUTTON') {

 // Aqui poderíamos ter uma async function para um API buscar dados externos...
 const dados = await getData({
 label: meses[target.getAttribute('data-mes') - 1],
 mes: target.getAttribute('data-mes'),
 ano: inputAno.value
 });

 data_mes = target.getAttribute('data-mes');
 divMes.innerHTML = dados;
 inputMes.value = target.getAttribute('data-mes') + ' - ' + meses[target.getAttribute('data-mes') - 1];
 }
 render(mesAtual);
 });

 // Exemplo
 async function getData(obj) {
 console.log(obj);
 return 'Dados de (mes ' + obj.mes + ') ' + obj.label + ' de ' + obj.ano;
 }