Eu tenho um espaço com dados dinâmicos na minha página, com ellipsis
estilo.
.my-class
{
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
width: 71px;
}
<span id="myId" class="my-class"></span>
document.getElementById('myId').innerText = "...";
Gostaria de adicionar a este elemento a dica de ferramenta com o mesmo conteúdo, mas quero que apareça apenas quando o conteúdo for longo e as reticências aparecerem na tela.
Há alguma forma de fazer isso?
O navegador lança um evento quando ellipsis
está ativado?
* Navegador: Internet Explorer
text-overflow:ellipsis;
isso não funciona no Firefox - consulte esta pergunta para saber mais: stackoverflow.com/questions/4927257/…element.offsetWidth < element.scrollWidth
, de acordo com esta resposta, parece funcionar até agora.text-overflow:ellipsis;
agora funciona no Firefox; foi adicionado no Firefox 7 (lançado em setembro de 2011).Respostas:
Aqui está uma maneira de fazê-lo usando a configuração de reticências incorporada e adicionando o
title
atributo sob demanda (com jQuery) ao comentário de Martin Smith:fonte
"As of jQuery 1.7, the .on() method is the preferred method for attaching event handlers to a document"
para obter mais informações, consulte api.jquery.com/bind e api.jquery.com/onAqui está uma solução CSS pura. Não há necessidade de jQuery. Ele não mostrará uma dica de ferramenta; em vez disso, apenas expandirá o conteúdo em todo o comprimento na passagem do mouse.
Funciona muito bem se você tiver um conteúdo que seja substituído. Então você não precisa executar uma função jQuery sempre.
fonte
A resposta de uosɐſ é fundamentalmente correta, mas você provavelmente não deseja fazê-lo no evento mouseenter. Isso fará com que ele faça o cálculo para determinar se é necessário, toda vez que você passa o mouse sobre o elemento. A menos que o tamanho do elemento esteja mudando, não há razão para fazer isso.
Seria melhor chamar esse código imediatamente após o elemento ser adicionado ao DOM:
Ou, se você não souber exatamente quando foi adicionado, chame esse código após o término do carregamento da página.
se você tiver mais de um elemento único com o qual precisa fazer isso, poderá dar a eles a mesma classe (como "couldOverflow") e usar esse código para atualizar todos:
fonte
$(".mightOverflow").each(function() { if( $(this).offsetWidth < $(this).scrollWidth && !$(this).attr('title')){ $(this).attr('title', $(this).text()); $(this).css('border-bottom', '1px dotted #A8A8A8'); } });
this.offsetWidth < this.scrollWidth
e possivelmente até a verificação!$this.attr('title')
será realizada sempre que você passar o mouse sobre o elemento.Aqui estão duas outras soluções CSS puras:
fonte
Aqui está o meu plugin jQuery:
Uso:
Editar:
Eu fiz uma essência para este plugin. https://gist.github.com/UziTech/d45102cdffb1039d4415
fonte
Precisamos detectar se as reticências são realmente aplicadas e, em seguida, mostrar uma dica de ferramenta para revelar o texto completo. Não basta apenas comparar "
this.offsetWidth < this.scrollWidth
" quando o elemento quase mantém seu conteúdo, mas apenas falta um ou dois pixels a mais, especialmente para o texto de caracteres chineses / japoneses / coreanos de largura total.Aqui está um exemplo: http://jsfiddle.net/28r5D/5/
Eu encontrei uma maneira de melhorar a detecção de reticências:
this.offsetWidth < this.scrollWidth
" primeiro, continue na etapa 2 se falhar.Aqui está a minha melhoria: http://jsfiddle.net/28r5D/6/
fonte
Criei um plugin jQuery que usa a dica de ferramenta do Bootstrap em vez da dica de ferramenta incorporada do navegador. Observe que isso não foi testado com o navegador mais antigo.
JSFiddle: https://jsfiddle.net/0bhsoavy/4/
fonte
Foi o que eu fiz. A maioria dos scripts de dicas de ferramentas exige que você execute uma função que armazena as dicas de ferramentas. Este é um exemplo de jQuery:
Se você não quis verificar reticências css, poderia simplificar como:
Eu tenho o "quando" ao redor, para que a função "setupTooltip" não seja executada até que todos os títulos tenham sido atualizados. Substitua "setupTooltip" pela função de dica de ferramenta e * pelos elementos que deseja verificar. * passará por todos eles se você o deixar.
Se você deseja apenas atualizar os atributos de título com a dica de ferramenta de navegador, pode simplificar:
Ou sem verificação de reticências:
fonte
Se você quiser fazer isso apenas usando javascript, faça o seguinte. Atribua ao span um atributo id (para que ele possa ser facilmente recuperado do DOM) e coloque todo o conteúdo em um atributo chamado 'content':
Em seu javascript, você poderá fazer o seguinte depois que o elemento for inserido no DOM.
Obviamente, se você estiver usando javascript para inserir a extensão no DOM, poderá manter o conteúdo em uma variável antes de inseri-lo. Dessa forma, você não precisa de um atributo de conteúdo no período.
Existem soluções mais elegantes que essa se você quiser usar o jQuery.
fonte
$("#myDataId").attr("title", function() { var innerText = $(this).text(); var content = $(this).attr("content"); if (innerText.length <= content.length) { return content; } return null; });
Eu tenho a classe CSS, que determina onde colocar reticências. Com base nisso, eu faço o seguinte (o conjunto de elementos pode ser diferente, eu escrevo aqueles em que as reticências são usadas, é claro que poderia ser um seletor de classe separado):
fonte
this
era um,anchor
então eu usei emthis.text()
vez deval()
Aqui está uma solução JavaScript Vanilla:
fonte
Esta foi a minha solução, funciona como um encanto!
fonte
Nenhuma das soluções acima funcionou para mim, mas descobri uma ótima solução. O maior erro que as pessoas estão cometendo é ter todas as três propriedades CSS declaradas no elemento após o carregamento da página. É necessário adicionar esses estilos + dica de ferramenta dinamicamente SE e SOMENTE SE o intervalo em que você deseja uma elipse for maior que seu pai.
fonte
Você pode cercar a extensão com outra extensão e simplesmente testar se a largura da extensão original / interna é maior que a largura da extensão nova / externa. Observe que eu digo que possivelmente - ele é basicamente baseado na minha situação em que eu tinha um
span
interior de um,td
então eu realmente não sei se ele funcionará com umspan
interior de umspan
.Mas aqui está o meu código para outros que podem se encontrar em uma posição semelhante à minha; Estou copiando / colando sem modificação, mesmo que esteja em um contexto angular, não acho que isso prejudique a legibilidade e o conceito essencial. Eu o codifiquei como um método de serviço porque precisava aplicá-lo em mais de um local. O seletor que eu estou passando é um seletor de classe que corresponderá a várias instâncias.
fonte