จะเพิ่มไฟล์ฟอนต์หลายไฟล์สำหรับฟอนต์เดียวกันได้อย่างไร


454

ฉันกำลังดูหน้า MDC สำหรับกฎ @ font-face CSSแต่ฉันไม่ได้อะไรเลย ฉันมีไฟล์ที่แยกต่างหากสำหรับตัวหนา , ตัวเอียงและตัวหนาตัวเอียง + ฉันจะฝังทั้งสามไฟล์ใน@font-faceกฎเดียวได้อย่างไร ตัวอย่างเช่นถ้าฉันมี:

@font-face {
    font-family: "DejaVu Sans";
    src: url("./fonts/DejaVuSans.ttf") format("ttf");
}
strong {
    font-family: "DejaVu Sans";
    font-weight: bold;
}

เบราว์เซอร์จะไม่ทราบว่าจะใช้แบบอักษรใดสำหรับตัวหนา (เพราะไฟล์นั้นคือ DejaVuSansBold.ttf) ดังนั้นจึงจะเป็นค่าเริ่มต้นสำหรับสิ่งที่ฉันอาจไม่ต้องการ ฉันจะบอกเบราว์เซอร์ที่แตกต่างกันทั้งหมดที่ฉันมีสำหรับแบบอักษรบางตัวได้อย่างไร


ในฐานะที่เป็นส่วนขยายของคำถามหากเราใช้แบบอักษรเหล่านี้ในโปรแกรมแก้ไขแบบ WYSIWYG เช่น TinyMCE เรายังต้องการตัวเอียงแบบหนาหรือไม่? แม้จะมี TinyMCE ที่จะต้องทำตัวหนาตัวเอียง? คำตอบที่ฉันเดาคือใช่ - เพราะพวกเขามองหาไฟล์เหล่านี้ใช่ไหม
Nishant

เป็นไปได้ที่ซ้ำกันของวิธีการรวมแบบอักษร?
user2284570

คำตอบ:


749

โซลูชันดูเหมือนว่าจะเพิ่ม@font-faceกฎหลายข้อตัวอย่างเช่น:

@font-face {
    font-family: "DejaVu Sans";
    src: url("fonts/DejaVuSans.ttf");
}
@font-face {
    font-family: "DejaVu Sans";
    src: url("fonts/DejaVuSans-Bold.ttf");
    font-weight: bold;
}
@font-face {
    font-family: "DejaVu Sans";
    src: url("fonts/DejaVuSans-Oblique.ttf");
    font-style: italic, oblique;
}
@font-face {
    font-family: "DejaVu Sans";
    src: url("fonts/DejaVuSans-BoldOblique.ttf");
    font-weight: bold;
    font-style: italic, oblique;
}

อย่างไรก็ตามดูเหมือนว่า Google Chrome จะไม่ทราบเกี่ยวกับformat("ttf")ข้อโต้แย้งดังนั้นคุณอาจต้องการข้ามไป

(คำตอบนี้ถูกต้องสำหรับข้อมูลจำเพาะCSS 2 CSS3อนุญาตเฉพาะแบบอักษรหนึ่งแบบแทนที่จะเป็นรายการที่คั่นด้วยเครื่องหมายจุลภาค)


130
คำสั่งซื้อเป็นสิ่งสำคัญสไตล์ตัวหนา / ตัวเอียงจะต้องมีอายุ
ผู้ที่

8
น่าสังเกตว่านี่ใช้ไม่ได้กับ IE8 (และด้านล่าง) แม้ว่าคุณจะใช้ EOT ก็ตาม IE จะดาวน์โหลดแบบอักษรทางเลือก แต่จะไม่ใช้แบบอักษรนั้น แต่จะเป็นแบบอักษรตัวหนา / ตัวเอียงปลอมแทน นอกจากนี้ Chrome 11 ดูเหมือนจะล้มเหลวในการสร้างตัวอักษรที่เป็นตัวหนาและตัวเอียง
JaffaTheCake

2
ตัวอย่างนี้ทำงานได้อย่างสมบูรณ์แบบสำหรับแบบอักษรที่มีไฟล์ TTF แยกต่างหากสำหรับตัวหนาและตัวเอียง แต่ถ้าตัวอักษรทั้งหมดอยู่ในไฟล์. ttf หนึ่งไฟล์และคุณต้องการใช้ตัวหนามันจะทำงานอย่างไร?

2
บทความนี้ อธิบายการทำงานได้ดีมาก Key excerpt: "สังเกตว่าคุณสมบัติ font-family นั้นมีชื่อเหมือนกันสำหรับทั้งสี่แบบอักษรนอกจากนี้รูปแบบ font และน้ำหนัก font นั้นตรงกับแบบอักษรหมายเหตุ: น้ำหนักปกติต้องอยู่ที่ด้านบนสุดของรายการ! เราไม่พบคำสั่งนั้นหลังจากนั้น "
JD Smith

13
ฉันมีปัญหากับ snipped นี้ในเบราว์เซอร์ Android 4.4 ที่ฝังตัว สิ้นสุดการเปลี่ยนfont-style: italic, oblique;เป็นเพียงfont-style: italic;ดูเหมือนจะแก้ไขทุกอย่าง
Xavi

59

ในฐานะของ CSS3, font-styleสเปคที่มีการเปลี่ยนแปลงการอนุญาตให้เพียงคนเดียว รายการที่คั่นด้วยเครื่องหมายจุลภาค (ต่อ CSS2) จะได้รับการปฏิบัติเสมือนว่าเป็นรายการnormalและแทนที่รายการก่อนหน้า (เริ่มต้น) ใด ๆ สิ่งนี้จะทำให้แบบอักษรที่กำหนดในลักษณะนี้ปรากฏเป็นตัวเอียงอย่างถาวร

@font-face {
    font-family: "DejaVu Sans";
    src: url("fonts/DejaVuSans.ttf");
}
@font-face {
    font-family: "DejaVu Sans";
    src: url("fonts/DejaVuSans-Bold.ttf");
    font-weight: bold;
}
@font-face {
    font-family: "DejaVu Sans";
    src: url("fonts/DejaVuSans-Oblique.ttf");
    font-style: italic;
}
@font-face {
    font-family: "DejaVu Sans";
    src: url("fonts/DejaVuSans-BoldOblique.ttf");
    font-weight: bold;
    font-style: italic;
}
@font-face {
    font-family: "DejaVu Sans";
    src: url("fonts/DejaVuSans-Oblique.ttf");
    font-style: oblique;
}
@font-face {
    font-family: "DejaVu Sans";
    src: url("fonts/DejaVuSans-BoldOblique.ttf");
    font-weight: bold;
    font-style: oblique;
}

ในกรณีส่วนใหญ่ตัวเอียงอาจจะเพียงพอและไม่จำเป็นต้องใช้กฎเอียงหากคุณระมัดระวังในการกำหนดว่าคุณจะใช้และยึดติดกับอะไร


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

3
@NathanMerrill โดย OP: I have separate files for bold, italic and bold + italic- ดังนั้นจึงมีสามไฟล์ที่แตกต่างกัน คำตอบนี้แก้ไขคำตอบที่ยอมรับได้ซึ่งfont-style: italic, oblique;ไม่ถูกต้องอีกต่อไป แต่คำตอบนั้นใช้ไฟล์เดียวกันสำหรับตัวเอียงและเอียง ยังคงมีค่าชี้ให้เห็นว่าไฟล์ที่ใช้ร่วมกันในสองกรณี
Silly Freak

18

หากต้องการให้รูปแบบตัวอักษรทำงานอย่างถูกต้องฉันต้องย้อนกลับลำดับของ @ font-face ใน CSS

@font-face {
    font-family: "DejaVuMono";
    src: url("styles/DejaVuSansMono-BoldOblique.ttf");
    font-weight: bold;
    font-style: italic, oblique;
}   
@font-face {
    font-family: "DejaVuMono";
    src: url("styles/DejaVuSansMono-Oblique.ttf");
    font-style: italic, oblique;
}
@font-face {
    font-family: "DejaVuMono";
    src: url("styles/DejaVuSansMono-Bold.ttf");
    font-weight: bold;
}
 @font-face {
    font-family: "DejaVuMono";
    src: url("styles/DejaVuSansMono.ttf");
}

มีประโยชน์มาก. +1
Mr. Polywhirl

คุณหมายถึงอะไรโดย"กลับคำสั่งซื้อ" ?
Nyxynyx

15

ปัจจุบัน 2017/12/17 ฉันไม่พบรายละเอียดใด ๆ เกี่ยวกับ Font-คุณสมบัติการสั่งซื้อของจำเป็นในสเปค และฉันทดสอบด้วยโครเมี่ยมว่าทำงานได้ตามปกติ

@font-face {
  font-family: 'Font Awesome 5 Free';
  font-weight: 900;
  src: url('#{$fa-font-path}/fa-solid-900.eot');
  src: url('#{$fa-font-path}/fa-solid-900.eot?#iefix') format('embedded-opentype'),
  url('#{$fa-font-path}/fa-solid-900.woff2') format('woff2'),
  url('#{$fa-font-path}/fa-solid-900.woff') format('woff'),
  url('#{$fa-font-path}/fa-solid-900.ttf') format('truetype'),
  url('#{$fa-font-path}/fa-solid-900.svg#fontawesome') format('svg');
}

@font-face {
  font-family: 'Font Awesome 5 Free';
  font-weight: 400;
  src: url('#{$fa-font-path}/fa-regular-400.eot');
  src: url('#{$fa-font-path}/fa-regular-400.eot?#iefix') format('embedded-opentype'),
  url('#{$fa-font-path}/fa-regular-400.woff2') format('woff2'),
  url('#{$fa-font-path}/fa-regular-400.woff') format('woff'),
  url('#{$fa-font-path}/fa-regular-400.ttf') format('truetype'),
  url('#{$fa-font-path}/fa-regular-400.svg#fontawesome') format('svg');
}

13

หากคุณใช้แบบอักษรของ Google ฉันจะแนะนำต่อไปนี้

หากคุณต้องการให้แบบอักษรเรียกใช้จาก localhost หรือเซิร์ฟเวอร์ของคุณคุณต้องดาวน์โหลดไฟล์

แทนที่จะดาวน์โหลดแพ็คเกจ ttf ในลิงค์ดาวน์โหลดให้ใช้ลิงค์สดที่พวกเขามีให้ตัวอย่างเช่น:

http://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,300italic,400italic,600italic

วาง URL ในเบราว์เซอร์ของคุณและคุณควรได้รับการประกาศตัวอักษรแบบหน้าคล้ายกับคำตอบแรก

เปิด URL ที่ให้ไว้ดาวน์โหลดและเปลี่ยนชื่อไฟล์

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


3
/*
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# dejavu sans
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
*/
/*default version*/
@font-face {
    font-family: 'DejaVu Sans';
    src: url('dejavu/DejaVuSans.ttf'); /* IE9 Compat Modes */
    src: 
        local('DejaVu Sans'),
        local('DejaVu-Sans'), /* Duplicated name with hyphen */
        url('dejavu/DejaVuSans.ttf') 
        format('truetype');
}
/*bold version*/
@font-face {
    font-family: 'DejaVu Sans';
    src: url('dejavu/DejaVuSans-Bold.ttf'); 
    src: 
        local('DejaVu Sans'),
        local('DejaVu-Sans'),
        url('dejavu/DejaVuSans-Bold.ttf') 
        format('truetype');
    font-weight: bold;
}
/*italic version*/
@font-face {
    font-family: 'DejaVu Sans';
    src: url('dejavu/DejaVuSans-Oblique.ttf'); 
    src: 
        local('DejaVu Sans'),
        local('DejaVu-Sans'),
        url('dejavu/DejaVuSans-Oblique.ttf') 
        format('truetype');
    font-style: italic;
}
/*bold italic version*/
@font-face {
    font-family: 'DejaVu Sans';
    src: url('dejavu/DejaVuSans-BoldOblique.ttf'); 
    src: 
        local('DejaVu Sans'),
        local('DejaVu-Sans'),
        url('dejavu/DejaVuSans-BoldOblique.ttf') 
        format('truetype');
    font-weight: bold;
    font-style: italic;
}

1

อย่าลืมว่าสำหรับตัวแปรตัวหนามันคือfont-weight; สำหรับตัวแปรตัวเอียงมันเป็นfont-style


ไม่เกี่ยวข้องกับปัญหาและ @font-faceดังนั้นฉันจึงพยายามที่จะลดคำตอบนี้ (แต่ฉันทำไม่ได้ฉันไม่มีชื่อเสียงพอ)
FryingggPannn

ใช่ไม่ใช่คำตอบสำหรับคำถาม แต่เป็นสิ่งที่ดีที่ควรจดจำเมื่อใช้คำตอบ ปัญหาคือส่วนความเห็นของคำตอบมีจำนวนมากอยู่แล้วดังนั้นเคล็ดลับนี้จะถูกฝังอยู่
Ooker

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