Fiz uma imagem para esta pergunta para facilitar a compreensão.
É possível criar reticências em uma <div>
largura fixa e várias linhas?
Eu tentei alguns plugins jQuery aqui e ali, mas não consigo encontrar o que estou procurando. Alguma recomendação? Ideias?
javascript
jquery
html
css
Edward
fonte
fonte
Respostas:
Apenas uma ideia básica rápida.
Eu estava testando com a seguinte marcação:
E CSS:
A aplicação desse jQuery alcançará o resultado desejado:
Ele tenta remover repetidamente a última palavra do texto até atingir o tamanho desejado. Por causa do estouro: oculto; o processo permanece invisível e, mesmo com o JS desativado, o resultado permanece 'visualmente correto' (sem o "...", é claro).
Se você combinar isso com um truncamento sensível no lado do servidor (isso deixa apenas uma pequena sobrecarga), ele será executado mais rapidamente :).
Novamente, essa não é uma solução completa, apenas uma idéia.
UPDATE: adicionada uma demonstração do jsFiddle .
fonte
li
e dentro de cada um existe um.block
e um.block h2
e preciso aplicar isso aoh2
interior,.block
mas não consegui fazê-lo funcionar. É diferente se houver mais de um.block h2
?height*3
por alguns pixels. Reparo fácil é simplesmente adicionar alguns pixels paradivh
while
linha:if(!$p.text().match(/\W*\s(\S)*$/)) break;
while ((upper-lower)>1) {let middle=((lower+upper)/2)|0 /*|0 is quick floor*/; if (test(words.slice(0,middle)+'...')) {lower=middle;} else {upper=middle;}}
. Como o @KrisWebDev encontrou, você também deve procurar uma palavra gigante.Experimente o plugin jQuery.dotdotdot .
fonte
Bibliotecas Javascript para "fixação de linhas"
Observe que "fixação de linha" também é conhecida como "reticências no bloco de várias linhas" ou "reticências verticais".
github.com/BeSite/jQuery.dotdotdot
github.com/josephschmitt/Clamp.js
Aqui estão mais algumas que eu não investiguei ainda:
Soluções CSS para fixação de linhas
Existem algumas soluções de CSS, mas os usos mais simples,
-webkit-line-clamp
com pouco suporte ao navegador . Veja demonstração ao vivo em jsfiddle.net/AdrienBe/jthu55v7/Muitas pessoas fizeram grandes esforços para que isso acontecesse usando apenas CSS. Veja artigos e perguntas sobre o assunto:
O que eu recomendaria
Mantenha simples. A menos que você tenha bastante tempo para se dedicar a esse recurso, opte pela solução mais simples e testada: CSS simples ou uma biblioteca javascript bem testada.
Escolha algo sofisticado / complexo / altamente personalizado e você pagará o preço por isso no futuro.
O que os outros fazem
Desaparecer como o Airbnb pode ser uma boa solução. Provavelmente é CSS básico, juntamente com jQuery básico. Na verdade, parece muito semelhante a esta solução no CSSTricks
Ah, e se você procurar inspirações de design:
fonte
Não existe esse recurso no HTML, e isso é muito frustrante.
Eu desenvolvi uma biblioteca para lidar com isso.
Confira meu site para captura de tela, tutorial e link de transferência.
fonte
Solução JS pura, baseada na solução de bažmegakapa, e alguma limpeza para dar conta de pessoas que tentam fornecer uma altura / altura máxima que seja menor que a linha do elemento
fonte
Eu tenho uma solução que funciona bem, mas em vez de uma elipse, ela usa um gradiente. As vantagens são que você não precisa fazer nenhum cálculo de JavaScript e funciona para contêineres de largura variável, incluindo células da tabela. Ele usa algumas divs extras, mas é muito fácil de implementar.
http://salzerdesign.com/blog/?p=453
Edit: Desculpe, eu não sabia que o link não era suficiente. A solução é colocar uma div ao redor do texto e estilizar a div para controlar o estouro. Dentro da div, coloque outra div com um gradiente "fade" que pode ser feito usando CSS ou uma imagem (para o IE antigo). O gradiente passa de transparente para a cor de fundo da célula da tabela e é um pouco mais largo que uma elipse. Se o texto for longo e estourar, ele ficará sob a div "fade" e parecerá "desbotado". Se o texto for curto, o desbotamento será invisível, portanto não haverá problema. Os dois contêineres podem ser ajustados para permitir que uma ou várias linhas sejam exibidas, definindo a altura do contêiner como um múltiplo da altura da linha de texto. A div "fade" pode ser posicionada para cobrir apenas a última linha.
fonte
Aqui está uma maneira pura de CSS para fazer isso: http://www.mobify.com/blog/multiline-ellipsis-in-pure-css/
Aqui está um resumo:
fonte
Você pode usar a
-webkit-line-clamp
propriedade comdiv
.-webkit-line-clamp: <integer>
o que significa definir o número máximo de linhas antes de truncar o conteúdo e exibir reticências(…)
no final da última linha.fonte
Aqui está uma solução JavaScript vanilla que você pode usar em uma pitada:
Você pode brincar com ele no código abaixo. Tente alterar o tamanho da fonte no painel CSS e faça uma pequena edição no painel HTML (por exemplo, adicione um espaço extra em algum lugar) para atualizar os resultados. Independentemente do tamanho da fonte, o parágrafo do meio sempre deve ser truncado para o número de linhas no segundo parâmetro passado para limitLines ().
Codepen: http://codepen.io/thdoan/pen/BoXbEK
fonte
Edição: deparei com Shave, que é o plugin JS que faz o truncamento de texto de várias linhas com base em uma determinada altura máxima muito bem. Ele usa a pesquisa binária para encontrar o ponto de interrupção ideal. Definitivamente vale a pena investigar.
RESPOSTA ORIGINAL:
Eu tive que criar uma solução JS vanilla para esse problema. No caso em que trabalhei, tive que ajustar um nome de produto longo em largura limitada e em duas linhas; truncado por reticências, se necessário.
Eu usei respostas de vários posts do SO para preparar algo que atendesse às minhas necessidades. A estratégia é a seguinte:
Exemplo de código:
PS:
PPS: Acabei de perceber que isso é muito semelhante à abordagem sugerida por @DanMan e @ st.never. Confira os trechos de código para obter um exemplo de implementação.
fonte
Solução javascript muito simples. Divs deve ser denominado fe:
E JS:
fonte
Não é uma resposta exata para a pergunta, mas me deparei com esta página ao tentar fazer algo parecido, mas ao querer adicionar um link para "exibir mais", em vez de apenas reticências diretas. Esta é uma função jQuery que adicionará um link "mais" ao texto que está transbordando um contêiner. Pessoalmente, estou usando isso com o Bootstrap, mas é claro que funcionará sem.
Para usar, coloque seu texto em um contêiner da seguinte maneira:
Quando a seguinte função jQuery é adicionada, qualquer uma das divs maiores que o valor de ajuste da altura será truncada e terá um link "Mais" adicionado.
Com base nisso, mas atualizado: http://shakenandstirredweb.com/240/jquery-moreless-text
fonte
O mencionado plugin do jQuery dotdotdot funciona bem com angular:
A marcação correspondente seria:
fonte
Demonstração JS pura (sem jQuery e loop 'while')
Quando pesquisei a solução do problema de reticências multilinhas, fiquei surpreso por não haver uma boa sem o jQuery. Também existem algumas soluções baseadas no loop 'while', mas acho que elas não são eficazes e perigosas devido à possibilidade de entrar no loop infinito. Então eu escrevi este código:
fonte
Talvez seja tarde demais, mas usando o SCSS você pode declarar uma função como:
E use-o como:
O que truncará o texto em uma linha e sabendo que ele tem 1,4 de sua altura. A saída esperada é que o chrome seja processado
...
no final e o FF com algum desbotamento legal no finalRaposa de fogo
cromada
fonte
Encontrei esta solução curta apenas de CSS na resposta de Adrien Be :
Em março de 2020, o suporte ao navegador é de 95,3% , não sendo suportado no IE e no Opera Mini. Funciona no Chrome, Safari, Firefox e Edge.
fonte
Você provavelmente não pode fazê-lo (atualmente?) Sem uma fonte de largura fixa como Courier. Com uma fonte de largura fixa, todas as letras ocupam o mesmo espaço horizontal; portanto, você provavelmente pode contar as letras e multiplicar o resultado pelo tamanho da fonte atual em ems ou exs. Depois, basta testar quantas letras cabem em uma linha e depois separá-las.
Como alternativa, para fontes não fixas, você pode criar um mapeamento para todos os caracteres possíveis (como i = 2px, m = 5px) e depois fazer as contas. Um monte de trabalho feio embora.
fonte
Para expandir a solução da @ DanMan: no caso de fontes com largura variável, você pode usar uma largura média. Isso tem dois problemas: 1) um texto com muitos Ws seria estourado e 2) um texto com muitos Is seria truncado anteriormente.
Ou você pode adotar uma abordagem de pior caso e usar a largura da letra "W" (que acredito ser a mais ampla). Isso remove o problema 1 acima, mas intensifica o problema 2.
Uma abordagem diferente poderia ser: deixe
overflow: clip
na div e adicione uma seção de reticências (talvez outra div ou imagem) comfloat: right; position: relative; bottom: 0px;
(não testado). O truque é fazer a imagem aparecer acima do final do texto.Você também pode exibir a imagem apenas quando sabe que ela está transbordando (digamos, após cerca de 100 caracteres)
fonte
overflow: clip
? E o que você esperaria que esse CSSfloat
fizesse?Com esse código, não há necessidade de uma div de wrapper extra se o elemento tiver sua altura limitada por um estilo de altura máxima.
Além disso, ele salva o texto original em um atributo de dados que pode ser exibido usando apenas estilos, por exemplo. ao passar o mouse:
fonte
No meu cenário, não consegui trabalhar com nenhuma das funções mencionadas acima e também precisava informar à função quantas linhas exibir, independentemente do tamanho da fonte ou do tamanho do contêiner.
Baseei minha solução no uso do método Canvas.measureText (que é um recurso HTML5 ), conforme explicado aqui pela Domi , para que não seja completamente compatível com vários navegadores.
Você pode ver como ele funciona nesse violino .
Este é o código:
E o HTML para usá-lo seria assim:
O código para obter a família de fontes é bastante simples e, no meu caso, funciona, mas para cenários mais complexos, você pode precisar usar algo nesse sentido .
Além disso, no meu caso, estou dizendo à função quantas linhas usar, mas você pode calcular quantas linhas serão exibidas de acordo com o tamanho e a fonte do contêiner.
fonte
Eu fiz uma versão que deixa o html intacto. exemplo jsfiddle
jQuery
CSS
exemplo jsfiddle
fonte
Eu escrevi um componente angular que resolve o problema. Ele divide um determinado texto em elementos de amplitude. Após a renderização, ele remove todos os elementos que transbordam e coloca as reticências logo após o último elemento visível.
Exemplo de uso:
Demonstração do Stackblitz: https://stackblitz.com/edit/angular-wfdqtd
O componente:
fonte
Aqui fiz outra biblioteca com algoritmo mais rápido. Por favor, verifique:
https://github.com/i-ahmed-biz/fast-ellipsis
Para instalar usando o caramanchão:
Para instalar usando o npm:
Espero que goste!
fonte
não tenho certeza se é isso que você procura, ele usa altura mínima em vez de altura.
fonte
Uma função muito simples serve.
Directiva:
Visão:
fonte
iiiiiiiiii
vsMMMMMMMMMM
(com a fonte atual que não é tão visível: D).