Lettertype Schalen op basis van de breedte van de container

Ik heb het moeilijk om mijn hoofd rond het schalen van het lettertype te krijgen.

Ik heb momenteel een website met een lichaam font-sizevan 100%. 100% van wat dan? Dit lijkt te berekenen bij 16 pixels.

Ik had de indruk dat 100% op de een of andere manier naar de grootte van het browservenster zou noemen, maar blijkbaar niet omdat het altijd 16 pixels is of het venster wordt verkregen tot een mobiele breedte of volledig opgewekt breedbeeldbureau.

Hoe kan ik de tekst op mijn siteschaal maken in relatie tot de container? Ik heb geprobeerd emte gebruiken, maar dit schaalt ook niet.

Mijn redenering is dat dingen zoals mijn menu worden gezet als je het formaat vangt, dus ik moet de pxfont-sizevan .menuItemonder andere elementen in relatie tot de breedte van de container. (Bijvoorbeeld in het menu op een groot desktop, 22pxwerkt perfect. Ga naar beneden naar de tabletbreedte en 16pxis meer geschikt.)

Ik weet dat ik breakpoints kan toevoegen, maar ik wil echt de tekst op schaal als nou als extra breakpoints, anders zal ik eindigen met honderden breakpoints voor elke 100pixels afnemen Breedte om de tekst te besturen.


1, Autoriteit 100%

EDIT: Als de container niet het lichaam is CSS-trucs dekt al uw opties in Tekst aanpassen aan een container .

Als de container het lichaam is, waarnaar u op zoek bent, is Viewport-percentage lengtes :

De Viewport-percentage lengtes zijn ten opzichte van de grootte van de eerste bevattende blok . Wanneer de hoogte of breedte van het initiële bevattende blok wordt gewijzigd, worden ze dienovereenkomstig geschaald. Wanneer de waarde van overloop op het root-element echter automatisch is, worden er geen schuifbalken aangenomen om niet te bestaan.

De waarden zijn:

  • vw(% van de Viewport-breedte)
  • vh(% van de Hoogte van de viewport)
  • vi(1% van de viewportformaat in de richting van de inline-as van het root-element)
  • vb(1% van de viewportformaat in de richting van de blokas van het root-element)
  • vmin(de kleinere van vwof vh)
  • vmax(de grotere of vwof vh)

1 V * is gelijk aan 1% van het initiële bevattende blok.

het gebruiken, ziet er als volgt uit:

p {
    font-size: 4vw;
}

Zoals u kunt zien, wanneer de Viewport-breedte toeneemt, doet u de font-size, zonder media-query’s te hoeven gebruiken.

Deze waarden zijn een sizing-eenheid, net als pxof em, zodat ze kunnen worden gebruikt om andere elementen ook te formuleren, zoals breedte, marge of opvulling .

Browserondersteuning is redelijk goed, maar je hebt waarschijnlijk een fallback nodig, zoals:

p {
    font-size: 16px;
    font-size: 4vw;
}

Bekijk de ondersteuningsstatistieken: http://caniuse.com/#Feat=ViewPort-units .

Bekijk ook CSS-Tricks voor een bredere look: Viewport-formaat typografie

Hier is een mooi artikel over het instellen van minimale/maximale maten en wat meer controle over de maten: Nauwkeurige controle over responsieve typografie

En hier is een artikel over het instellen van je maat met calc() zodat de tekst het kijkvenster vult: http: //codepen.io/CrocoDillon/pen/fBJxu

Bekijk ook dit artikel, dat gebruikmaakt van een techniek die ‘gesmolten leiding’ wordt genoemd om ook de regelhoogte aan te passen. Gesmolten toonaangevend in CSS


Antwoord 2, autoriteit 22%

Maar wat als de container niet de viewport (body) is?

Deze vraag is gesteld in een opmerking van Alex onder de geaccepteerd antwoord.

Dat feit betekent niet dat vwtot op zekere hoogte niet kan worden gebruikt voor de grootte van die container. Om nu enige variatie te zien, moet men aannemen dat de container op de een of andere manier flexibel in grootte is. Of het nu is door een direct percentage widthof door 100% minus marges te zijn. Het punt wordt “moot” als de container altijd is ingesteld op, laten we zeggen, 200pxbreed–stel dan gewoon een font-sizein die voor die breedte werkt.

Voorbeeld 1

Bij een container met flexibele breedte moet u zich echter realiseren dat de container op de een of andere manier nog steeds wordt verkleind uit de viewport. Als zodanig is het een kwestie van een vw-instelling aanpassen op basis van dat procentuele verschil in grootte met de viewport, wat betekent dat rekening wordt gehouden met de grootte van bovenliggende wrappers. Neem dit voorbeeld:

div {
    width: 50%;
    border: 1px solid black;
    margin: 20px;
    font-size: 16px;
    /* 100 = viewport width, as 1vw = 1/100th of that
       So if the container is 50% of viewport (as here)
       then factor that into how you want it to size.
       Let's say you like 5vw if it were the whole width,
       then for this container, size it at 2.5vw (5 * .5 [i.e. 50%])
    */
    font-size: 2.5vw;
}

Ervan uitgaande dat de diveen kind is van de body, is het 50%van die 100%breedte, wat de viewport-grootte is in dit basisgeval. Kortom, u wilt een vwinstellen die er goed uitziet voor u. Zoals je kunt zien in mijn opmerking in de bovenstaande CSS-inhoud, kun je dat wiskundig “overdenken” met betrekking tot de volledige viewport-grootte, maar je hoeft dat niet hoeftte doen. De tekst gaat “buigen” met de container omdat de container buigt met het formaat van de viewport. UPDATE: hier is een voorbeeld van twee containers van verschillende grootte.

Voorbeeld 2

U kunt ervoor zorgen dat de grootte van de viewport wordt bepaald door de daarop gebaseerde berekening af te dwingen. Beschouw dit voorbeeld:

html {width: 100%;} /* Force 'html' to be viewport width */
body {width: 150%; } /* Overflow the body */
div {
    width: 50%;
    border: 1px solid black;
    margin: 20px;
    font-size: 16px;
    /* 100 = viewport width, as 1vw = 1/100th of that
       Here, the body is 150% of viewport, but the container is 50%
       of viewport, so both parents factor  into how you want it to size.
       Let's say you like 5vw if it were the whole width,
       then for this container, size it at 3.75vw
       (5 * 1.5 [i.e. 150%]) * .5 [i.e. 50%]
    */
    font-size: 3.75vw;
}

De grootte is nog steeds gebaseerd op viewport, maar wordt in wezen ingesteld op basis van de containergrootte zelf.

Moet de grootte van de container dynamisch veranderen…

Als de grootte van het containerelement de procentuele relatie dynamisch zou veranderen, hetzij via @mediabreekpunten of via JavaScript, dan zou wat het basis “doel” ook was herberekening nodig hebben om dezelfde “relatie te behouden” ” voor tekstgrootte.

Neem voorbeeld #1 hierboven. Als de divis omgezet naar 25%breedte door @mediaof JavaScript, dan wordt tegelijkertijd de font-sizezou in de mediaquery of door JavaScript moeten worden aangepast aan de nieuwe berekening van 5vw * .25 = 1.25. Dit zou de tekstgrootte op dezelfde grootte zetten als die zou zijn geweest als de “breedte” van de originele 50%container gehalveerd was ten opzichte van de viewport-grootte, maar is nu verkleind vanwege een wijziging in zijn eigen procentuele berekening.

Een uitdaging

Met de CSS3 calc()-functie in gebruik, zou het moeilijk worden om dynamisch aan te passen, omdat die functie op dit moment niet werkt voor font-sizedoeleinden. U kunt dus geen pure CSS 3-aanpassing doen als uw breedte verandert op calc(). Het is natuurlijk mogelijk dat een kleine aanpassing van de breedte voor marges niet voldoende is om een wijziging in font-sizete rechtvaardigen, dus het maakt misschien niet uit.


Antwoord 3, autoriteit 6%

Oplossing met SVG:

.resizeme {
  resize: both;
  margin: 0;
  padding: 0;
  height: 75px;
  width: 500px;
  background-color: lightblue;
  overflow: hidden;
}
<div class="resizeme">
  <svg
    width="100%"
    height="100%"
    viewBox="0 0 500 75"
    preserveAspectRatio="xMinYMid meet"
    style="background-color:green"
    xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink"
  >
        <text
          x="0"
          y="75"
          font-size="75"
          fill="black"
        >█Resize This█</text>
      </svg>
</div>

Antwoord 4, autoriteit 3%

In een van mijn projecten gebruik ik een “mix” tussen vw en vh om de lettergrootte aan te passen aan mijn behoeften, bijvoorbeeld:

font-size: calc(3vw + 3vh);

Ik weet dat dit geen antwoord is op de vraag van de OP, maar misschien kan het een oplossing zijn voor iemand anders.


5, Autoriteit 2%

Er is een grote filosofie voor dit probleem.

Het gemakkelijkste om te doen zou zijn om een ​​bepaald lettergrootte van het lichaam te geven (ik beveel 10), en dan zou al het andere element hun lettertype hebben in emof rem.
Ik geef je een voorbeeld om die eenheden te begrijpen.
emis altijd ten opzichte van zijn ouder:

body{font-size: 10px;}
.menu{font-size: 2em;} /* That means 2*10 pixels  = 20 pixels */
.menu li{font-size: 1.5em;} /* That means 1.5*20 pixels = 30 pixels */

remis altijd relatief tov body:

body{font-size: 10px;}
.menu{font-size: 2rem;} /* That means 2*10 pixels = 20 pixels */
.menu li{font-size: 1.5rem;} /* that means 1.5*10 pixels = 15 pixels */

En dan zou je een script kunnen maken dat de lettergrootte zou aanpassen aan de breedte van je container.
Maar dit is niet wat ik zou aanraden. Omdat je in een container met een breedte van 900 pixels bijvoorbeeld een p-element zou hebben met een lettergrootte van 12 pixels, laten we zeggen. En volgens jouw idee zou dat een container van 300 pixels breed worden met een lettergrootte van 4 pixels. Er moet een ondergrens zijn.

Andere oplossingen zouden zijn met mediaquery’s, zodat u het lettertype voor verschillende breedtes zou kunnen instellen.

Maar de oplossing die ik zou aanraden is om een JavaScript-bibliotheek te gebruiken die je daarbij helpt. En fittext.jsdie ik tot nu toe heb gevonden.


Antwoord 6, autoriteit 2%

Hier is de functie:

document.body.setScaledFont = function(f) {
  var s = this.offsetWidth, fs = s * f;
  this.style.fontSize = fs + '%';
  return this
};

Converteer vervolgens al uw onderliggende lettergroottes van documenten naar em‘s of %.

Voeg dan zoiets als dit toe aan je code om de basislettergrootte in te stellen.

document.body.setScaledFont(0.35);
window.onresize = function() {
    document.body.setScaledFont(0.35);
}

http://jsfiddle.net/0tpvccjt/


Antwoord 7

Er is een manier om dit zonderJavaScript te doen!

U kunt een inline SVG-afbeelding gebruiken. U kunt CSS op een SVG gebruiken als deze inline is. Houd er rekening mee dat het gebruik van deze methode betekent dat uw SVG-afbeelding zal reageren op de containergrootte.

Probeer de volgende oplossing te gebruiken…

HTML

<div>
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 360.96 358.98" >
      <text>SAVE $500</text>
  </svg>
</div>

CSS

div {
  width: 50%; /* Set your container width */
  height: 50%; /* Set your container height */
}
svg {
  width: 100%;
  height: auto;
}
text {
  transform: translate(40px, 202px);
  font-size: 62px;
  fill: #000;
}

Voorbeeld:
https://jsfiddle.net/k8L4xLLa/32/

Wil je iets meer flitsends?

Met SVG-afbeeldingen kun je ook coole dingen doen met vormen en rommel. Bekijk deze geweldige use-case voor schaalbare tekst…

https://jsfiddle.net/k8L4xLLa/14/


Antwoord 8

Dit is misschien niet superpraktisch, maar als je wilt dat een lettertype een directe functie van de ouder is, zonder JavaScript dat luistert/loopt (interval) om de grootte van de div/pagina te lezen, is er een manier om het te doen. Iframes.

Alles binnen het iframe zal de grootte van het iframe beschouwen als de grootte van de viewport. De truc is dus om gewoon een iframe te maken waarvan de breedte de maximale breedte is die u wilt dat uw tekst is, en waarvan de hoogte gelijk is aan de maximale hoogte * de hoogte-breedteverhouding van de betreffende tekst.

Afgezien van de beperking dat viewport-eenheden niet naast de parent-eenheden voor tekst kunnen komen (zoals in het feit dat de %-grootte zich net als iedereen gedraagt), bieden viewport-eenheden een zeer krachtig hulpmiddel: in staat zijn om het minimum te krijgen /maximale afmeting. Je kunt dat nergens anders doen – je kunt niet zeggen … maak de hoogte van deze div de breedte van de ouder * iets.

Dat gezegd hebbende, de truc is om vmin te gebruiken en de iframe-grootte zo in te stellen dat [fractie] * totale hoogte een goede lettergrootte is wanneer de hoogte de beperkende dimensie is, en [fractie] * totale breedte wanneer de breedte is de beperkende maat. Daarom moet de hoogte een product zijn van de breedte en de beeldverhouding.

Voor mijn specifieke voorbeeld heb je

.main iframe{
  position: absolute;
  top: 50%;
  left: 50%;
  width: 100%;
  height: calc(3.5 * 100%);
  background: rgba(0, 0, 0, 0);
  border-style: none;
  transform: translate3d(-50%, -50%, 0);
}

Het kleine nadeel van deze methode is dat je de CSS van het iframe handmatig moet instellen. Als u het hele CSS-bestand bijvoegt, zou dat voor veel tekstgebieden veel bandbreedte in beslag nemen. Dus wat ik doe, is de regel die ik wil direct van mijn CSS toevoegen.

var rule = document.styleSheets[1].rules[4];
var iDoc = document.querySelector('iframe').contentDocument;
iDoc.styleSheets[0].insertRule(rule.cssText);

Je kunt een kleine functie schrijven die de CSS-regel krijgt / alle CSS-regels die van invloed zijn op het tekstgebied.

Ik kan geen andere manier bedenken om het te doen zonder wat fietsen / luisteren javascript te hebben. De echte oplossing zou zijn voor browsers om een ​​manier te bieden om tekst te schalen als een functie van de oudercontainer en om ook dezelfde VMIN / VMAX-type-functionaliteit te bieden.

JSFiddle:
https://jsfiddle.net/0jr7rrgm/3/
(Klik eenmaal om het rode vierkant op de muis te vergrendelen en klik nogmaals op om vrij te geven)

Het grootste deel van het JavaScript in de Fiddle is slechts mijn aangepaste klik-drag-functie.


9

Gebruik CSS-variabelen

Niemand heeft nog geen CSS-variabelen genoemd, en deze aanpak werkte het beste voor mij, dus:

Laten we zeggen dat je een kolom op je pagina hebt die 100% van de breedte van het scherm van een mobiel gebruiker is, maar heeft een max-widthvan 800px, dus op desktop is er een ruimte op aan beide kanten van de kolom. Plaats dit bovenaan uw pagina:

<script> document.documentElement.style.setProperty('--column-width', Math.min(window.innerWidth, 800)+'px'); </script>

En nu kunt u die variabele gebruiken (in plaats van de ingebouwde vw–eenheid) om de grootte van uw lettertype in te stellen. B.g

p {
  font-size: calc( var(--column-width) / 100 );
}

Het is geen pureCSS-aanpak, maar het komt aardig in de buurt.


Antwoord 10

100% is relatief ten opzichte van de basislettergrootte, die, als je deze niet hebt ingesteld, de standaard user-agent van de browser zou zijn.

Om het gewenste effect te krijgen, zou ik een stukje JavaScript-code gebruiken om de basislettergrootte aan te passen aan de afmetingen van het venster.


Antwoord 11

Mijn eigen oplossing, gebaseerd op jQuery, werkt door de lettergrootte geleidelijk te vergroten totdat de container een grote hoogteverhoging krijgt (wat betekent dat er een regeleinde is).

Het is vrij eenvoudig, maar werkt redelijk goed en is heel gemakkelijk te gebruiken. U hoeft nietste weten over het gebruikte lettertype, alles wordt geregeld door de browser.

Je kunt ermee spelen op http://jsfiddle.net/tubededentifrice/u5y15d0L/2/

De magie gebeurt hier:

var setMaxTextSize=function(jElement) {
    // Get and set the font size into data for reuse upon resize
    var fontSize=parseInt(jElement.data(quickFitFontSizeData)) || parseInt(jElement.css("font-size"));
    jElement.data(quickFitFontSizeData, fontSize);
    // Gradually increase font size until the element gets a big increase in height (i.e. line break)
    var i = 0;
    var previousHeight;
    do
    {
        previousHeight=jElement.height();
        jElement.css("font-size", "" + (++fontSize) + "px");
    }
    while(i++ < 300 && jElement.height()-previousHeight < fontSize/2)
    // Finally, go back before the increase in height and set the element as resized by adding quickFitSetClass
    fontSize -= 1;
    jElement.addClass(quickFitSetClass).css("font-size", "" + fontSize + "px");
    return fontSize;
};

Antwoord 12

Artistiek, als u twee of meer tekstregels in dezelfde breedte moet passen, ongeacht het aantal tekens, dan heb je leuke opties.

Het is het beste om een ​​dynamische oplossing te vinden, zodat de tekst wordt ingevoerd, eindigen we met een leuk scherm.

Laten we eens kijken hoe we kunnen benaderen.

var els     = document.querySelectorAll(".divtext"),
refWidth    = els[0].clientWidth,
refFontSize = parseFloat(window.getComputedStyle(els[0],null)
                               .getPropertyValue("font-size"));
els.forEach((el,i) => el.style.fontSize = refFontSize * refWidth / els[i].clientWidth + "px")
#container {
  display: inline-block;
  background-color: black;
  padding: 0.6vw 1.2vw;
}
.divtext {
  display: table;
  color: white;
  font-family: impact;
  font-size: 4.5vw;
}
<div id="container">
  <div class="divtext">THIS IS JUST AN</div>
  <div class="divtext">EXAMPLE</div>
  <div class="divtext">TO SHOW YOU WHAT</div>
  <div class="divtext">YOU WANT</div>
</div>

13

Deze webcomponent wijzigt de lettertype-formaat, zodat de binnenste tekstbreedte overeenkomt met de containerbreedte . Controleer de Demo .

U kunt het als volgt gebruiken:

<full-width-text>Lorem Ipsum</full-width-text>

14

Binnen uw CSS, probeer dit bij de onderkant toe te voegen aan de breedte van 320 pixels voor waar uw ontwerp begint te breken:

   @media only screen and (max-width: 320px) {
        body { font-size: 1em; }
    }

Geef vervolgens het lettertype-formaat in “PX” of “EM” zoals u wenst.


15

Misschien ben je op zoek naar zoiets als deze:

http://jsfiddle.net/sijav/dgsc9/4/

http://fiddle.jshell.net/sijav/dgsc9/4/show/

Ik heb FlowType , en het werkt goed (maar het is JavaScript en geen pure CSS-oplossing) :

$('body').flowtype({
    minFont: 10,
    maxFont: 40,
    minimum: 500,
    maximum: 1200,
    fontRatio: 70
});

16

Ik heb een eenvoudige schaalfunctie voorbereid met behulp van CSS-transformatie in plaats van lettertype-formaat. U kunt het in elke container gebruiken, u hoeft geen media-query’s, enz. 🙂

Blog Post:
Volledige breedte CSS & AMP; JS schaalbare koptekst

De code:

function scaleHeader() {
  var scalable = document.querySelectorAll('.scale--js');
  var margin = 10;
  for (var i = 0; i < scalable.length; i++) {
    var scalableContainer = scalable[i].parentNode;
    scalable[i].style.transform = 'scale(1)';
    var scalableContainerWidth = scalableContainer.offsetWidth - margin;
    var scalableWidth = scalable[i].offsetWidth;
    scalable[i].style.transform = 'scale(' + scalableContainerWidth / scalableWidth + ')';
    scalableContainer.style.height = scalable[i].getBoundingClientRect().height + 'px';
  }
}

Demo werken:
https://codepen.io/maciejkorsan/pen/bwlryj


17

Probeer http://simplefocus.com/flowtype/ . Dit is wat ik gebruik voor mijn sites, en het heeft perfect gewerkt.


18

Mijn probleem was vergelijkbaar, maar gerelateerd aan schaaltekst binnen een kop. Ik heb geprobeerd lettertype, maar ik moest de compressor uitwisselen om resultaten te krijgen, omdat het een enigszins ander probleem oplost, zoals tekststroom was.

Dus schreef ik mijn eigen kleine plug-in die de lettergrootte heeft verlaagd om de container te passen, ervan uitgaande dat je overflow: hiddenen white-space: nowrapDus Het verlaging van het lettertype tot het minimum staat niet toe dat de volledige kop toont, het snijdt gewoon af wat het kan laten zien.

(function($) {
  // Reduces the size of text in the element to fit the parent.
  $.fn.reduceTextSize = function(options) {
    options = $.extend({
      minFontSize: 10
    }, options);
    function checkWidth(em) {
      var $em = $(em);
      var oldPosition = $em.css('position');
      $em.css('position', 'absolute');
      var width = $em.width();
      $em.css('position', oldPosition);
      return width;
    }
    return this.each(function(){
      var $this = $(this);
      var $parent = $this.parent();
      var prevFontSize;
      while (checkWidth($this) > $parent.width()) {
        var currentFontSize = parseInt($this.css('font-size').replace('px', ''));
        // Stop looping if min font size reached, or font size did not change last iteration.
        if (isNaN(currentFontSize) || currentFontSize <= options.minFontSize ||
            prevFontSize && prevFontSize == currentFontSize) {
          break;
        }
        prevFontSize = currentFontSize;
        $this.css('font-size', (currentFontSize - 1) + 'px');
      }
    });
  };
})(jQuery);

Antwoord 19

Probeer de plug-in fitTextte gebruiken, want Viewport-formaten zijn niet de oplossing voor dit probleem.

Voeg gewoon de bibliotheek toe:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>

En verander de lettergrootte voor correct door de tekstcoëfficiënt in te stellen:

$("#text_div").fitText(0.8);

U kunt maximum- en minimumwaarden voor tekst instellen:

$("#text_div").fitText(0.8, { minFontSize: '12px', maxFontSize: '36px' });

Antwoord 20

Altijd uw elementmet dit kenmerk:

JavaScript: element.style.fontSize = "100%";

of

CSS: style = "font-size: 100%;"

Als je op volledig scherm gaat, zou je al een variabele schaalmoeten hebben berekend (schaal > 1 of schaal = 1). Dan, op volledig scherm:

document.body.style.fontSize = (scale * 100) + "%";

Het werkt prima met weinig code.


Antwoord 21

Kijk eens naar mijn code. Het maakt de font size smallerzodat het fitwat er ook is.

Maar ik denk dat dit niet leidt tot een goede gebruikerservaring

var containerWidth = $("#ui-id-2").width();
var items = $(".quickSearchAutocomplete .ui-menu-item");
var fontSize = 16;
items.each(function(){
    // Displaying a value depends sometimes on your case. You may make it block or inline-table instead of inline-block or whatever value that make the div take overflow width.
    $(this).css({"whiteSpace": "nowrap", "display": "inline-block"});
    while ($(this).width() > containerWidth){
         console.log("$(this).width()" + $(this).width() + "containerWidth" + containerWidth)
         $(this).css("font-size", fontSize -= 0.5);
    }
});


Antwoord 22

Dit werkte voor mij:

Ik probeer de lettergrootte te schatten op basis van een breedte/hoogte die ik heb gekregen bij het instellen van `lettergrootte: 10px`. Kortom, het idee is “als ik 20 pixels breed en 11 pixels hoog heb met ‘lettergrootte: 10px’, wat zou dan de maximale lettergrootte zijn om een container van 50 pixels breed en 30 pixels te berekenen? hoogte?”

Het antwoord is een systeem met dubbele verhoudingen:

{ 20:10=50:X, 11:10=30:Y } = { X= (10*50)/20, Y= (10*30)/11 }

Nu is X een lettergrootte die overeenkomt met de breedte en Y is een lettergrootte die overeenkomt met de hoogte; neem de kleinste waarde

function getMaxFontSizeApprox(el){
    var fontSize = 10;
    var p = el.parentNode;
    var parent_h = p.offsetHeight ? p.offsetHeight : p.style.pixelHeight;
    if(!parent_h)
        parent_h = 0;
    var parent_w = p.offsetHeight ? p.offsetWidth : p.style.pixelWidth;
    if(!parent_w)
        parent_w = 0;
    el.style.fontSize = fontSize + "px";
    var el_h = el.offsetHeight ? el.offsetHeight : el.style.pixelHeight;
    if(!el_h)
        el_h = 0;
    var el_w = el.offsetHeight ? el.offsetWidth : el.style.pixelWidth;
    if(!el_w)
        el_w = 0;
    // 0.5 is the error on the measure that JavaScript does
    // if the real measure had been 12.49 px => JavaScript would have said 12px
    // so we think about the worst case when could have, we add 0.5 to 
    // compensate the round error
    var fs1 = (fontSize*(parent_w + 0.5))/(el_w + 0.5);
    var fs2 = (fontSize*(parent_h) + 0.5)/(el_h + 0.5);
    fontSize = Math.floor(Math.min(fs1,fs2));
    el.style.fontSize = fontSize + "px";
    return fontSize;
}

NB: Het argument van de functie moet een spanelement of een element zijn dat kleiner is dan de ouder, anders als kinderen en ouder beide dezelfde breedte / hoogte-functie mislukken.


23

Als een JavaScript-fallback (of uw enige oplossing), kunt u mijn jQuery scalem plugin gebruiken , waarmee u kunt schalen ten opzichte van het ouderelement (container) door de referencete passeren.


24

In het geval dat het nuttig is voor iedereen, waren de meeste oplossingen in deze thread de tekst in meerdere regels, formulier e.

Maar toen vond ik dit, en het werkte:

https://github.com/chunksnbits/jQuery-quickFit

Voorbeeld Gebruik:

$('.someText').quickfit({max:50,tolerance:.4})


25

Voor dynamische tekst is deze plug-in vrij handig:

http://freqdec.github.io/slabtext/

Voeg gewoon CSS toe:

.slabtexted .slabtext
{
    display: -moz-inline-box;
    display: inline-block;
    white-space: nowrap;
}
.slabtextinactive .slabtext
{
    display: inline;
    white-space: normal;
    font-size: 1em !important;
    letter-spacing: inherit !important;
    word-spacing: inherit !important;
    *letter-spacing: normal !important;
    *word-spacing: normal !important;
}
.slabtextdone .slabtext
{
    display: block;
}

en het script:

$('#mydiv').slabText();

26

HTML

<div style="height:100px; width:200px;">
  <div id='qwe'>
    test
  </div>
</div>

JavaScript-code voor het maximaliseren van het lettertype-formaat:

var fontSize, maxHeight, maxWidth, textElement, parentElement;
textElement = document.getElementById('qwe');
parentElement = textElement.parentElement;    
maxHeight = parentElement.clientHeight;
maxWidth = parentElement.clientWidth;
fontSize = maxHeight;
var minFS = 3, maxFS = fontSize;
while (fontSize != minFS) {
  textElement.style.fontSize = `${fontSize}px`;
  if (textElement.offsetHeight < maxHeight && textElement.offsetWidth <= maxWidth) {
    minFS = fontSize;
  } else{
    maxFS = fontSize;
  }
  fontSize = Math.floor((minFS + maxFS)/2);
}
textElement.style.fontSize = `${minFS}px`;

Antwoord 27

Ik zie geen antwoord met betrekking tot de CSS flex-eigenschap, maar het kan ook erg handig zijn.


Antwoord 28

Om de lettergrootte in de container te laten passen, in plaats van in het venster, raadpleegt u de functie resizeFont()die ik in deze vraag heb gedeeld (een combinatie van andere antwoorden, waarvan de meeste al hier gelinkt). Het wordt geactiveerd met behulp van window.addEventListener('resize', resizeFont);.

Vanilla JavaScript: formaat van font-awesome aanpassen aan container

JavaScript:

function resizeFont() {
  var elements  = document.getElementsByClassName('resize');
  console.log(elements);
  if (elements.length < 0) {
    return;
  }
  _len = elements.length;
  for (_i = 0; _i < _len; _i++) {
    var el = elements[_i];
    el.style.fontSize = "100%";
    for (var size = 100; el.scrollHeight > el.clientHeight; size -= 10) {
      el.style.fontSize = size + '%';
    }
  }
}

Je zou misschien vw/vh als fallback kunnen gebruiken, zodat je dynamisch emof remeenheden toewijst met behulp van JavaScript, om ervoor te zorgen dat de lettertypen naar het venster schalen als JavaScript is uitgeschakeld.

Pas de klasse .resizetoe op alle elementen die tekst bevatten die u wilt schalen.

Activeer de functie voordat u de gebeurtenislistener voor het wijzigen van de grootte van het venster toevoegt. Vervolgens wordt elke tekst die niet in de container past, verkleind wanneer de pagina wordt geladen en ook wanneer het formaat wordt gewijzigd.

OPMERKING: De standaard font-sizemoet zijn ingesteld op em,remof %om goede resultaten.

Other episodes