कंटेनर की चौड़ाई के आधार पर फ़ॉन्ट स्केलिंग


1185

मुझे फ़ॉन्ट स्केलिंग के चारों ओर अपना समय प्राप्त करने में मुश्किल हो रही है।

वर्तमान में मेरे पास यह साइटfont-size 100% बॉडी के साथ है । हालांकि क्या 100%? ऐसा लगता है कि यह 16 पिक्सेल पर है।

मैं इस धारणा के तहत था कि 100% किसी तरह ब्राउज़र विंडो के आकार को संदर्भित करेगा, लेकिन स्पष्ट रूप से ऐसा नहीं है क्योंकि यह हमेशा 16 पिक्सेल होता है चाहे खिड़की को एक मोबाइल चौड़ाई या पूर्ण-विकसित वाइडस्क्रीन डेस्कटॉप के नीचे आकार दिया गया हो।

मैं अपने कंटेनर के संबंध में अपनी साइट के पैमाने पर पाठ कैसे बना सकता हूं? मैं का उपयोग करने की कोशिश की em, लेकिन यह या तो पैमाने पर नहीं है।

मेरा तर्क यह है कि मेरे मेनू जैसी चीजें आपके आकार बदलने के बाद पूरी हो जाती हैं, इसलिए मुझे कंटेनर की चौड़ाई के संबंध में अन्य तत्वों px font-sizeके .menuItemबीच कमी करने की आवश्यकता है । (उदाहरण के लिए, एक बड़े डेस्कटॉप पर मेनू में, 22pxपूरी तरह से काम करता है। टैबलेट की चौड़ाई में नीचे जाएं और 16pxअधिक उपयुक्त है।)

मुझे पता है कि मैं ब्रेकप्वाइंट जोड़ सकता हूं, लेकिन मैं चाहता हूं कि टेक्स्ट को बड़े पैमाने पर और साथ ही अतिरिक्त ब्रेकप्वाइंट होने चाहिए, अन्यथा, मैं टेक्स्ट को नियंत्रित करने के लिए प्रत्येक 100pixels की चौड़ाई में कमी के लिए सैकड़ों ब्रेकप्वाइंट के साथ समाप्त करूंगा।


34
font-size: 100%;इसका मतलब यह है कि पाठ का आकार 100% होता (यानी वह जिसे अपने माता-पिता से विरासत में मिला होता है)। डिफ़ॉल्ट रूप से वह 16px है। इसलिए यदि आप 50% का उपयोग करते हैं, तो यह फ़ॉन्ट-आकार होगा: 8px
एंडी

31
आप जो खोज रहे हैं उसे उत्तरदायी या व्यूपोर्ट आकार टाइपोग्राफी कहा जाता है। css-tricks.com/viewport-sized-typography
gearsdigital

8
FitText को एक रूप दें ।
इस्सा

12
@Andy: वास्तव में, "डिफ़ॉल्ट रूप से" वह है जो उपयोगकर्ताओं के पास अपने ब्राउज़र पाठ का आकार है, जो जरूरी 16px तक हल नहीं हो सकता है।
स्कॉट्स

1
इस उत्तर को देखें stackoverflow.com/a/28485608/4251431
बशीर AL-MOMANI

जवाबों:


1494

संपादित करें: यदि कंटेनर बॉडी नहीं है तो सीएसएस ट्रिक्स फिटिंग टेक्स्ट में एक कंटेनर में आपके सभी विकल्पों को शामिल करता है ।

यदि कंटेनर शरीर है, तो आप जो देख रहे हैं वह व्यूपोर्ट-प्रतिशत लंबाई है :

व्यूपोर्ट-प्रतिशत लंबाई के आकार के सापेक्ष हैं प्रारंभिक धारक ब्लॉक । जब प्रारंभिक युक्त ब्लॉक की ऊंचाई या चौड़ाई को बदल दिया जाता है, तो उन्हें तदनुसार स्केल किया जाता है। हालांकि, जब मूल तत्व पर अतिप्रवाह का मूल्य ऑटो होता है, तो किसी भी स्क्रॉल बार को अस्तित्व में नहीं माना जाता है।

मान हैं:

  • vw (व्यूपोर्ट चौड़ाई का%)
  • vh (व्यूपोर्ट ऊंचाई का%)
  • vi (रूट तत्व की इनलाइन अक्ष की दिशा में व्यूपोर्ट आकार का 1%)
  • vb (रूट तत्व के ब्लॉक अक्ष की दिशा में व्यूपोर्ट आकार का 1%)
  • vmin( vwया के छोटे vh)
  • vmax(बड़ा vwया vh)

1 वी * प्रारंभिक युक्त ब्लॉक के 1% के बराबर है।

इसका उपयोग इस तरह दिखता है:

p {
    font-size: 4vw;
}

जैसा कि आप देख सकते हैं, जब व्यूपोर्ट की चौड़ाई बढ़ जाती है, तो font-sizeमीडिया प्रश्नों का उपयोग करने की आवश्यकता के बिना , ऐसा करें ।

ये मान एक आकार देने वाली इकाई हैं, जैसे pxया emतो, इसलिए उनका उपयोग अन्य तत्वों को आकार देने के लिए किया जा सकता है, जैसे कि चौड़ाई, मार्जिन या पैडिंग।

ब्राउज़र का समर्थन बहुत अच्छा है, लेकिन आपको इस तरह की गिरावट की आवश्यकता होगी:

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

समर्थन के आँकड़े की जाँच करें: http://caniuse.com/#feat=viewport-units

इसके अलावा, व्यापक नज़र के लिए सीएसएस-ट्रिक्स देखें: व्यूपोर्ट साइज़्ड टाइपोग्राफी

न्यूनतम / अधिकतम आकार सेट करने और आकारों पर थोड़ा अधिक नियंत्रण रखने के बारे में यहां एक अच्छा लेख है: उत्तरदायी टाइपोग्राफी पर सटीक नियंत्रण

और यहाँ कैल्क () का उपयोग करके अपना आकार सेट करने के बारे में एक लेख दिया गया है ताकि पाठ व्यूपोर्ट को भर सके: http://codepen.io/CrocoDillon/pen/fBJxu

इसके अलावा, कृपया इस लेख को देखें, जो लाइन-ऊंचाई को समायोजित करने के लिए 'पिघले हुए अग्रणी' नामक तकनीक का उपयोग करता है। सीएसएस में पिघला हुआ अग्रणी


546
लेकिन क्या होगा अगर कंटेनर व्यूपोर्ट (बॉडी) नहीं है?
एलेक्स

12
@ एलेक्स, यह जेएस क्षेत्र है। FitText.js@Jbenjohnson आपूर्ति किए गए लेख के निचले भाग में दिए गए विकल्प का प्रयास करें ।
रॉबर्ट रॉबर्ट

10
यह वह जगह है जहां तथाकथित तत्व प्रश्न आते हैं। मीडिया-प्रश्नों के विपरीत, तत्व क्वेरी अपने युक्त ब्लॉक के आधार पर चीजों को आकार देगी, न कि व्यूपोर्ट, जो आश्चर्यजनक होगा! लेकिन दुर्भाग्य से यह अभी तक मौजूद नहीं है। हालाँकि, कुछ पॉलीफ़िल और प्रूफ-ऑफ-कॉन्सेप्ट मौजूद हैं यदि आप रुचि रखते हैं: coding.smashingmagazine.com/2013/06/25/… और filamentgroup.com/lab/element_query_workarounds
jbenjohns

139
डाउनग्रेड किया गया क्योंकि यह प्रश्न का उत्तर नहीं देता है। उसने कंटेनर के बारे में पूछा, व्यूपोर्ट नहीं। पूरी तरह से अलग उपयोग मामला।
सॉन्गबाक्स

6
"प्रारंभिक युक्त ब्लॉक" रूट तत्व को संदर्भित करता है। यह पूछे गए प्रश्न का सही उत्तर नहीं है।
ग्लिफ़

319

लेकिन क्या होगा अगर कंटेनर व्यूपोर्ट (बॉडी) नहीं है?

एलेक्स द्वारा स्वीकार किए गए जवाब के तहत एक टिप्पणी में यह सवाल पूछा गया है ।

इस तथ्य का यह मतलब नहीं है vwकि उस कंटेनर के आकार के लिए कुछ हद तक उपयोग नहीं किया जा सकता है। अब सभी में किसी भी भिन्नता को देखने के लिए यह मानना ​​होगा कि कंटेनर आकार में लचीला है। चाहे प्रत्यक्ष प्रतिशत के widthमाध्यम से या 100% माइनस मार्जिन के माध्यम से। बिंदु "मूट" हो जाता है यदि कंटेनर हमेशा सेट होता है, तो हम कहते हैं, 200pxचौड़ा - तो बस font-sizeउस चौड़ाई के लिए एक काम सेट करें ।

उदाहरण 1

एक लचीली चौड़ाई वाले कंटेनर के साथ, हालांकि, यह महसूस किया जाना चाहिए कि किसी तरह से कंटेनर अभी भी व्यूपोर्ट से दूर जा रहा है । जैसे, vwव्यूपोर्ट में उस प्रतिशत के आकार के अंतर के आधार पर सेटिंग को समायोजित करने का मामला है , जिसका अर्थ है माता-पिता के रैपर के आकार को ध्यान में रखना। इस उदाहरण को लें :

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;
}

यहाँ मान लें कि divयह एक बच्चा है body, यह 50%उस 100%चौड़ाई का है, जो इस मूल मामले में व्यूपोर्ट का आकार है। असल में, आप एक सेट करना चाहते हैं vwजो आपको अच्छा लगने वाला है। जैसा कि आप उपरोक्त सीएसएस सामग्री में मेरी टिप्पणी में देख सकते हैं, आप गणितीय रूप से पूर्ण व्यूपोर्ट आकार के संबंध में "सोच" सकते हैं, लेकिन आपको ऐसा करने की आवश्यकता नहीं है। कंटेनर के साथ पाठ "फ्लेक्स" जा रहा है क्योंकि कंटेनर व्यूपोर्ट के आकार के साथ फ्लेक्स कर रहा है। अद्यतन: यहाँ दो अलग-अलग आकार के कंटेनरों का एक उदाहरण है

उदाहरण 2

आप उस गणना के आधार पर व्यूपोर्ट साइज़िंग को सुनिश्चित करने में मदद कर सकते हैं। इस उदाहरण पर विचार करें :

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;
}

साइज़िंग अभी भी व्यूपोर्ट से बाहर आधारित है, लेकिन कंटेनर के आकार के आधार पर सेट अप में ही है।

कंटेनर के आकार को गतिशील रूप से बदलना चाहिए ...

यदि कंटेनर तत्व के आकार को गतिशील रूप से उसके प्रतिशत संबंध को @mediaब्रेकपॉइंट या जावास्क्रिप्ट के माध्यम से बदलना समाप्त हो जाता है , तो जो भी आधार "लक्ष्य" पाठ आकार के लिए समान "संबंध" बनाए रखने के लिए पुनर्गणना की आवश्यकता होगी।

ऊपर # 1 उदाहरण लें। यदि या तो जावास्क्रिप्ट या चौड़ाई से divस्विच किया गया था , तो उसी समय, मीडिया गणना या जावास्क्रिप्ट द्वारा नई गणना में समायोजित करने की आवश्यकता होगी । यह टेक्स्ट आकार को उसी आकार में डाल देगा , जो व्यूपोर्ट साइज़िंग से मूल कंटेनर की "चौड़ाई" आधे से कम हो गया होगा, लेकिन अब इसकी स्वयं की प्रतिशत गणना में बदलाव के कारण कम हो गया है।25%@mediafont-size5vw * .25 = 1.2550%

एक चुनौती

उपयोग में CSS3 calc()फ़ंक्शन के साथ , गतिशील रूप से समायोजित करना मुश्किल हो जाएगा, क्योंकि यह फ़ंक्शन font-sizeइस समय उद्देश्यों के लिए काम नहीं करता है । यदि आप अपनी चौड़ाई बदल रहे हैं तो आप शुद्ध CSS 3 समायोजन नहीं कर सकते calc()। बेशक, मार्जिन के लिए चौड़ाई का मामूली समायोजन किसी भी बदलाव को वारंट करने के लिए पर्याप्त नहीं हो सकता है font-size, इसलिए यह कोई फर्क नहीं पड़ता।


: (वहाँ व्यूपोर्ट-प्रतिशत लंबाई और विंडो का आकार बदलने के साथ एक क्रोम बग है code.google.com/p/chromium/issues/detail?id=124331 )
thirtydot

@ थर्टीडॉट: यह दुर्भाग्यपूर्ण है (लेकिन इसके बारे में पता होना अच्छा है, धन्यवाद)। आशा है कि बग जल्द ही हल हो जाएगा, लेकिन ऐसा लग रहा है कि यह कुछ समय के लिए कायम है।
स्कॉट्स

20
महान जवाब, हालांकि, यह काम नहीं करेगा यदि युक्त तत्व में अधिकतम-चौड़ाई है।
Himmators

3
@KristofferNolgren: यह मेरे उत्तर में किए गए दो बिंदुओं से संबंधित है: (1) "यह मानते हुए कि कंटेनर किसी तरह आकार में लचीला है" (एक बार 'अधिकतम-चौड़ाई' तक पहुँच जाता है, यह अब फ्लेक्स नहीं करता है, इसलिए एक मुद्दा है )। (२) यदि कोई यह निर्धारित कर सकता है कि किस बिंदु पर 'अधिकतम-चौड़ाई' पहुँच जाएगी, तो जैसा कि मैंने उल्लेख किया है, आप यह @mediaबदलने के लिए एक विराम बिंदु निर्धारित कर सकते हैं कि उस बिंदु पर फॉन्ट का आकार कैसा है (अनिवार्य रूप से उस तक पहुँचने का एक निश्चित आकार देना max-width) । बस एक max-widthस्थिति के साथ काम करने के लिए सोचा ।
स्कॉट्स

क्या आपको लगता है कि जब मीडिया सवालों के माध्यम से कंटेनर तत्व को गतिशील रूप से बदल रहा है, तो आप एक बेला फेंक सकते हैं? मुझे यकीन नहीं कि मैं समझा हूँ।
J82

58

एसवीजी के साथ समाधान:

<div style="width: 60px;">  
  <svg width="100%" height="100%" viewBox="0 -200 1000 300"
     xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <text font-size="300" fill="black">Text</text>
  </svg>
</div>

https://jsfiddle.net/qc8ht5eb/


एसवीजी और टेक्स्ट-रैपिंग के साथ समाधान foreignObject:

<svg viewBox="0 0 100 100">
  <foreignObject width="100%" height="100%">
    <h1>heading</h1>

    lorem ipsum dolor sit amet
  </foreignObject>
</svg> 

https://jsfiddle.net/2rp1q0sy/


1
यह विचार पहले अच्छा लगता है। तब आपको एहसास होता है कि आप एसवीजी पर <html> के फॉन्ट को आसानी से नियंत्रित नहीं कर सकते। मोबाइल और डेस्कटॉप पर फ़ॉन्ट अलग है, जो अंतिम चौड़ाई को प्रभावित करता है।
स्टॉपि

@Stopi आप एक iFrame समाधान के बारे में क्या सोचते हैं? उदाहरण
डैन्टियो

10
आप HTML / CSS से SVG को पूरी तरह से स्टाइल कर सकते हैं
gman

1
SVG को css के साथ स्टाइल किया जा सकता है अगर svg इनलाइन है (न ही img टैग का उपयोग करें)।

8
यह एक डायनामिक कंटेनर के आधार पर सबसे अच्छा, सबसे पूर्वानुमानित समाधान है।
जोशुआ डेविड

35

अपनी एक परियोजना में, मैं उदाहरण के लिए, फ़ॉन्ट आकार को समायोजित करने के लिए vw और vh के बीच एक "मिश्रण" का उपयोग करता हूं:

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

मुझे पता है कि यह ओपी के सवाल का जवाब नहीं देता है, लेकिन शायद यह किसी और के लिए एक समाधान हो सकता है।


3
आप का उपयोग vminऔर / या vmaxइसके बजाय बेहतर हो सकता है ।
20-12 को sebastian_k

4
क्रोम देव उपकरण इसे एक अवैध संपत्ति मूल्य कहते हैं
फिल्

29

शुद्ध-सीएसएस समाधान calc(), सीएसएस इकाइयों और गणित के साथ

यह ठीक वही नहीं है जो ओपी पूछता है, लेकिन किसी का दिन बना सकता है। यह जवाब चम्मच-खिला आसान नहीं है और डेवलपर छोर पर कुछ शोध की आवश्यकता है।

मैं अंत में calc()विभिन्न इकाइयों के साथ इसके लिए शुद्ध-सीएसएस समाधान प्राप्त करने के लिए आया था । आपको अपनी अभिव्यक्ति के लिए फॉर्मूले की कुछ बुनियादी गणितीय समझ की आवश्यकता होगी calc()

जब मैंने इस पर काम किया, तो मुझे कुछ पेजिंग करने वाले कुछ अभिभावकों के साथ एक संपूर्ण पृष्ठ-चौड़ाई वाले उत्तरदायी हेडर प्राप्त करने थे, जो डोम में थे। मैं यहां अपने मूल्यों का उपयोग करूंगा, उन्हें अपने साथ प्रतिस्थापित करूंगा।

गणित को

आपको चाहिये होगा:

  • कुछ व्यूपोर्ट में अच्छी तरह से समायोजित अनुपात। मैंने 320 पिक्सेल का उपयोग किया, इस प्रकार मुझे 24 पिक्सेल उच्च और 224 पिक्सेल चौड़े मिले, इसलिए अनुपात 9.333 ... या 28/3 है
  • कंटेनर की चौड़ाई, मेरे पास padding: 3emऔर पूरी चौड़ाई थी इसलिए यह मिला100wv - 2 * 3em

एक्स कंटेनर की चौड़ाई है, इसलिए इसे अपनी अभिव्यक्ति के साथ बदलें या पूर्ण-पृष्ठ पाठ प्राप्त करने के लिए मूल्य समायोजित करें। Rवह अनुपात है जो आपके पास होगा। आप कुछ व्यूपोर्ट में मूल्यों को समायोजित करके, तत्व की चौड़ाई और ऊंचाई का निरीक्षण करके और उन्हें अपने मूल्यों के साथ बदलकर प्राप्त कर सकते हैं। इसके अलावा, यह है width / heigth;)

x = 100vw - 2 * 3em = 100vw - 6em
r = 224px/24px = 9.333... = 28 / 3

y = x / r
  = (100vw - 6em) / (28 / 3)
  = (100vw - 6em) * 3 / 28
  = (300vw - 18em) / 28
  = (75vw - 4.5rem) / 7

और धमाकेदार! इसने काम कर दिया! मैंने लिखा

font-size: calc((75vw - 4.5rem) / 7)

मेरे हेडर के लिए और यह हर व्यूपोर्ट में अच्छी तरह से समायोजित।

लेकिन ये कैसे काम करता है?

हमें यहां कुछ स्थिरांक चाहिए। 100vwव्यूपोर्ट की पूरी चौड़ाई का मतलब है, और मेरा लक्ष्य कुछ पैडिंग के साथ पूर्ण-चौड़ाई हेडर स्थापित करना था।

अनुपात। एक व्यूपोर्ट में चौड़ाई और ऊंचाई प्राप्त करने से मुझे खेलने के लिए एक अनुपात मिला, और अनुपात के साथ मुझे पता है कि अन्य व्यूपोर्ट चौड़ाई में ऊंचाई क्या होनी चाहिए। हाथ से उनकी गणना करने में बहुत समय लगेगा और कम से कम बैंडविड्थ की बहुत अधिक मात्रा होगी, इसलिए यह एक अच्छा जवाब नहीं है।

निष्कर्ष

मुझे आश्चर्य है कि किसी ने भी इसका पता क्यों नहीं लगाया और कुछ लोग यहां तक ​​कह रहे हैं कि सीएसएस के साथ छेड़छाड़ करना असंभव होगा। मुझे तत्वों को समायोजित करने में जावास्क्रिप्ट का उपयोग करना पसंद नहीं है, इसलिए मैं अधिक खुदाई किए बिना जावास्क्रिप्ट (और jQuery के बारे में भूल) के उत्तर को स्वीकार नहीं करता हूं। सब सब में, यह अच्छा है कि यह समझ में आया और यह वेबसाइट डिजाइन में शुद्ध-सीएसएस कार्यान्वयन के लिए एक कदम है।

मैं अपने पाठ में किसी भी असामान्य सम्मेलन के लिए माफी माँगता हूँ, मैं अंग्रेजी में देशी वक्ता नहीं हूँ और स्टैक ओवरफ्लो उत्तर लिखने के लिए भी काफी नया हूँ।

यह भी ध्यान दिया जाना चाहिए कि हमारे पास कुछ ब्राउज़रों में दुष्ट स्क्रॉलबार हैं। उदाहरण के लिए, फ़ायरफ़ॉक्स का उपयोग करते समय मैंने देखा कि 100vwव्यूपोर्ट की पूरी चौड़ाई, स्क्रॉलबार के नीचे फैली हुई है (जहां सामग्री का विस्तार नहीं किया जा सकता है!), इसलिए पूर्णता पाठ को सावधानीपूर्वक और अधिमानतः कई ब्राउज़रों और उपकरणों के साथ परीक्षण करना होगा।


13
यह समाधान केवल IF (1) काम करता है जिसे आप फ़ॉन्ट जानते हैं, (2) फ़ॉन्ट उपयोगकर्ता के डिवाइस पर उपलब्ध है, और (3) टेक्स्ट हमेशा समान होता है। यह इसे बहुत सीमित उपयोग-मामला बनाता है।
आंद्रेई वोल्गिन

मुझे समझ नहीं आ रहा है कि क्या होगा अगर मेरा कंटेनर उदाहरण के लिए ठीक है: 640px और 16: 9 का अनुपात। मुझे कौन से बछड़े को लिखना चाहिए?
पेरी मिमोन

1
आपके कंटेनर की चौड़ाई x640px और अनुपात r16: 9 है, इसलिए: x = 640px, r = 16 / 9, y = x / r = 640px / (16 / 9) = 360px
हेगेज़

नोट: यह केवल तभी काम करता है जब आपके पास वास्तव में एक पाठ का आकार 16: 9 हो, जो एक विषम स्थिति है। शायद दूसरी बार जवाब पढ़ने से मदद मिल सकती है। इसके अलावा, यह केवल एक-लाइनर्स के लिए काम करता है।
हेजेज

ईमानदार होने के लिए आप "कुछ व्यूपोर्ट में अच्छी तरह से समायोजित अनुपात की व्याख्या नहीं करते हैं । मैंने 320 पिक्सेल का उपयोग किया है, इस प्रकार मैं 24 पिक्सेल उच्च और 224 पिक्सेल चौड़ा हो गया हूं, इसलिए अनुपात 9.333 ... या 28/3 है" मैं अनुपात को समझाने का सुझाव देता हूं। थोड़ा और अधिक। अनुपात क्या दर्शाता है?
3limin4t0r

28

इस मुद्दे के लिए एक बड़ा दर्शन है।

सबसे आसान काम शरीर को एक निश्चित फ़ॉन्ट-आकार देना होगा (मैं 10 की सिफारिश करता हूं), और फिर अन्य सभी तत्व में emया उनके फ़ॉन्ट में होगा rem। मैं आपको उन इकाइयों को समझने के लिए एक उदाहरण दूंगा। Emहमेशा अपने माता-पिता के सापेक्ष होता है:

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 */

Rem हमेशा शरीर के सापेक्ष होता है:

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 */

और फिर आप एक स्क्रिप्ट बना सकते हैं जो आपके कंटेनर की चौड़ाई के सापेक्ष फ़ॉन्ट-आकार को संशोधित करेगा। लेकिन यह वह नहीं है जो मैं सुझाऊँगा। क्योंकि उदाहरण के लिए 900 पिक्सल चौड़ाई वाले कंटेनर में p12 पिक्सल्स के फॉन्ट साइज वाला एक तत्व होगा । और आपके विचार में जो 4 पिक्सेल के फॉन्ट-साइज़ में 300 पिक्सेल चौड़ा कंटेनर बन जाएगा। इसकी निचली सीमा होनी चाहिए।

अन्य समाधान मीडिया प्रश्नों के साथ होंगे, ताकि आप विभिन्न चौड़ाई के लिए फ़ॉन्ट सेट कर सकें।

लेकिन जो समाधान मैं सुझाऊंगा, वह एक जावास्क्रिप्ट लाइब्रेरी का उपयोग करना है जो आपकी मदद करता है। और fittext.js जो मुझे अब तक मिला है।


6
remइकाई मूल तत्व के सापेक्ष है, जिसका अर्थ है htmlतत्व है, bodyतत्व। DOM में रूट एलिमेंट htmlटैग है। developer.mozilla.org/en-US/docs/Web/CSS/length .. remहमेशा htmlटैग के सापेक्ष होता है, जो रूट एलीमेंट है, बॉडी टैग नहीं .. लेकिन अच्छा जवाब :)
जोनाथन मारजुलो

fittext.js काम करता है, मैं उस समाधान की सिफारिश की!
जसेक डेज़र्डज़िकोव्स्की

फिटटेक्स्ट मेरे लिए विजेता था। कुछ विकल्पों की कोशिश की लेकिन यह सबसे सरल और ड्रुपल / बैकग्राउंड सीएमएस के साथ अच्छी तरह से एकीकृत किया गया। github.com/davatron5000/FitText.js
सहायक जोएल

23

यहाँ समारोह है:

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

तो आपके सभी दस्तावेज़ों चाइल्ड तत्व फ़ॉन्ट आकार में बदलने emकी या %

फिर आधार फ़ॉन्ट आकार सेट करने के लिए अपने कोड में कुछ इस तरह जोड़ें।

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

http://jsfiddle.net/0tpvccjt/


1
अब तक यह सबसे अच्छा समाधान है।
wp स्टूडेंट

बुरी प्रथाओं और भारी अकुशल
जैक गिफिन

@tntrox आज की तरह ही अक्षम है, 4 साल पहले यह बहुत अधिक अक्षम था। मैं बेहतर विकल्प के बदले में इस जवाब को अस्वीकार करता हूं। हां, IE समर्थन के लिए, किसी को जावास्क्रिप्ट की आवश्यकता होगी। लेकिन, किसी को जावास्क्रिप्ट की आवश्यकता नहीं है कि यह भयानक है।
जैक गिफिन

3
मुझे लगता है कि मेरी अज्ञानता यहां दिखाई दे रही है। लेकिन उपरोक्त भयानक क्यों है?

मुझे नहीं लगता कि यह भयानक है। मैं इसे और अधिक पठनीय बनाने के लिए कुछ छोटे स्वरूपण परिवर्तनों की सिफारिश करूँगा। मैं प्रत्येक संस्करण को कम से कम एक अलग लाइन पर रखूंगा। return thisफ़ंक्शन के अंत में यह आवश्यक नहीं हो सकता है । प्रदर्शन के लिए आप ऑनरेस्स की आलोचना करना भी चाह सकते हैं, क्योंकि यह आपके द्वारा खींचे जाने पर फिर से नहीं हो रहा है। यह कुछ बहुत ही सरल कोड है, इसलिए कोई भी इस पर अपने बेहतर समाधान को थोड़े प्रयास से आधार बना सकता है।
Mnebuerquo

19

जावास्क्रिप्ट के बिना ऐसा करने का एक तरीका है !

आप इनलाइन SVG इमेज का उपयोग कर सकते हैं। यदि आप इनलाइन हैं, तो आप एसवीजी पर सीएसएस का उपयोग कर सकते हैं। आपको यह याद रखना होगा कि इस पद्धति का उपयोग करने का मतलब है कि आपकी एसवीजी छवि इसके कंटेनर के आकार का जवाब देगी।

निम्नलिखित समाधान का उपयोग करने का प्रयास करें ...

एचटीएमएल

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

सीएसएस

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;
}

उदाहरण: https://jsfiddle.net/k8L4xLLa/32/

कुछ और आकर्षक चाहते हैं?

एसवीजी छवियां आपको आकृतियों और कबाड़ के साथ शांत सामान करने की अनुमति देती हैं। स्केलेबल पाठ के लिए इस महान उपयोग के मामले की जाँच करें ...

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


4
यह समाधान vwआकार देने के साथ स्वीकार किए गए से अलग नहीं है । यदि आप पाठ बदलते हैं, तो सब कुछ बाध्य हो जाता है।
N69S

14

यह सुपर व्यावहारिक नहीं हो सकता है, लेकिन अगर आप चाहते हैं कि फॉन्ट माता-पिता का प्रत्यक्ष कार्य हो, तो बिना किसी जावास्क्रिप्ट के जो डिव / पेज के आकार को पढ़ने के लिए / लूप (अंतराल) सुनता है, वहां ऐसा करने का एक तरीका है । Iframes।

Iframe के भीतर कुछ भी iframe के आकार को व्यूपोर्ट के आकार के रूप में माना जाएगा। तो चाल सिर्फ एक iframe बनाने की है जिसकी चौड़ाई अधिकतम चौड़ाई है जो आप अपने पाठ को चाहते हैं, और जिसकी ऊंचाई अधिकतम ऊंचाई के बराबर है * विशेष पाठ का पहलू अनुपात।

सीमा को अलग करते हुए कि व्यूपोर्ट इकाइयाँ टेक्स्ट के लिए साइड पैरेंट यूनिट्स के साथ नहीं आ सकती हैं (जैसे,% साइज़ हर किसी की तरह व्यवहार करता है), व्यूपोर्ट यूनिट्स बहुत शक्तिशाली टूल प्रदान करती हैं: न्यूनतम / अधिकतम आयाम प्राप्त करने में सक्षम होना । आप ऐसा कहीं और नहीं कर सकते - आप यह नहीं कह सकते ... इस div की ऊंचाई माता-पिता की चौड़ाई * कुछ हो।

कहा जा रहा है, चाल विमिन का उपयोग करने के लिए है, और iframe आकार सेट करने के लिए इतना है कि [अंश] * कुल ऊंचाई एक अच्छा फ़ॉन्ट आकार है जब ऊंचाई सीमित आयाम है, और [अंश] * कुल चौड़ाई जब चौड़ाई है। सीमित आयाम। यही कारण है कि ऊंचाई को चौड़ाई और पहलू अनुपात का एक उत्पाद होना चाहिए।

मेरे विशेष उदाहरण के लिए, आपके पास है

.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);
}

इस विधि के साथ छोटी झुंझलाहट यह है कि आपको मैन्युअल रूप से iframe का CSS सेट करना होगा। यदि आप पूरी सीएसएस फ़ाइल संलग्न करते हैं, तो यह कई पाठ क्षेत्रों के लिए बहुत अधिक बैंडविड्थ लेगा। इसलिए, मैं जो करता हूं वह नियम है जो मैं सीधे अपने सीएसएस से चाहता हूं।

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

आप छोटे फ़ंक्शन लिख सकते हैं जो सीएसएस नियम / सभी सीएसएस नियम प्राप्त करते हैं जो पाठ क्षेत्र को प्रभावित करेगा।

मैं कुछ साइकिल चलाने / जावास्क्रिप्ट सुनने के बिना इसे करने का दूसरा तरीका नहीं सोच सकता। वास्तविक समाधान ब्राउज़रों पैरेंट कंटेनर के एक समारोह के रूप पैमाने पाठ के लिए एक रास्ता प्रदान करने के लिए किया जाएगा और यह भी एक ही vmin / VMAX प्रकार कार्यक्षमता प्रदान करने के।

JSFiddle: https://jsfiddle.net/0jr7rrgm/3/ (माउस को लाल वर्ग लॉक करने के लिए एक बार क्लिक करें, और फिर से रिलीज़ करने के लिए क्लिक करें)

फिडल में अधिकांश जावास्क्रिप्ट सिर्फ मेरा कस्टम क्लिक-ड्रैग फंक्शन है।


@quemeful ऐसा नहीं है जब हम 'नई' और 'चमकदार' (ड्रमोल प्लीज ...) में लाते हैं srcdoc: विशेषता: jsfiddle.net/wauzgob6/3
जैक जिफिन

9

का उपयोग करना vw, emऔर सह। सुनिश्चित करने के लिए काम करता है, लेकिन IMO को हमेशा फाइन ट्यूनिंग के लिए मानव के स्पर्श की आवश्यकता होती है।

यहाँ एक स्क्रिप्ट है जो मैंने अभी @ tnt-rox ' उत्तर पर आधारित लिखी है जो उस मानव के स्पर्श को स्वचालित बनाने की कोशिश करता है:

$('#controller').click(function(){
    $('h2').each(function(){
        var
            $el = $(this),
            max = $el.get(0),
            el = null
        ;
        max =
            max
            ? max.offsetWidth
            : 320
        ;
        $el.css({
            'font-size': '1em',
            'display': 'inline',
        });
        el = $el.get(0);

        el.get_float = function(){
            var
                fs = 0
            ;
            if (this.style && this.style.fontSize) {
                fs = parseFloat(this.style.fontSize.replace(/([\d\.]+)em/g, '$1'));
            }
            return fs;
        };

        el.bigger = function(){
            this.style.fontSize = (this.get_float() + 0.1) + 'em';
        };

        while (el.offsetWidth < max) {
            el.bigger();
        }

        // Finishing touch.
        $el.css({
            'font-size': ((el.get_float() -0.1) +'em'),
            'line-height': 'normal',
            'display': '',
        });
    });  // end of (each)
});    // end of (font scaling test)
div {
  width: 50%;
  background-color: tomato;
  font-family: 'Arial';
}

h2 {
  white-space: nowrap;
}

h2:nth-child(2) {
  font-style: italic;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<input type="button" id="controller" value="Apply" />
<div>
  <h2>Lorem ipsum dolor</h2>
  <h2>Test String</h2>
  <h2>Sweet Concatenation</h2>
  <h2>Font Scaling</h2>
</div>

यह मूल रूप से फ़ॉन्ट-आकार को कम कर देता है 1emऔर फिर अधिकतम चौड़ाई तक पहुंचने तक 0.1 से बढ़ाना शुरू कर देता है ।

JSFiddle


1
+1 केवल किसी को यह मानने के लिए कि emsमानव स्पर्श और ऊर्ध्वाधर लय की आवश्यकता है, किसी प्रकार का जादू नहीं है।
सेराओसे

7

100% बेस फॉन्ट साइज़ के सापेक्ष है, यदि आपने इसे सेट नहीं किया है, तो यह ब्राउज़र का उपयोगकर्ता-एजेंट डिफ़ॉल्ट होगा।

आपके द्वारा किए गए प्रभाव को प्राप्त करने के लिए, मैं विंडो आयामों के सापेक्ष बेस फ़ॉन्ट आकार को समायोजित करने के लिए जावास्क्रिप्ट कोड के एक टुकड़े का उपयोग करूंगा।


7

अपने सीएसएस के अंदर, जहाँ भी आपका डिज़ाइन टूटना शुरू हो रहा है, उसके लिए 320 पिक्सेल की चौड़ाई को बदलते हुए इसे नीचे जोड़ने का प्रयास करें:

    @media only screen and (max-width: 320px) {

        body { font-size: 1em; }

    }

फिर अपनी इच्छानुसार "px" या "em" में फ़ॉन्ट-आकार दें।


7

मेरा खुद का समाधान, jQuery- आधारित, धीरे-धीरे फ़ॉन्ट आकार बढ़ाकर काम करता है जब तक कि कंटेनर को ऊंचाई में बड़ी वृद्धि नहीं मिलती है (जिसका अर्थ है कि यह एक पंक्ति है)।

यह बहुत आसान है, लेकिन काफी अच्छी तरह से काम करता है, और इसका उपयोग करना बहुत आसान है। आपको उपयोग किए जा रहे फ़ॉन्ट के बारे में कुछ भी जानने की ज़रूरत नहीं है , सब कुछ ब्राउज़र द्वारा ध्यान रखा जाता है।

आप इसके साथ http://jsfiddle.net/tubededentifrice/u5y15d0L/2/ पर खेल सकते हैं

जादू यहां होता है:

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;
};

1
चूंकि यह स्क्रिप्ट हर आकार की घटना और / या अभिविन्यास परिवर्तन पर चलेगी, इसलिए मैं इसका उपयोग करने की सलाह नहीं देता। एक जावास्क्रिप्ट आधारित समाधान का उपयोग करने के बजाय ऊपर दिए गए सीएसएस आधारित समाधान की तलाश करें।
पिलातुस

1
आकार और अभिविन्यास परिवर्तन "दुर्लभ" घटनाएं हैं, यहां कोई प्रदर्शन समस्या नहीं है। यदि आप पसंद करते हैं, तो घटनाओं के लिए बाध्य न करें (यदि वे उदाहरण के लिए कंटेनरों का आकार नहीं बदलते हैं, तो गैर-उत्तरदायी वेबसाइटों के लिए)। कुछ भी सोचने के लिए सीएसएस समाधान सभी मामलों में काम नहीं कर रहे हैं (जैसे कि फ़ॉन्ट की चौड़ाई या तो) जैसा कि यह समाधान करता है।
विंसेंट

मैंने आपके उत्तर को jQuery फ़ंक्शन के रूप में लपेटा। यह अधिकतम अनुमत ऊंचाई, न्यूनतम और अधिकतम फ़ॉन्ट आकार प्राप्त करता है। देखें jsfiddle.net/oriadam/qzsy760k
oriadam

6

यह वेब घटक फ़ॉन्ट आकार बदलता है इसलिए आंतरिक पाठ चौड़ाई कंटेनर की चौड़ाई से मेल खाती है। डेमो की जाँच करें ।

आप इसे इस तरह से उपयोग कर सकते हैं:

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

6

आप कुछ इस तरह की तलाश में हो सकते हैं:

http://jsfiddle.net/sijav/dGsC9/4/
http://fiddle.jshell.net/sijav/dGsC9/4/show/

मैंने फ़्लो टाइप का उपयोग किया है , और यह बहुत अच्छा काम कर रहा है (हालाँकि यह जावास्क्रिप्ट है और शुद्ध सीएसएस समाधान नहीं है):

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

6

मैंने फ़ॉन्ट-आकार के बजाय CSS ट्रांसफ़ॉर्म का उपयोग करके एक साधारण स्केल फ़ंक्शन तैयार किया है। आप इसे किसी भी कंटेनर के अंदर उपयोग कर सकते हैं, आपको मीडिया के प्रश्नों आदि को सेट करने की आवश्यकता नहीं है :)

ब्लॉग पोस्ट: पूर्ण चौड़ाई सीएसएस और जेएस स्केलेबल हेडर

कोड:

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';
  }
}

वर्किंग डेमो: https://codepen.io/maciejkorsan/pen/BWLryj


मुझे लगता है कि ओपी एक सीएसएस समाधान की तलाश में है।
m02ph3u5

5

CSS वेरिएबल्स का उपयोग करें

किसी ने अभी तक सीएसएस चर का उल्लेख नहीं किया है, और यह दृष्टिकोण मेरे लिए सबसे अच्छा काम करता है, इसलिए:

मान लें कि आपने अपने पृष्ठ पर एक स्तंभ प्राप्त किया है, जो एक मोबाइल उपयोगकर्ता की स्क्रीन की चौड़ाई का 100% है, लेकिन इसमें max-width800px है, इसलिए डेस्कटॉप पर स्तंभ के दोनों ओर कुछ स्थान है। इसे अपने पृष्ठ के शीर्ष पर रखें:

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

और अब आप vwअपने फॉन्ट का आकार सेट करने के लिए उस वैरिएबल (बिल्ट-इन यूनिट के बजाय) का उपयोग कर सकते हैं । उदाहरण के लिए

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

यह एक शुद्ध सीएसएस दृष्टिकोण नहीं है, लेकिन यह बहुत करीब है।


5

Http://simplefocus.com/flowtype/ आज़माएं । यह वही है जो मैं अपनी साइटों के लिए उपयोग करता हूं, और इसने पूरी तरह से काम किया है।


लिंक अस्थिर हैं। कृपया अपने उत्तर में सीधे समाधान बताएं। इसके अलावा, मैं कुछ भी सामग्री के साथ कुछ यादृच्छिक लिंक पर क्लिक नहीं करना चाहता।
लीलालिनक्स

5

मेरी समस्या समान थी, लेकिन एक शीर्षक के भीतर स्केलिंग टेक्स्ट से संबंधित थी। मैंने फिट फ़ॉन्ट की कोशिश की, लेकिन मुझे किसी भी परिणाम प्राप्त करने के लिए कंप्रेसर को टॉगल करने की आवश्यकता थी, क्योंकि यह पाठ प्रवाह के रूप में थोड़ी अलग समस्या को हल कर रहा था।

इसलिए मैंने अपना एक छोटा सा प्लगइन लिखा, जिसमें कंटेनर को फिट करने के लिए फ़ॉन्ट का आकार कम कर दिया, यह मानते हुए कि आपके पास है overflow: hiddenऔर white-space: nowrapइसलिए कि भले ही फ़ॉन्ट को कम करके पूर्ण शीर्षक दिखाने की अनुमति न हो, लेकिन यह जो दिखा सकता है उसे काट देता है।

(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);

5

कलात्मक रूप से, यदि आपको पाठ की दो या दो से अधिक पंक्तियों को उनके वर्ण गणना की परवाह किए बिना एक ही चौड़ाई में फिट करने की आवश्यकता है, तो आपके पास अच्छे विकल्प हैं।

यह एक डायनेमिक समाधान खोजने के लिए सबसे अच्छा है इसलिए जो भी पाठ दर्ज किया जाता है वह एक अच्छा प्रदर्शन के साथ समाप्त होता है।

आइए देखें कि हम कैसे दृष्टिकोण कर सकते हैं।

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>

हम सब करते हैं कि संदर्भ के रूप में पहली पंक्ति की चौड़ाई ( els[0].clientWidth) और फ़ॉन्ट आकार ( parseFloat(window.getComputedStyle(els[0],null).getPropertyValue("font-size"))) प्राप्त करें और फिर उसके अनुसार बाद की पंक्तियों के आकार की गणना करें।


4

फिटटेक्स्ट प्लगइन का उपयोग करने का प्रयास करें , क्योंकि व्यूपोर्ट आकार इस समस्या का समाधान नहीं है।

बस पुस्तकालय जोड़ें:

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

और पाठ के गुणांक के अनुसार सही के लिए फ़ॉन्ट-आकार बदलें:

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

आप पाठ के अधिकतम और न्यूनतम मान सेट कर सकते हैं:

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

यह केवल बड़े डिस्प्ले टेक्स्ट के लिए उपयोगी है और पैराग्राफ के लिए अनुशंसित नहीं है।
शिव

3

मेरे कोड को देखो। यह वहाँ जो कुछ भी font size smallerकरने के लिए बनाता है fit

लेकिन मुझे लगता है कि यह एक अच्छा उपयोगकर्ता अनुभव नहीं है

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);
    }
});

परिणाम


2

एक जावास्क्रिप्ट फ़ॉलबैक (या आपके एकमात्र समाधान) के रूप में, आप मेरे jQuery के स्केलेम प्लगइन का उपयोग कर सकते हैं , जो आपको referenceविकल्प पारित करके मूल तत्व (कंटेनर) के सापेक्ष स्केल करने देता है ।


2

यदि यह किसी के लिए उपयोगी है, तो इस धागे के अधिकांश समाधान टेक्स्ट को कई लाइनों में विभाजित कर रहे हैं, फॉर्म ई।

लेकिन तब मुझे यह मिला, और यह काम किया:

https://github.com/chunksnbits/jquery-quickfit

उदाहरण उपयोग:

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


2

इस विशेषता के साथ हमेशा अपना तत्व रखें :

जावास्क्रिप्ट: element.style.fontSize = "100%";

या

सीएसएस: style = "font-size: 100%;"

जब आप फुलस्क्रीन जाते हैं, तो आपके पास पहले से ही एक पैमाना चर (स्केल> 1 या स्केल = 1) होना चाहिए। फिर, फुलस्क्रीन पर:

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

यह थोड़ा कोड के साथ अच्छी तरह से काम करता है।


2

डायनामिक टेक्स्ट के लिए, यह प्लगइन काफी उपयोगी है:

http://freqdec.github.io/slabText/

बस सीएसएस जोड़ें:

.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;
}

और स्क्रिप्ट:

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

2

यह मेरे लिए काम किया:

मैं 'फ़ॉन्ट-आकार: 10px` स्थापित करने से प्राप्त चौड़ाई / ऊंचाई के आधार पर फ़ॉन्ट-आकार का अनुमान लगाने की कोशिश करता हूं। मूल रूप से, यह विचार है कि "अगर मेरे पास 20 पिक्सेल चौड़ाई और 11 पिक्सेल ऊँचाई है, तो 'फॉन्ट-साइज़: 10px` है, इसलिए 50 पिक्सेल चौड़ाई और 30 पिक्सेल ऊँचाई वाले कंटेनर को गणित करने के लिए अधिकतम फ़ॉन्ट-आकार क्या होगा?"

उत्तर दोहरा अनुपात प्रणाली है:

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

अब X एक फ़ॉन्ट-आकार है जो चौड़ाई से मेल खाएगा, और Y एक फ़ॉन्ट-आकार है जो ऊंचाई से मेल खाएगा; सबसे छोटा मान लें

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;
}

एनबी: फ़ंक्शन का तर्क एक स्पैन तत्व या ऐसा तत्व होना चाहिए जो उसके माता-पिता से छोटा हो, अन्यथा यदि बच्चों और माता-पिता के पास एक ही चौड़ाई / ऊंचाई का फ़ंक्शन है, तो वे विफल हो जाएंगे।



1

फ़ॉन्ट-आकार बनाने के लिए इसके कंटेनर को फिट करने के लिए, खिड़की के बजाय, resizeFont()इस प्रश्न में साझा किए गए फ़ंक्शन को देखें (अन्य उत्तरों का एक संयोजन, जिनमें से अधिकांश पहले से ही यहां लिंक किए गए हैं)। इसका उपयोग करके ट्रिगर किया गया है window.addEventListener('resize', resizeFont);

वेनिला जावास्क्रिप्ट: फिट कंटेनर के लिए फ़ॉन्ट-भयानक का आकार बदलें

जावास्क्रिप्ट:

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 + '%';
    }
  }
}

आप शायद vw / vh को फ़ॉलबैक के रूप में उपयोग कर सकते हैं, इसलिए आप जावास्क्रिप्ट का उपयोग करके गतिशील रूप से असाइन emया remइकाइयाँ बनाते हैं, यह सुनिश्चित करते हुए कि फोंट खिड़की के पैमाने पर काम करते हैं यदि जावास्क्रिप्ट अक्षम है।

.resizeआप जिन पाठों को मापना चाहते हैं, उन सभी तत्वों पर कक्षा लागू करें ।

विंडो को जोड़ने से पहले फ़ंक्शन को ट्रिगर करें सूची श्रोता। फिर, किसी भी पाठ को जो उसके कंटेनर में फिट नहीं होता है, जब पृष्ठ लोड होता है, साथ ही जब इसे आकार दिया जाता है, तो इसे कम किया जाएगा।

नोट: डिफ़ॉल्ट या font-sizeतो सेट किया जाना चाहिए em, remया %उचित परिणाम प्राप्त करने के लिए।


1

एचटीएमएल

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

फ़ॉन्ट-आकार को अधिकतम करने के लिए जावास्क्रिप्ट कोड:

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`;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.