Pular para o conteúdo principal

Separar vários elementos em várias colunas

Um problema comum nas páginas HTML é existir uma lista enorme de campos checkbox e a pessoa querer separá-las em várias colunas, de acordo com a largura da tela, evitando assim ter que ficar rolando a página.

Usar apenas um float a esquerda nos elementos com largura fixa não é a melhor solução, pois a ordem alfabética fica confusa, deixando de ser de cima para baixo, como um dicionário, e passa a ser da esquerda para a direita.

Criei então em javascript uma solução para este problema:

HTML:
<div>
    <div class="checkbox">
        <label><input type="checkbox" name="" id="">A</label>
    </div>
    <div class="checkbox">
        <label><input type="checkbox" name="" id="">B</label>
    </div>
    <div class="checkbox">
        <label><input type="checkbox" name="" id="">C</label>
    </div>
    <div class="checkbox">
        <label><input type="checkbox" name="" id="">D</label>
    </div>
</div>

CSS:
.separador {
    float: left;
    width: 250px;
    padding-left: 5px;
    box-sizing: border-box;
}
 
JAVASCRIPT 
function separarEmColunas(selector_elemento, largura_coluna = 250) {
    let el_pai = document.querySelector(selector_elemento).parentElement;
    let width_grupo = el_pai.offsetWidth;
    let qt_coluna = Math.trunc(width_grupo / largura_coluna);
    let qt_elemento = document.querySelectorAll(selector_elemento).length;
    let qt_elemento_coluna = Math.trunc(qt_elemento / qt_coluna);
    let resto = qt_elemento % qt_coluna;
    let txt_option = '';
    let el_pegar = 0;
    let lista_ck = document.querySelectorAll(selector_elemento);
    for (let i = 0; i < qt_coluna; i++) {
        txt_option += `<div class="sig_separador">`;
        let qt_esta_coluna = qt_elemento_coluna;
        if (resto > 0) {
            qt_esta_coluna++;
            resto--;
        }
        for (let ii = 0; ii < qt_esta_coluna; ii++) {
            txt_option += lista_ck[ii + el_pegar].outerHTML;
        }
        el_pegar += qt_esta_coluna;
        txt_option += '</div>';
    }
    el_pai.innerHTML = txt_option;
}
 
separarEmColunas(".checkbox"); 

Comentários

Postagens mais visitadas deste blog

Lista de órgãos emissores de RG

Para quem quiser normalizar os órgãos emissores de RG, aí vai uma lista retirada do site da FGV: SSP - Secretaria de Segurança Pública PM - Polícia Militar PC - Policia Civil CNT - Carteira Nacional de Habilitação DIC - Diretoria de Identificação Civil CTPS - Carteira de Trabaho e Previdência Social FGTS - Fundo de Garantia do Tempo de Serviço IFP - Instituto Félix Pacheco IPF - Instituto Pereira Faustino IML - Instituto Médico-Legal MTE - Ministério do Trabalho e Emprego MMA - Ministério da Marinha MAE - Ministério da Aeronáutica MEX - Ministério do Exército POF - Polícia Federal POM - Polícia Militar SES - Carteira de Estrangeiro SJS - Secretaria da Justiça e Segurança SJTS - Secretaria da Justiça do Trabalho e Segurança ZZZ - Outros (inclusive exterior)

Comparar dois números float em PHP

Para não passar raiva comparando dois números float com PHP nunca faça algo do tipo abaixo: $a = 0.1; $b = 0.2; if ($a + $b == 0.3) {     echo 'Igual'; } else {     echo 'Diferentes'; } Se fizer isso, vai ver que dá problema devido ao modo como o PHP guarda os valores float. Para resolver isso criei a função abaixo para comparar dois valores do tipo float. /** * Esta função recebe dois números como parâmetro.   * Se os números forem iguais, ou seja, se a diferença  * entre eles for menor que a margem de erro aceitável,   * a função retorna 0, caso contrário retorna -1 se o  * primeiro número for menor, * ou então 1 caso o segundo  * seja o menor   * @param float $a   * @param float $b   * @return 0 (igual), -1($num1 menor), 1($num2 menor)   */ function compara_float( $num1 , $num2 , $precisao = 5 ) {   $desprezar = pow ( 0.1 , $precisao );   $diff = abs ( $num1 - $...