2010-10-08 7 views
4

Comment redimensionner automatiquement la taille de police d'un <td> si le contenu passe en deuxième ligne? Je sais comment augmenter/diminuer la taille de la police en utilisant CSS et jquery mais comment faire automatiquement la taille de la police plus petite si un particulier ou tous les td avec un texte de nom de classe spécifique devient plus long que d'une ligne.jQuery Taille de police CSS

<div style="overflow: hidden;" id="parentDiv" class="scroll"> 

 

<div id="4" > 
    <table id="t4" class="Table"> 
    <tbody> 
     <tr> 
     <td id="b4" class="bY"><table id="inner1" width="100%" cellpadding="3"> 
      <tbody> 
       <tr> 
       <td class="code" id="code4" width="172"></td> 
       <td class="Num" id="Num4" width="50"></td> 
       <td colspan="2" class="Name" id="Name"></td> 
       </tr> 
       <tr> 
       <td class="code" width="172">&nbsp;</td> 
       <td>&nbsp;</td> 
       <td class="serial" width="110"></td> 
       <td class="serial" width="322"></td> 
       </tr> 
      </tbody> 
      </table></td> 
     </tr> 
    </tbody> 
    </table> 
</div> 

+0

J'essaie d'ajouter du code ici, mais il ne s'affiche pas – t0mcat

Répondre

4

Vous voulez .filter(). Pour la plupart des éléments cela devrait fonctionner:

$(".myClass").filter(function() 
{ 
    var el = $(this); 
    el.css("white-space", "nowrap"); 
    var lineHeight = el.height(); 
    el.css("white-space", ""); 
    return el.height() > lineHeight; 
}).css("font-size", "10pt"); 

Traiter avec des tables, toutes les cellules dans une rangée ont la même hauteur, afin de vérifier la valeur d'un élément enfant. Par exemple, envelopper tout dans un div. Toutefois, si vous devez agir sur un <td> directement:

$(function() 
{ 
    $(".myClass td").filter(function() 
    { 
     var el = $(this); 
     el.closest("tr").andSelf().css("white-space", "nowrap"); 
     var lineHeight = el.height(); 
     el.css("white-space", "normal"); 
     var textWraps = el.height() > lineHeight; 
     el.closest("tr").andSelf().css("white-space", ""); 
     return textWraps; 
    }).css("font-size", "10pt"); 
}); 
+0

Salut Gilly, Comment ce code sait-il que le contenu se déplace dans la deuxième ligne? – t0mcat

+0

En supposant que la hauteur d'une ligne de texte est 20px, si la hauteur de la div est supérieure à 20px, le texte a été enveloppé. Avez-vous besoin de cela pour travailler même si vous ne connaissez pas la hauteur d'une ligne de texte? – gilly3

+0

Oui gilly, le req le plus fondamental est, peu importe la hauteur, dès que le texte passe en deuxième ligne, la police doit être plus petite afin de restreindre le contenu d'une ligne. La largeur actuelle du td est de 172 si cela aide. – t0mcat

0
var newFontSize = 8 
if $('td').filter(function() { 
    return $(this).height() > 20 
}).css("font-size", newFontSize); 

Jouer à la hauteur> 20 et newFontsize pour obtenir ce que vous voulez.

+0

Merci les gens, je n'ai pas eu une chose ici. Nous comparons la hauteur avec 20? Comment le code sait-il que le contenu va passer à la deuxième ligne? – t0mcat

+0

20 est arbitraire. Vous devez déterminer la hauteur d'une ligne et remplacer 20 par la hauteur réelle d'une ligne. Voulez-vous que ces deux fonctionnent n'importe où, sans avoir à connaître la hauteur d'une ligne à l'avance? – gilly3

+0

Désolé n'a pas regardé en détail. Donc vous comparez la hauteur actuelle ($ this.height()) avec la hauteur ???? – t0mcat

1

Il n'existe pas de moyen simple d'obtenir la largeur (en pixels) du contenu du texte. Vous pouvez cependant obtenir une estimation raisonnable en multipliant le nombre de caractères par la largeur moyenne en pixels de chaque caractère - cela varie en fonction de la police, et fonctionne mieux pour les polices à largeur fixe comme Courier. Cela suppose également que tout le contenu est du texte simple sans formatage supplémentaire.

La plupart des polices ont une largeur de caractères inférieure à la hauteur, donc supposant que width = height fonctionnera définitivement.

Exemple:

var fontSize = parseInt($('.my-td-class').css('font-size')); // get default font size 

function updateFont() { 
    var e = $('#some-element'); 
    while (e.text().length * fontSize > e.width()) { 
    fontSize *= 0.8; // reduce to 80% 
    e.css('font-size', fontSize + 'px'); 
    } 
} 

Edit: D'après les autres réponses, vous pouvez appliquer cette technique à la hauteur aussi bien. Assurez-vous simplement que la comparaison largeur/hauteur reflète la taille de la police actuelle et non une valeur codée en dur.

+0

Salut casablanca, cette technique va-t-elle fonctionner si j'ai ma police définie dans em? La taille actuelle est 1em, si le contenu passe à la deuxième ligne, je veux le faire 0.8em. – t0mcat

+0

@ t3ch: J'ai mis à jour le code afin qu'il reçoive la taille de police par défaut lorsque la page est chargée, et passe à 80% lorsque la ligne ne correspond pas. – casablanca

+0

merci. Je suis confus sur une chose. Ce code fonctionnera-t-il sur tous les td avec une classe particulière? (Je veux dire, il va vérifier à travers tous les td? Si la hauteur est plus d'une ligne, puis réduire la police, sinon le laisser seul.) – t0mcat