Limit HTML content in Divs and distribute in the following dynamically?

Asked

Viewed 117 times

4

I’m trying to distribute the content HTML(texto,imagens etc) in DIVS dynamically, but I haven’t found anything related to this yet.

Like picking up content from outside the DIV (overflow) and insert into the next DIV As if they were pages.

let texto = `Lorem consectetur adipisicing elit. Debitis pariatur ipsum quos, adipisci
    laboriosam expedita possimus soluta tempora culpa, officia rerum ducimus consequuntur delectus
    error cumque maxime aperiam ullam sequi?
    O que é o Lorem Ipsum? O Lorem Ipsum é um texto modelo da indústria
    tipográfica e de impressão. O Lorem Ipsum tem vindo a ser o texto
    padrão usado por estas indústrias desde o ano de 1500, quando uma
    misturou os caracteres de um texto para criar um espécime de livro.
    Este texto não só sobreviveu 5 séculos, mas também o salto para a
    tipografia electrónica, mantendo-se essencialmente inalterada. Foi
    popularizada nos anos 60 com a disponibilização das folhas de
    Letraset, que continham passagens`

document.getElementById("page01").innerHTML += texto.substring(0, 305)
document.getElementById("page02").innerHTML += texto.substring(305, 612)
document.getElementById("page03").innerHTML += texto.substring(612, 1000)
.page {
  width: 150px;
  height: 300px;
  border: 1px solid #000;
  padding: 10px 15px;
  float: left;
  margin-left: 15px;
}
<div class="page" id="page01">

</div>

<div class="page" id="page02">

</div>
<div class="page" id="page03">

3 answers

4


You can distribute them as follows!

Adding up the number of characters and check if you have reached the value maximum defined in the function parameters. For this, simple conditions were applied..

const loremIpsum = "Lorem Ipsum é simplesmente uma simulação de texto da indústria tipográfica e de impressos, e vem sendo utilizado desde o século XVI, quando um impressor desconhecido pegou uma bandeja de tipos e os embaralhou para fazer um livro de modelos de tipos. Lorem Ipsum sobreviveu não só a cinco séculos, como também ao salto para a editoração eletrônica, permanecendo essencialmente inalterado. Se popularizou na década de 60, quando a Letraset lançou decalques contendo passagens de Lorem Ipsum, e mais recentemente quando passou a ser integrado a softwares de editoração eletrônica como Aldus PageMaker."; 

const divideTexto = (texto, quantidade) => {
    // verifica se o valor de entrada é menor que 0 ou menor que a quantidade definida, ou seja, não vai rolar nada aqui!
    if (texto.length <= 0 || texto < quantidade)
        return [texto]; // o jeito é retornar o valor total de entrada, pois não condiz com a quantidade total de caracteres.

    var resultado = [], posicao = 0;
    // é criado um array com cada trecho de palavras ["Lorem", "Ipsum", "é", ...]
    var textoSplit = texto.split(/([\s\n\r]+)/);

    // vai percorrer todo o array (textoSplit) criado
    for (var i = 0; i < textoSplit.length; ++i) {
        // instancia a entrada da matriz para uma string vazia caso ela seja null/undefined
        if (!resultado[posicao]) resultado[posicao] = "";
        // soma a quantidade total de caracteres e verifica se atingiu o valor máximo definido.
        if ((resultado[posicao].length + textoSplit[i].length) <= quantidade) {
            // vai armazenando até atingir o valor máximo
            resultado[posicao] += textoSplit[i];
        } else { // caso tenha atingido o valor máximo
            posicao++; // incrementa uma nova posição, ou seja, uma nova chave (página) para o array
        }
    }

    return resultado; // retorna o array com seus respectivos valores
}

test the code!


Great, it works! But...

The right thing to do (particularly speaking..) is partitioning/distributing by words and not by amount. For it can rather occur of, define divideTexto(texto, 100) and to reach the quantity of 100 characters, be, exactly the middle position of a word, that is to say:

"Lorem Ipsum is simply a simulation of typeface and print industry text, and comes" (100 characters)

"... printing and printing industry, and comes being used since the 16th century ..."

The same sense of using word-break: break-all of in paragraphs that by the way is horrible the result, trying to fit as many characters as possible into each line. The opposite of the word-wrap: break-word that will break words that are too long by pushing them to a new line.


Therefore, it is more viable and recommended..

Distribute them by words, so the whole process will become more dynamic!

const loremIpsum = "Lorem Ipsum é simplesmente uma simulação de texto da indústria tipográfica e de impressos, e vem sendo utilizado desde o século XVI, quando um impressor desconhecido pegou uma bandeja de tipos e os embaralhou para fazer um livro de modelos de tipos. Lorem Ipsum sobreviveu não só a cinco séculos, como também ao salto para a editoração eletrônica, permanecendo essencialmente inalterado. Se popularizou na década de 60, quando a Letraset lançou decalques contendo passagens de Lorem Ipsum, e mais recentemente quando passou a ser integrado a softwares de editoração eletrônica como Aldus PageMaker.";

const dividePalavras = (texto, quantidade) => {
   if (texto.length <= 0 || texto.split(/[\s]+/).length < quantidade) 
      return [texto];
   
   var resultado = [], posicao = 0;
   var textoSplit = texto.split(/([\s\n\r]+)/);
   for (var i = 0; i < textoSplit.length; ++i) {
      if (!resultado[posicao]) resultado[posicao] = "";
      // vai verificar se a quantidade de palavras condiz com a quantidade definida..
      if (resultado[posicao].split(/[\s]+/).length <= quantidade) {
         resultado[posicao] += textoSplit[i]; // vai armazenando até atingir a quantidade total
      } else {
         posicao++; // incrementa uma nova posição, ou seja, uma nova chave (página) para o array
         if (!resultado[posicao]) resultado[posicao] = ""; // // instancia a entrada da matriz para uma string vazia caso ela seja null/undefined
         resultado[posicao] += textoSplit[i]; // para não "engolir" nenhuma palavra, é adicionado para nova posição e assim sucessivamente..
      }
   }
   
   return resultado;
}

// vai mapear todo o array para imprimir os resultados..
dividePalavras(loremIpsum, 25).map(trecho => {
   document.querySelector(".container").innerHTML += `<div class="page">${trecho}</div>`;
});
.page {
  width: 150px;
  height: 300px;
  border: 1px solid #000;
  padding: 10px 15px;
  float: left;
  margin-left: 15px;
}
<div class="container"></div>

  • Very good idea to separate by words, but I noticed that from the second column is printing only 24 words.

  • 1

    @Andrécabral ready, corrected! It’s because in else { posicao++ ... ended up "swallowing" a word, because it did not have the condition to validate whether it is less or equal to the defined amount, so the loop would only validate in the next execution! Good point, thank you!

4

I am posting only as a reference. But it is possible to have a result very similar to what you want with CSS only using column-count. https://developer.mozilla.org/en-US/docs/Web/CSS/column-count

inserir a descrição da imagem aqui

You can put some values like

column-count: 3; (define quantas colunas de conteúdo vc quer)
column-rule: 1px solid black; (define a linaha entre uma coluna e outra)
column-gap: 40px; (define o espaçamento entre uma coluna e outra)

Follow the example by making u innerHTML of the text in div. So even though the text being injected dynamically the result is quite satisfactory, and the responsiveness is super easy to adjust by changing the value of the column-count for 2 or 1 on small screens.

let texto = `Lorem consectetur adipisicing elit. Debitis pariatur ipsum quos, adipisci
    laboriosam expedita possimus soluta tempora culpa, officia rerum ducimus consequuntur delectus
    error cumque maxime aperiam ullam sequi?
    O que é o Lorem Ipsum? O Lorem Ipsum é um texto modelo da indústria
    tipográfica e de impressão. O Lorem Ipsum tem vindo a ser o texto
    padrão usado por estas indústrias desde o ano de 1500, quando uma
    misturou os caracteres de um texto para criar um espécime de livro.
    Este texto não só sobreviveu 5 séculos, mas também o salto para a
    tipografia electrónica, mantendo-se essencialmente inalterada. Foi
    popularizada nos anos 60 com a disponibilização das folhas de
    Letraset, que continham passagens`

document.getElementById("page01").innerHTML += texto
div {
  column-count: 3;
  column-rule: 1px solid black;
  column-gap: 40px;
}
<div id="page01">

</div>

  • 1

    Very good hugocsl! I also contemplated the use of the column-count using only [tag:css] but due to the [tag:javascript] present, ai priorizei! But very good even the reference!

1

you can, before entering the Ivs, calculate how many would be created. After that, dynamically insert the div into the html with its text position.

let texto = `Lorem consectetur adipisicing elit. Debitis pariatur ipsum quos, adipisci
    laboriosam expedita possimus soluta tempora culpa, officia rerum ducimus consequuntur delectus
    error cumque maxime aperiamor cumque maxime aperiam ullam sequi?
    O que é o Lorem Ipsum? O Lorem Ipsum é um texto modelo da indústria
    tipográfica e de impressão. O Lorem Ipsum tem vindo a ser o texto
    padrão usado por estas indústrias desde o ano de 1500, quando uma
    misturou os caracteres de um texto para criar um espécime de livro.
    Este texto não só sobreviveu 5 séculos, mas também o salto para a
    tipografia electrónica, mantendo-se essencialmente inalterada. Foi
    popularizada nos anos 60 com a disponibilização das folhas de
    Letraset, que continham passagensor cumque maxime aperiam ullam sequi?
    O que é o Lorem Ipsum? O Lorem Ipsum é um texto modelo da indústria
    tipográfica e de impressão. O Lorem Ipsum tem vindo a ser o texto
    padrão usado por estas indústrias desde o ano de 1500, quando uma
    misturou os caracteres de um texto para criar um espécime de livro.
    Este texto não só sobreviveu 5 séculos, mas também o salto para a
    tipografia electrónica, mantendo-se essencialmente inalterada. Foi
    popularizada nos anos 60 com a disponibilização das folhas de
    Letraset, que continham passagensor cumque maxime aperiam ullam sequi?
    O que é o Lorem Ipsum? O Lorem Ipsum é um texto modelo da indústria
    tipográfica e de impressão. O Lorem Ipsum tem vindo a ser o texto
    padrão usado por estas indústrias desde o ano de 1500, quando uma
    misturou os caracteres de um texto para criar um espécime de livro.
    Este texto não só sobreviveu 5 séculos, mas também o salto para a
    tipografia electrónica, mantendo-se essencialmente inalterada. Foi
    popularizada nos anos 60 com a disponibilização das folhas de
    Letraset, que continham passagens ullam sequi?
    O que é o Lorem Ipsum? O Lorem Ipsum é um texto modelo da indústria
    tipográfica e de impressão. O Lorem Ipsum tem vindo a ser o texto
    padrão usado por estas indústrias desde o ano de 1500, quando uma
    misturou os caracteres de um texto para criar um espécime de livro.
    Este texto não só sobreviveu 5 séculos, mas também o salto para a
    tipografia electrónica, mantendo-se essencialmente inalterada. Foi
    popularizada nos anos 60 com a disponibilização das folhas de
    Letraset, que continham passageor cumque maxime aperiam ullam sequi?
    O que é o Lorem Ipsum? O Lorem Ipsum é um texto modelo da  
`
    
var countText = Math.ceil(texto.length / 305)
var elemento = document.querySelector(".container")


for (var c=1; c <= countText; c++) {
  
  elemento.innerHTML += `
    <div class="page">
        ${texto.substring(305*(c-1), 305*c)}
    </div>
 `
}
.page {
  width: 150px;
  height: 300px;
  border: 1px solid #000;
  padding: 10px 15px;
  float: left;
  margin-left: 15px;
}
<div class="container">

</div>

  • So, this way I even thought but the problem is in the breaking of the texts, this hiccup depending on the position breaks the word in half, just as it is in your code.

  • 2

    The problem is also if you have tags (e.g. image, type <img src="imagem.jpg">). That way it won’t work.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.