การปรับขนาดตัวอักษรตามความกว้างของคอนเทนเนอร์


1186

ฉันมีปัญหาในการปรับขนาดตัวอักษร

ขณะนี้ฉันมีเว็บไซต์นี้ที่มีเนื้อหาfont-size100% 100% ของสิ่งที่คิดว่า? ดูเหมือนว่าจะคำนวณด้วยความละเอียด 16 พิกเซล

ฉันรู้สึกว่า 100% จะอ้างถึงขนาดของหน้าต่างเบราว์เซอร์ แต่อย่างใด แต่ไม่ใช่เพราะมันเป็น 16 พิกเซลเสมอไม่ว่าจะเป็นการปรับขนาดหน้าต่างให้เป็นความกว้างของมือถือหรือเดสก์ท็อปแบบจอกว้างเต็มจอ

ฉันจะทำให้ข้อความในระดับไซต์ของฉันสัมพันธ์กับที่เก็บได้อย่างไร ฉันลองใช้emแต่ก็ไม่ได้ปรับขนาดเหมือนกัน

เหตุผลของฉันคือสิ่งต่าง ๆ เช่นเมนูของฉันกลายเป็น squished เมื่อคุณปรับขนาดดังนั้นฉันจำเป็นต้องลดpx font-sizeจำนวนของ.menuItemองค์ประกอบอื่น ๆ ที่เกี่ยวข้องกับความกว้างของภาชนะ (ตัวอย่างเช่นในเมนูบนเดสก์ท็อปขนาดใหญ่22pxทำงานได้อย่างสมบูรณ์แบบเลื่อนลงไปที่ความกว้างแท็บเล็ตและ16pxเหมาะสมกว่า)

ฉันรู้ว่าฉันสามารถเพิ่มเบรกพอยต์ได้ แต่ฉันต้องการให้ข้อความขยายขนาดและมีเบรกพอยต์เป็นพิเศษมิฉะนั้นฉันจะจบด้วยเบรกพอยต์หลายร้อยตัวสำหรับความกว้างลดลง 100pixels ทุกครั้งเพื่อควบคุมข้อความ


34
font-size: 100%;หมายถึง 100% ของขนาดข้อความที่จะได้รับ (เช่นข้อความที่สืบทอดจากแม่ของมัน) โดยค่าเริ่มต้นนั่นคือ 16px ดังนั้นถ้าคุณใช้ 50% มันจะเป็นขนาดตัวอักษร: 8px
Andy

31
สิ่งที่คุณกำลังมองหาเรียกว่าแบบพิมพ์ขนาดตอบสนองหรือวิวพอร์ต css-tricks.com/viewport-sized-typography
gearsdigital

8
ให้FitTextดู
Patsy Issa

12
@Andy: จริงๆแล้ว "โดยค่าเริ่มต้น" เป็นสิ่งที่ผู้ใช้ตั้งค่าขนาดข้อความของเบราว์เซอร์ซึ่งอาจไม่จำเป็นต้องแก้ไขเป็น 16px
ScottS

1
ลองดูที่คำตอบนี้stackoverflow.com/a/28485608/4251431
Basheer AL-MOMANI

คำตอบ:


1496

แก้ไข: ถ้าภาชนะที่ไม่ได้เป็นร่างกาย CSS เทคนิคครอบคลุมทั้งหมดของตัวเลือกของคุณในการฟิตติ้งข้อความไปยังตู้คอนเทนเนอร์

หากคอนเทนเนอร์เป็นเนื้อความสิ่งที่คุณกำลังค้นหาคือความยาวของวิวพอร์ต :

ยาววิวพอร์ตเปอร์เซ็นต์เป็นญาติกับขนาดของบล็อกที่มีการเริ่มต้น เมื่อความสูงหรือความกว้างของบล็อกเริ่มต้นที่มีการเปลี่ยนแปลงพวกเขาจะถูกปรับตาม อย่างไรก็ตามเมื่อค่าโอเวอร์โฟลว์ในองค์ประกอบรากเป็นแบบอัตโนมัติแถบเลื่อนใด ๆ จะถือว่าไม่มีอยู่

ค่าคือ:

  • vw (% ของความกว้างวิวพอร์ต)
  • vh (% ของความสูงวิวพอร์ต)
  • vi (1% ของขนาดวิวพอร์ตในทิศทางของแกนอินไลน์ขององค์ประกอบราก)
  • vb (1% ของขนาดวิวพอร์ตในทิศทางของแกนบล็อกขององค์ประกอบราก)
  • vmin(เล็กกว่าvwหรือvh)
  • vmax(ขนาดใหญ่ขึ้นหรือvwหรือvh)

1 v * เท่ากับ 1% ของบล็อกเริ่มต้นที่มี

ใช้มันดูเหมือนว่านี้:

p {
    font-size: 4vw;
}

อย่างที่คุณเห็นเมื่อความกว้างวิวพอร์ตเพิ่มขึ้นให้ทำเช่นfont-sizeนั้นโดยไม่จำเป็นต้องใช้คิวรีสื่อ

ค่าเหล่านี้เป็นหน่วยการปรับขนาดเช่นเดียวกับpxหรือemเพื่อให้สามารถใช้ในการกำหนดขนาดองค์ประกอบอื่น ๆ เช่นความกว้างระยะขอบหรือช่องว่างภายใน

การสนับสนุนเบราว์เซอร์ค่อนข้างดี แต่คุณอาจต้องใช้ตัวเลือกสำรองเช่น:

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

ตรวจสอบสถิติการสนับสนุน: http://caniuse.com/#feat=viewport-units

นอกจากนี้ให้ดูที่ CSS-Tricks เพื่อภาพที่กว้างขึ้น: Viewport Sized Typography

นี่เป็นบทความที่ดีเกี่ยวกับการตั้งค่าขนาดต่ำสุด / สูงสุดและการออกกำลังกายควบคุมขนาดได้อีกเล็กน้อย: การควบคุมที่แม่นยำกว่าตัวอักษรที่ตอบสนองได้ดี

และนี่คือบทความเกี่ยวกับการตั้งค่าขนาดของคุณโดยใช้ calc () เพื่อให้ข้อความเติมวิวพอร์ต: http://codepen.io/CrocoDillon/pen/fBJxu

นอกจากนี้โปรดดูบทความนี้ซึ่งใช้เทคนิคขนานนามว่า 'หลอมเหลวชั้นนำ' เพื่อปรับความสูงของเส้นเช่นกัน หลอมเหลวเป็นผู้นำใน CSS


547
แต่ถ้าคอนเทนเนอร์ไม่ใช่วิวพอร์ต (ร่างกาย)
อเล็กซ์

12
@Alex นั่นคืออาณาเขตของ JS ลองใช้FitText.jsทางเลือกที่มีให้ที่ด้านล่างของบทความ @jbenjohnson ที่ให้มา
Robbert

10
นี่คือที่มาของคำสั่งที่เรียกว่าการค้นหาองค์ประกอบซึ่งต่างจากการสืบค้นสื่อ, การค้นหาองค์ประกอบจะปรับขนาดสิ่งต่าง ๆ ตามบล็อกที่มีอยู่ไม่ใช่วิวพอร์ตซึ่งน่าทึ่งมาก! แต่น่าเสียดายที่มันยังไม่มี อย่างไรก็ตามมีโพลีฟิลและหลักฐานพิสูจน์แนวคิดหากคุณสนใจ: coding.smashingmagazine.com/2013/06/25/…และfilamentgroup.com/lab/element_query_workarounds
jbenjohnson

139
ลดระดับเนื่องจากไม่สามารถตอบคำถามได้ เขาถามเกี่ยวกับคอนเทนเนอร์ไม่ใช่วิวพอร์ต กรณีการใช้งานที่แตกต่างอย่างสิ้นเชิง
SongBox

6
"บล็อกเริ่มต้นประกอบด้วย" หมายถึงองค์ประกอบราก นี่ไม่ใช่คำตอบที่ถูกต้องสำหรับคำถามที่ถาม
Glyph

319

แต่ถ้าคอนเทนเนอร์ไม่ใช่วิวพอร์ต (ร่างกาย)

คำถามนี้เป็นคำถามที่ถามในความคิดเห็นโดยอเล็กซ์ภายใต้คำตอบที่ได้รับการยอมรับ

ความจริงนั้นไม่ได้หมายความว่าvwไม่สามารถใช้ในขนาดที่พอเหมาะสำหรับคอนเทนเนอร์นั้น ทีนี้เมื่อต้องการดูการเปลี่ยนแปลงใด ๆ เลยต้องสมมติว่าคอนเทนเนอร์ในบางวิธีมีความยืดหยุ่นในขนาด ไม่ว่าจะผ่านเปอร์เซ็นต์โดยตรงwidthหรือโดยผ่าน 100% ลบด้วยระยะขอบ จุดกลายเป็น "moot" ถ้าตั้งค่าคอนเทนเนอร์ไว้เสมอให้พูด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ที่จะดูดีกับคุณ ดังที่คุณเห็นในความคิดเห็นของฉันในเนื้อหา CSS ข้างต้นคุณสามารถ "คิด" ผ่านทางคณิตศาสตร์ที่เกี่ยวกับขนาดวิวพอร์ตแบบเต็ม แต่คุณไม่จำเป็นต้องทำเช่นนั้น ข้อความกำลังจะ "โค้ง" กับคอนเทนเนอร์เนื่องจากคอนเทนเนอร์กำลังโค้งด้วยการปรับขนาดวิวพอร์ต UPDATE: นี่คือตัวอย่างของสองภาชนะบรรจุขนาดที่แตกต่างกัน

ตัวอย่างที่ 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จุดพักหรือผ่าน JavaScript ดังนั้นสิ่งใดก็ตามที่ "เป้าหมาย" ฐานจะต้องคำนวณใหม่เพื่อรักษา "ความสัมพันธ์" เดียวกันสำหรับการปรับขนาดข้อความ

ใช้ตัวอย่าง # 1 ด้านบน หากdivได้รับการเปลี่ยนไป25%ความกว้างโดยทั้ง@mediaหรือ JavaScript แล้วในเวลาเดียวกันfont-sizeจะต้องมีการปรับตัวทั้งในแบบสอบถามสื่อหรือ JavaScript 5vw * .25 = 1.25เพื่อการคำนวณใหม่ สิ่งนี้จะทำให้ขนาดตัวอักษรมีขนาดเท่ากันซึ่งจะมี "ความกว้าง" ของ50%คอนเทนเนอร์ดั้งเดิมลดลงครึ่งหนึ่งจากการปรับขนาดวิวพอร์ต แต่ตอนนี้ถูกลดลงเนื่องจากการเปลี่ยนแปลงการคำนวณเปอร์เซ็นต์ของตัวเอง

ความท้าทาย

ด้วยการcalc()ใช้งานฟังก์ชั่นCSS3มันจะเป็นการยากที่จะปรับแบบไดนามิกเนื่องจากฟังก์ชั่นนั้นไม่สามารถใช้งานได้ตามfont-sizeวัตถุประสงค์ในเวลานี้ ดังนั้นคุณไม่สามารถปรับ CSS 3 ได้อย่างแท้จริงหากความกว้างของคุณเปลี่ยนcalc()ไป แน่นอนว่าการปรับความกว้างเล็กน้อยสำหรับระยะขอบอาจไม่เพียงพอที่จะรับประกันการเปลี่ยนแปลงใด ๆfont-sizeดังนั้นจึงอาจไม่สำคัญ


(มีข้อบกพร่องของ Chrome ที่มีความยาวร้อยละของวิวพอร์ตและการปรับขนาดหน้าต่าง: code.google.com/p/chromium/issues/detail?id=124331 )
30

@thirtydot: โชคร้าย (แต่ดีที่ต้องระวังขอบคุณ) หวังว่าข้อผิดพลาดจะได้รับการแก้ไขในไม่ช้า แต่ดูเหมือนว่าจะยังคงมีอยู่มาระยะหนึ่งแล้ว
ScottS

20
คำตอบที่ยอดเยี่ยม แต่มันจะไม่ทำงานหากองค์ประกอบที่มีความกว้างสูงสุด
Himmators

3
@KristofferNolgren: ที่เกี่ยวข้องกับสองจุดที่ทำในคำตอบของฉัน: (1) "สมมติว่าคอนเทนเนอร์ในบางวิธีมีความยืดหยุ่นในขนาด" (เมื่อถึง 'ความกว้างสูงสุด' จะไม่มีความยืดหยุ่นอีกต่อไปดังนั้นจึงมีปัญหา ) (2) หากใครสามารถกำหนดได้ว่าจะให้ถึงจุด 'ความกว้างสูงสุด' ที่จุดใดจากนั้นตามที่ฉันได้บันทึกไว้คุณสามารถตั้ง@mediaจุดพักเพื่อเปลี่ยนวิธีการปรับขนาดแบบอักษรที่จุดนั้น (โดยให้ขนาดคงที่เมื่อถึงmax-width) . แค่คิดที่จะทำงานกับmax-widthสถานการณ์
ScottS

คุณคิดว่าคุณจะสามารถทำเรื่องซอเมื่อองค์ประกอบคอนเทนเนอร์เปลี่ยนแบบไดนามิกผ่านการสืบค้นสื่อหรือไม่? ฉันไม่แน่ใจว่าฉันเข้าใจ
J82

58

โซลูชันด้วย SVG:

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


โซลูชันพร้อม SVG และการตัดข้อความโดยใช้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
ความคิดนี้ดูดีในตอนแรก จากนั้นคุณจะรู้ว่าคุณไม่สามารถควบคุมแบบอักษรบน SVG ได้อย่างง่ายดายภายใน <html> แบบอักษรแตกต่างกันในมือถือและเดสก์ท็อปซึ่งมีผลต่อความกว้างสุดท้าย
Stopi

@Stopi คุณคิดอย่างไรเกี่ยวกับโซลูชัน iFrame ตัวอย่าง
Dantio

10
คุณสามารถจัดรูปแบบ SVG ได้อย่างสมบูรณ์จาก HTML / CSS
gman

1
SVG สามารถจัดรูปแบบด้วย css หาก svg เป็นแบบอินไลน์ (อย่าใช้แท็ก img)

8
นี่เป็นทางออกที่ดีที่สุดและคาดการณ์ได้มากที่สุดซึ่งปรับขนาดตามคอนเทนเนอร์แบบไดนามิก
JoshuaDavid

35

ในโครงการหนึ่งของฉันฉันใช้ "ส่วนผสม" ระหว่าง vw และ vh เพื่อปรับขนาดตัวอักษรตามความต้องการของฉันตัวอย่างเช่น:

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

ฉันรู้ว่านี่ไม่ได้ตอบคำถามของ OP แต่อาจเป็นทางออกสำหรับคนอื่น


3
คุณอาจใช้งานvminและ / หรือดีกว่าvmaxแทนได้
sebastian_k

4
เครื่องมือโครเมี่ยม dev นี้เรียกมูลค่าทรัพย์สินไม่ถูกต้อง
phil294

29

โซลูชัน Pure-CSS พร้อมcalc()หน่วย CSS และคณิตศาสตร์

นี่ไม่ใช่สิ่งที่ OP ต้องการ แต่อาจทำให้วันของใครบางคน คำตอบนี้ไม่ง่ายนักและต้องทำการค้นคว้าในส่วนของนักพัฒนา

ในที่สุดฉันก็มาเพื่อรับโซลูชัน CSS บริสุทธิ์สำหรับการใช้งานcalc()กับหน่วยที่แตกต่างกัน calc()คุณจะต้องเข้าใจทางคณิตศาสตร์พื้นฐานบางสูตรจะทำงานออกมาแสดงออกของคุณสำหรับ

เมื่อฉันทำสิ่งนี้ฉันต้องได้รับส่วนหัวที่ตอบสนองแบบเต็มความกว้างโดยมีผู้ปกครองบางส่วนที่เติมเต็มใน DOM ฉันจะใช้ค่านิยมของฉันที่นี่แทนที่ด้วยค่าของคุณเอง

เพื่อคณิตศาสตร์

คุณจะต้องการ:

  • อัตราส่วนที่ปรับปรุงอย่างดีในบางวิวพอร์ต ฉันใช้ 320 พิกเซลดังนั้นฉันจึงสูง 24 พิกเซลและกว้าง 224 พิกเซลดังนั้นอัตราส่วนคือ 9.333 ... หรือ 28/3
  • ความกว้างของภาชนะฉันมีpadding: 3emและความกว้างเต็มดังนั้นนี่จึงเป็น100wv - 2 * 3em

X คือความกว้างของคอนเทนเนอร์ดังนั้นแทนที่ด้วยนิพจน์ของคุณเองหรือปรับค่าเพื่อรับข้อความแบบเต็มหน้า 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หมายถึงความกว้างเต็มของวิวพอร์ตและเป้าหมายของฉันคือการสร้างส่วนหัวแบบเต็มความกว้างพร้อมช่องว่างภายในบางส่วน

วิทยุ. การได้ความกว้างและความสูงในวิวพอร์ตหนึ่งทำให้ฉันมีอัตราส่วนที่จะเล่นด้วยและด้วยอัตราส่วนฉันรู้ว่าความสูงควรอยู่ที่ความกว้างวิวพอร์ตอื่น ๆ การคำนวณด้วยมือจะใช้เวลานานและอย่างน้อยต้องใช้แบนด์วิดท์มากดังนั้นจึงไม่ใช่คำตอบที่ดี

ข้อสรุป

ฉันสงสัยว่าทำไมไม่มีใครหาสิ่งนี้ได้และบางคนก็บอกว่ามันเป็นไปไม่ได้ที่คนจรจัดจะใช้ CSS ฉันไม่ชอบใช้ JavaScript ในการปรับองค์ประกอบดังนั้นฉันจึงไม่ยอมรับ JavaScript (และลืม jQuery) คำตอบโดยไม่ต้องขุดมากกว่านี้ สรุปแล้วมันเป็นสิ่งที่ดีที่จะเข้าใจและนี่คือขั้นตอนเดียวในการนำไปใช้ของ CSS-pure ในการออกแบบเว็บไซต์

ฉันขอโทษที่ประชุมผิดปกติใด ๆ ในข้อความของฉันฉันไม่ใช่เจ้าของภาษาเป็นภาษาอังกฤษและฉันก็ค่อนข้างใหม่ในการเขียนคำตอบ Stack Overflow

ควรสังเกตว่าเรามีแถบเลื่อนชั่วในบางเบราว์เซอร์ ตัวอย่างเช่นเมื่อใช้ Firefox ฉันสังเกตเห็นว่า100vwหมายถึงความกว้างเต็มของวิวพอร์ตการขยายภายใต้แถบเลื่อน (ซึ่งเนื้อหาไม่สามารถขยายได้!) ดังนั้นข้อความแบบเต็มความกว้างจะต้องถูก จำกัด อย่างระมัดระวังและควรทดสอบกับเบราว์เซอร์และอุปกรณ์ต่างๆ


13
วิธีนี้ใช้ได้เฉพาะในกรณีที่ (1) คุณรู้ว่าตัวอักษร (2) ตัวอักษรนั้นมีอยู่ในอุปกรณ์ของผู้ใช้และ (3) ข้อความจะเหมือนกันเสมอ สิ่งนี้ทำให้เป็นกรณีใช้งานที่ จำกัด มาก
Andrei Volgin

ฉันไม่เข้าใจว่าถ้าคอนเทนเนอร์ของฉันแก้ไขด้วยเช่น: 640px และอัตราส่วน 16: 9 ฉันควรเขียน calcs ไหน
pery mimon

1
ความกว้างตู้คอนเทนเนอร์ของคุณxคือ 640px และอัตราส่วนr16: 9 ดังนั้น: x = 640px, r = 16 / 9, y = x / r = 640px / (16 / 9) = 360px
hegez

หมายเหตุ: ใช้งานได้เฉพาะถ้าคุณมีขนาดตัวอักษรเป็น 16: 9 ซึ่งเป็นสถานการณ์ที่แปลก บางทีการอ่านคำตอบครั้งที่สองอาจช่วยได้ นอกจากนี้ยังใช้งานได้กับหนึ่งสมุทรเท่านั้น
hegez

ตามจริงแล้วคุณไม่ได้อธิบายว่า"อัตราส่วนที่ปรับได้ดีในบางวิวพอร์ตฉันใช้ 320 พิกเซลดังนั้นฉันจึงมี 24 พิกเซลสูงและกว้าง 224 พิกเซลดังนั้นอัตราส่วนคือ 9.333 ... หรือ 28/3"ฉันแนะนำให้อธิบายอัตราส่วน อีกเล็กน้อย อัตราส่วนแสดงถึงอะไร
3limin4t0r

28

มีปรัชญาใหญ่สำหรับปัญหานี้

สิ่งที่ง่ายที่สุดที่จะทำจะให้บาง font-size ให้กับร่างกาย (ผมขอแนะนำ 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 พิกเซลคุณจะต้องมีpองค์ประกอบที่มีขนาดแบบอักษร 12 พิกเซล และในความคิดของคุณที่จะกลายเป็นที่เก็บกว้าง 300 พิกเซลที่ขนาดตัวอักษร 4 พิกเซล จะต้องมีขีด จำกัด ต่ำกว่า

โซลูชันอื่นจะมาพร้อมกับข้อความค้นหาสื่อเพื่อให้คุณสามารถตั้งค่าแบบอักษรสำหรับความกว้างที่แตกต่างกัน

แต่วิธีแก้ปัญหาที่ฉันอยากจะแนะนำก็คือการใช้ไลบรารี JavaScript ที่ช่วยคุณได้ และfittext.jsที่ฉันพบจนถึง


6
remหน่วยเทียบกับองค์ประกอบรากความหมายhtmlองค์ประกอบไม่ได้เป็นbodyองค์ประกอบ องค์ประกอบหลักใน DOM คือhtmlแท็ก developer.mozilla.org/en-US/docs/Web/CSS/length .. remมักจะสัมพันธ์กับhtmlแท็กซึ่งเป็นองค์ประกอบหลักไม่ใช่แท็กร่างกาย .. แต่เป็นคำตอบที่ดี :)
Jonathan Marzullo

fittext.js ทำให้งานเสร็จฉันแนะนำโซลูชันนั้น!
Jacek Dziurdzikowski

FitText เป็นผู้ชนะสำหรับฉัน ลองใช้ตัวเลือกสองสามอย่าง แต่วิธีนี้ดูง่ายและรวมเข้ากับ CMS Drupal / Backdrop github.com/davatron5000/FitText.js
Joel เสริม

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

การปฏิบัติที่ไม่ถูกต้องและไม่มีประสิทธิภาพอย่างมาก
Jack Giffin

@tntrox ไม่มีประสิทธิภาพอย่างที่เคยเป็นในวันนี้มันไม่มีประสิทธิภาพมากขึ้นเมื่อ 4 ปีที่แล้ว ฉันปฏิเสธคำตอบนี้แทนทางเลือกที่ดีกว่ามาก ใช่สำหรับการรองรับ IE ก็ต้องใช้ Javascript แต่เราไม่ต้องการจาวาสคริปต์ที่แย่มาก
Jack Giffin

3
ฉันเดาว่าความไม่รู้ของฉันแสดงที่นี่ แต่ทำไมข้างต้นแย่มาก?

ฉันไม่คิดว่ามันน่ากลัว ฉันขอแนะนำการเปลี่ยนแปลงการจัดรูปแบบเล็กน้อยเพื่อให้อ่านง่ายขึ้น ฉันจะใส่แต่ละ var ในบรรทัดแยกกันอย่างน้อย อาจไม่จำเป็นreturn thisเมื่อสิ้นสุดฟังก์ชั่น เพื่อประสิทธิภาพคุณอาจต้องการ debounce theresize เพื่อไม่ให้วาดใหม่เมื่อคุณลาก มันเป็นโค้ดที่ค่อนข้างเรียบง่ายดังนั้นใครบางคนสามารถใช้โซลูชันที่ปรับปรุงแล้วของพวกเขาโดยใช้ความพยายามเพียงเล็กน้อย
Mnebuerquo

19

มีวิธีการทำเช่นนี้โดยไม่ใช้ JavaScript!

คุณสามารถใช้ภาพ SVG แบบอินไลน์ คุณสามารถใช้ CSS บน SVG ได้ถ้ามันเป็นแบบอินไลน์ คุณต้องจำไว้ว่าการใช้วิธีนี้หมายความว่าภาพ SVG ของคุณจะตอบสนองต่อขนาดของคอนเทนเนอร์

ลองใช้วิธีแก้ปัญหาต่อไปนี้ ...

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

ตัวอย่าง: https://jsfiddle.net/k8L4xLLa/32/

ต้องการบางสิ่งที่ฉูดฉาดมากขึ้นหรือไม่

ภาพ SVG ยังช่วยให้คุณทำสิ่งที่ยอดเยี่ยมด้วยรูปร่างและขยะ ลองดูกรณีการใช้งานที่ยอดเยี่ยมสำหรับข้อความที่ปรับขนาดได้ ...

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


4
โซลูชันนี้ไม่แตกต่างจากโซลูชันที่ยอมรับพร้อมvwการปรับขนาด ถ้าคุณเปลี่ยนข้อความทุกอย่างหลุด
N69S

14

สิ่งนี้อาจใช้ไม่ได้จริง แต่ถ้าคุณต้องการให้ฟอนต์เป็นฟังก์ชันโดยตรงของพาเรนต์โดยไม่ต้องมี JavaScript ใด ๆ ที่รับฟัง / ลูป (ช่วงเวลา) เพื่ออ่านขนาดของ div / เพจมีวิธีที่จะทำ . iframes

สิ่งใดก็ตามภายใน iframe จะพิจารณาขนาดของ iframe เป็นขนาดของวิวพอร์ต ดังนั้นเคล็ดลับคือการสร้าง iframe ที่มีความกว้างคือความกว้างสูงสุดที่คุณต้องการให้ข้อความของคุณและความสูงเท่ากับความสูงสูงสุด * อัตราส่วนของข้อความเฉพาะ

นอกเหนือจากข้อ จำกัด ที่วิวพอร์ตยูนิตไม่สามารถมาพร้อมกับหน่วยหลักด้านข้างสำหรับข้อความ (ในขณะที่มี% ขนาดการทำงานเหมือนคนอื่น ๆ ), วิวพอร์ตยูนิตมีเครื่องมือที่ทรงพลังมาก: ความสามารถในการได้มิติต่ำสุด / สูงสุด . คุณไม่สามารถทำอย่างอื่นได้ - คุณไม่สามารถพูดได้ ... ทำให้ความสูงของ div นี้เป็นความกว้างของบางสิ่ง

ที่ถูกกล่าวว่าเคล็ดลับคือการใช้ vmin และการตั้งขนาด 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);
}

ความรำคาญเล็กน้อยของวิธีนี้คือคุณต้องตั้งค่า CSS ของ iframe ด้วยตนเอง หากคุณแนบไฟล์ CSS ทั้งหมดนั่นจะใช้แบนด์วิดท์จำนวนมากสำหรับพื้นที่ข้อความจำนวนมาก ดังนั้นสิ่งที่ฉันทำคือแนบกฎที่ฉันต้องการโดยตรงจาก CSS

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

คุณสามารถเขียนฟังก์ชั่นขนาดเล็กที่ได้รับกฎ CSS / กฎ CSS ทั้งหมดที่จะส่งผลกระทบต่อพื้นที่ข้อความ

ฉันไม่สามารถคิดวิธีอื่นได้โดยไม่ต้องมี JavaScript ขี่จักรยาน / ฟัง วิธีแก้ปัญหาที่แท้จริงคือสำหรับเบราว์เซอร์ที่จะให้วิธีการปรับขนาดข้อความเป็นฟังก์ชั่นของภาชนะหลักและยังมีฟังก์ชั่นประเภท vmin / vmax เดียวกัน

JSFiddle: https://jsfiddle.net/0jr7rrgm/3/ (คลิกหนึ่งครั้งเพื่อล็อคสี่เหลี่ยมสีแดงกับเมาส์และคลิกอีกครั้งเพื่อปล่อย)

JavaScript ส่วนใหญ่ในซอเป็นเพียงฟังก์ชั่นลากคลิกแบบกำหนดเองของฉัน


@quemeful ไม่เช่นนั้นเมื่อเรานำคุณลักษณะ'ใหม่'และ'แวววาว' (กลองโปรด ... ) srcdoc: jsfiddle.net/wauzgob6/3
Jack Giffin

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ต้องใช้การสัมผัสของมนุษย์และจังหวะในแนวดิ่งไม่ใช่เวทมนตร์
serraosays

7

100% สัมพันธ์กับขนาดแบบอักษรพื้นฐานซึ่งหากคุณยังไม่ได้ตั้งค่านั้นจะเป็นค่าเริ่มต้นตัวแทนผู้ใช้ของเบราว์เซอร์

เพื่อให้ได้เอฟเฟกต์หลังจากนั้นฉันจะใช้โค้ด JavaScript เพื่อปรับขนาดฟอนต์พื้นฐานเทียบกับขนาดหน้าต่าง


7

ภายใน CSS ของคุณลองเพิ่มสิ่งนี้ที่ด้านล่างซึ่งเปลี่ยนความกว้าง 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
เนื่องจากสคริปต์นี้จะทำงานในทุกกิจกรรมที่ปรับขนาดและ / หรือการเปลี่ยนทิศทางฉันไม่แนะนำให้ใช้สิ่งนี้ แทนที่จะใช้ javascript based solution ให้มองหา css based solution ดังที่ระบุไว้ด้านบน
Pilatus

1
การปรับขนาดและการวางแนวเป็นเหตุการณ์ "หายาก" ไม่มีปัญหาประสิทธิภาพที่นี่ หากคุณต้องการอย่าผูกเข้ากับเหตุการณ์ (หากพวกเขาไม่ปรับขนาดภาชนะบรรจุเช่นสำหรับเว็บไซต์ที่ไม่ตอบสนอง) โซลูชัน CSS ไม่ทำงานในทุกกรณีโดยไม่ต้องคิดอะไร (เช่นความกว้างของแบบอักษรหรืออื่น ๆ ) ตามวิธีนี้
Vincent

ฉันห่อคำตอบของคุณเป็นฟังก์ชัน jQuery ได้รับความสูงสูงสุดที่อนุญาตขนาดตัวอักษรขั้นต่ำและสูงสุด ดูjsfiddle.net/oriadam/qzsy760k
oriadam

6

องค์ประกอบเว็บนี้เปลี่ยนขนาดตัวอักษรเพื่อให้ความกว้างของข้อความภายในตรงกับความกว้างของภาชนะ ตรวจสอบการสาธิต

คุณสามารถใช้สิ่งนี้:

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


6

ฉันได้เตรียมฟังก์ชั่นสเกลอย่างง่ายโดยใช้การแปลง CSS แทนขนาดตัวอักษร คุณสามารถใช้ภายในคอนเทนเนอร์ใด ๆ คุณไม่จำเป็นต้องตั้งค่าเคียวรีสื่อบันทึก ฯลฯ :)

บล็อกโพสต์: ส่วนหัวที่ปรับขนาดได้ CSS & JS แบบเต็มความกว้าง

รหัส:

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


ฉันคิดว่า OP กำลังมองหาโซลูชัน CSS
m02ph3u5

5

ใช้ตัวแปร CSS

ยังไม่มีใครพูดถึงตัวแปร 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 );
}

มันไม่ใช่วิธี CSS ที่บริสุทธิ์แต่ใกล้เคียงกัน


5

ลองhttp://simplefocus.com/flowtype/ นี่คือสิ่งที่ฉันใช้สำหรับเว็บไซต์ของฉันและทำงานได้อย่างสมบูรณ์


ลิงค์มีความผันผวน โปรดอธิบายวิธีแก้ปัญหาโดยตรงในคำตอบของคุณ นอกจากนี้ฉันไม่ต้องการคลิกลิงก์สุ่มที่มีเนื้อหาอะไรก็ได้
lilalinux

5

ปัญหาของฉันคล้ายกัน แต่เกี่ยวข้องกับการปรับขนาดข้อความภายในหัวเรื่อง ฉันลอง Fit Font แต่ฉันต้องสลับคอมเพรสเซอร์เพื่อให้ได้ผลลัพธ์ใด ๆ เนื่องจากเป็นการแก้ปัญหาที่แตกต่างกันเล็กน้อยเช่นเดียวกับ Text Flow

ดังนั้นฉันจึงเขียนปลั๊กอินเล็ก ๆ ของตัวเองที่ลดขนาดตัวอักษรให้พอดีกับภาชนะสมมติว่าคุณมี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

ลองใช้ปลั๊กอินfitTextเนื่องจากขนาด Viewport ไม่ใช่วิธีแก้ปัญหานี้

เพียงเพิ่มห้องสมุด:

<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

ในฐานะที่เป็นทางเลือก JavaScript (หรือทางออกเดียวของคุณ) คุณสามารถใช้ปลั๊กอิน jQuery Scalemของฉันซึ่งช่วยให้คุณสามารถปรับขนาดสัมพันธ์กับองค์ประกอบหลัก (คอนเทนเนอร์) โดยผ่านreferenceตัวเลือก


2

ในกรณีที่เป็นประโยชน์กับทุกคนโซลูชันส่วนใหญ่ในชุดข้อความนี้คือการตัดข้อความเป็นหลายบรรทัดฟอร์ม e

แต่ฉันก็พบสิ่งนี้และมันได้ผล:

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

ตัวอย่างการใช้งาน:

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


2

มีองค์ประกอบของคุณด้วยคุณลักษณะนี้เสมอ:

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

หรือ

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

เมื่อคุณไปเต็มหน้าจอแล้วคุณควรจะมีขนาดตัวแปรคำนวณ (ขนาด> 1 หรือขนาด = 1) จากนั้นในเต็มหน้าจอ:

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

มันทำงานได้ดีกับรหัสน้อย


2

สำหรับข้อความไดนามิกปลั๊กอินนี้ค่อนข้างมีประโยชน์:

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

เพียงเพิ่ม CSS:

.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

ฉันไม่เห็นคำตอบใด ๆ เกี่ยวกับคุณสมบัติ CSS flex แต่ก็มีประโยชน์เช่นกัน


2
คุณสามารถทำอย่างละเอียด?
Peter Mortensen

1

เพื่อที่จะทำให้ขนาดตัวอักษรเหมาะสมกับที่เก็บของมันแทนที่จะเป็นหน้าต่างให้ดูresizeFont()ฟังก์ชั่นที่ฉันได้แชร์ในคำถามนี้ window.addEventListener('resize', resizeFont);มันจะถูกเรียกใช้

JavaScript วานิลลา: ปรับขนาดแบบอักษรสุดยอดเพื่อให้พอดีกับคอนเทนเนอร์

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

บางทีคุณอาจใช้ vw / vh เป็นทางเลือกดังนั้นคุณกำหนดแบบไดนามิกemหรือremหน่วยโดยใช้ JavaScript เพื่อให้แน่ใจว่าแบบอักษรมีการปรับขนาดไปที่หน้าต่างหากปิดการใช้งาน JavaScript

ใช้.resizeคลาสกับองค์ประกอบทั้งหมดที่มีข้อความที่คุณต้องการปรับสัดส่วน

ทริกเกอร์ฟังก์ชั่นก่อนที่จะเพิ่มหน้าต่างปรับขนาดฟังเหตุการณ์ จากนั้นข้อความใด ๆ ที่ไม่พอดีกับคอนเทนเนอร์จะถูกย่อขนาดเมื่อโหลดหน้าเว็บรวมถึงเมื่อมีการปรับขนาด

หมายเหตุ: ค่าเริ่มต้นfont-sizeจะต้องตั้งค่าอย่างใดอย่างหนึ่งem, remหรือ%เพื่อให้บรรลุผลที่เหมาะสม


1

HTML

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

รหัส JavaScript สำหรับเพิ่มขนาดตัวอักษรให้ใหญ่ที่สุด:

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`;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.