وحدة الخطوط
next/font
يقوم بتحسين خطوطك تلقائيًا (بما في ذلك الخطوط المخصصة) وإزالة طلبات الشبكة الخارجية لتحسين الخصوصية والأداء.
يتضمن استضافة ذاتية تلقائية مدمجة لأي ملف خط. هذا يعني أنه يمكنك تحميل خطوط الويب بشكل مثالي دون أي انزياح في التخطيط.
يمكنك أيضًا استخدام جميع خطوط جوجل بسهولة. يتم تنزيل ملفات CSS والخطوط في وقت البناء واستضافتها ذاتيًا مع باقي الأصول الثابتة. لا يتم إرسال أي طلبات إلى جوجل من المتصفح.
لاستخدام الخط في جميع صفحاتك، أضفه إلى ملف _app.js
تحت /pages
كما هو موضح أدناه:
import { Inter } from 'next/font/google'
// إذا كنت تحمل خطًا متغيرًا، فلن تحتاج إلى تحديد وزن الخط
const inter = Inter({ subsets: ['latin'] })
export default function MyApp({ Component, pageProps }) {
return (
<main className={inter.className}>
<Component {...pageProps} />
</main>
)
}
🎥 شاهد: تعرف على المزيد حول استخدام
next/font
→ يوتيوب (6 دقائق).
المرجع
المفتاح | font/google | font/local | النوع | مطلوب |
---|---|---|---|---|
src | سلسلة أو مصفوفة كائنات | نعم | ||
weight | سلسلة أو مصفوفة | مطلوب/اختياري | ||
style | سلسلة أو مصفوفة | - | ||
subsets | مصفوفة سلاسل | - | ||
axes | مصفوفة سلاسل | - | ||
display | سلسلة | - | ||
preload | منطقي | - | ||
fallback | مصفوفة سلاسل | - | ||
adjustFontFallback | منطقي أو سلسلة | - | ||
variable | سلسلة | - | ||
declarations | مصفوفة كائنات | - |
src
مسار ملف الخط كسلسلة أو مصفوفة كائنات (من نوع Array<{path: string, weight?: string, style?: string}>
) بالنسبة إلى الدليل الذي يتم فيه استدعاء دالة محمل الخط.
مستخدم في next/font/local
- مطلوب
أمثلة:
src:'./fonts/my-font.woff2'
حيث يتم وضعmy-font.woff2
في دليل باسمfonts
داخل دليلapp
src:[{path: './inter/Inter-Thin.ttf', weight: '100',},{path: './inter/Inter-Regular.ttf',weight: '400',},{path: './inter/Inter-Bold-Italic.ttf', weight: '700',style: 'italic',},]
- إذا تم استدعاء دالة محمل الخط في
app/page.tsx
باستخدامsrc:'../styles/fonts/my-font.ttf'
، فإنmy-font.ttf
يوضع فيstyles/fonts
في جذر المشروع
weight
وزن
الخط مع الاحتمالات التالية:
- سلسلة بقيم الأوزان المتاحة للخط المحدد أو نطاق من القيم إذا كان خطًا متغيرًا
- مصفوفة بقيم الوزن إذا لم يكن الخط خط جوجل متغير. ينطبق فقط على
next/font/google
.
مستخدم في next/font/google
و next/font/local
- مطلوب إذا كان الخط المستخدم ليس متغيرًا
أمثلة:
weight: '400'
: سلسلة لقيمة وزن واحدة - للخطInter
، القيم الممكنة هي'100'
,'200'
,'300'
,'400'
,'500'
,'600'
,'700'
,'800'
,'900'
أو'variable'
حيث'variable'
هي الافتراضية)weight: '100 900'
: سلسلة للنطاق بين100
و900
لخط متغيرweight: ['100','400','900']
: مصفوفة بثلاث قيم ممكنة لخط غير متغير
style
نمط
الخط مع الاحتمالات التالية:
- سلسلة قيمة بقيمة افتراضية
'normal'
- مصفوفة بقيم النمط إذا لم يكن الخط خط جوجل متغير. ينطبق فقط على
next/font/google
.
مستخدم في next/font/google
و next/font/local
- اختياري
أمثلة:
style: 'italic'
: سلسلة - يمكن أن تكونnormal
أوitalic
لـnext/font/google
style: 'oblique'
: سلسلة - يمكن أن تأخذ أي قيمة لـnext/font/local
ولكن من المتوقع أن تكون من أنماط الخطوط القياسيةstyle: ['italic','normal']
: مصفوفة بقيمتين لـnext/font/google
- القيم منnormal
وitalic
subsets
مجموعات فرعية
الخط المحددة بمصفوفة قيم سلسلة بأسماء كل مجموعة فرعية تريد تحميلها مسبقًا. سيتم حقق علامة تحميل مسبق للرأس عند تعيين خيار preload
على true
، وهو الافتراضي.
مستخدم في next/font/google
- اختياري
أمثلة:
subsets: ['latin']
: مصفوفة بالمجموعة الفرعيةlatin
يمكنك العثور على قائمة بجميع المجموعات الفرعية في صفحة جوجل للخط الخاص بك.
axes
بعض الخطوط المتغيرة تحتوي على محاور
إضافية يمكن تضمينها. افتراضيًا، يتم تضمين وزن الخط فقط لتقليل حجم الملف. تعتمد القيم الممكنة لـ axes
على الخط المحدد.
مستخدم في next/font/google
- اختياري
أمثلة:
axes: ['slnt']
: مصفوفة بقيمةslnt
للخط المتغيرInter
الذي يحتوي علىslnt
كمحاور إضافية كما هو موضح هنا. يمكنك العثور على قيمaxes
الممكنة لخطك باستخدام الفلتر في صفحة خطوط جوجل المتغيرة والبحث عن محاور غيرwght
display
عرض
الخط بقيم سلسلة ممكنة لـ 'auto'
, 'block'
, 'swap'
, 'fallback'
أو 'optional'
بقيمة افتراضية 'swap'
.
مستخدم في next/font/google
و next/font/local
- اختياري
أمثلة:
display: 'optional'
: سلسلة معينة لقيمةoptional
preload
قيمة منطقية تحدد ما إذا كان يجب تحميل الخط مسبقًا أم لا. الافتراضي هو true
.
مستخدم في next/font/google
و next/font/local
- اختياري
أمثلة:
preload: false
fallback
الخط الاحتياطي لاستخدامه إذا تعذر تحميل الخط. مصفوفة سلاسل للخطوط الاحتياطية بدون افتراضي.
- اختياري
مستخدم في next/font/google
و next/font/local
أمثلة:
fallback: ['system-ui', 'arial']
: مصفوفة تعيين الخطوط الاحتياطية إلىsystem-ui
أوarial
adjustFontFallback
- لـ
next/font/google
: قيمة منطقية تحدد ما إذا كان يجب استخدام خط احتياطي تلقائي لتقليل انزياح التخطيط التراكمي. الافتراضي هوtrue
. - لـ
next/font/local
: قيمة سلسلة أو منطقيةfalse
تحدد ما إذا كان يجب استخدام خط احتياطي تلقائي لتقليل انزياح التخطيط التراكمي. القيم الممكنة هي'Arial'
,'Times New Roman'
أوfalse
. الافتراضي هو'Arial'
.
مستخدم في next/font/google
و next/font/local
- اختياري
أمثلة:
adjustFontFallback: false
: لـnext/font/google
adjustFontFallback: 'Times New Roman'
: لـnext/font/local
variable
قيمة سلسلة لتحديد اسم متغير CSS لاستخدامه إذا تم تطبيق النمط بطريقة متغير CSS.
مستخدم في next/font/google
و next/font/local
- اختياري
أمثلة:
variable: '--my-font'
: يتم تعريف متغير CSS--my-font
declarations
مصفوفة أزواج مفتاح-قيمة لـ واصفات وجه الخط التي تحدد @font-face
المُنشأة بشكل أكبر.
مستخدم في next/font/local
- اختياري
أمثلة:
declarations: [{ prop: 'ascent-override', value: '90%' }]
أمثلة
خطوط جوجل
لاستخدام خط جوجل، قم باستيراده من next/font/google
كدالة. نوصي باستخدام الخطوط المتغيرة للحصول على أفضل أداء ومرونة.
لاستخدام الخط في جميع صفحاتك، أضفه إلى ملف _app.js
تحت /pages
كما هو موضح أدناه:
import { Inter } from 'next/font/google'
// إذا كنت تحمل خطًا متغيرًا، فلن تحتاج إلى تحديد وزن الخط
const inter = Inter({ subsets: ['latin'] })
export default function MyApp({ Component, pageProps }) {
return (
<main className={inter.className}>
<Component {...pageProps} />
</main>
)
}
إذا لم تتمكن من استخدام خط متغير، فسوف تحتاج إلى تحديد وزن:
import { Roboto } from 'next/font/google'
const roboto = Roboto({
weight: '400',
subsets: ['latin'],
})
export default function MyApp({ Component, pageProps }) {
return (
<main className={roboto.className}>
<Component {...pageProps} />
</main>
)
}
يمكنك تحديد أوزان و/أو أنماط متعددة باستخدام مصفوفة:
const roboto = Roboto({
weight: ['400', '700'],
style: ['normal', 'italic'],
subsets: ['latin'],
display: 'swap',
})
جيد أن تعرف: استخدم شرطة سفلية (_) لأسماء الخطوط التي تحتوي على كلمات متعددة. على سبيل المثال،
Roboto Mono
يجب استيراده كـRoboto_Mono
.
تطبيق الخط في <head>
يمكنك أيضًا استخدام الخط بدون غلاف و className
عن طريق حقنه داخل <head>
كما يلي:
import { Inter } from 'next/font/google'
const inter = Inter({ subsets: ['latin'] })
export default function MyApp({ Component, pageProps }) {
return (
<>
<style jsx global>{`
html {
font-family: ${inter.style.fontFamily};
}
`}</style>
<Component {...pageProps} />
</>
)
}
استخدام صفحة واحدة
لاستخدام الخط في صفحة واحدة، أضفه إلى الصفحة المحددة كما هو موضح أدناه:
import { Inter } from 'next/font/google'
const inter = Inter({ subsets: ['latin'] })
export default function Home() {
return (
<div className={inter.className}>
<p>Hello World</p>
</div>
)
}
تحديد مجموعة فرعية
يتم تقسيم خطوط جوجل تلقائيًا. هذا يقلل من حجم ملف الخط ويحسن الأداء. ستحتاج إلى تحديد أي من هذه المجموعات الفرعية تريد تحميلها مسبقًا. الفشل في تحديد أي مجموعات فرعية بينما preload
مضبوط على true
سيؤدي إلى تحذير.
يمكن القيام بذلك عن طريق إضافته إلى استدعاء الدالة:
const inter = Inter({ subsets: ['latin'] })
عرض مرجع واجهة برمجة تطبيق الخط لمزيد من المعلومات.
استخدام خطوط متعددة
يمكنك استيراد واستخدام عدة خطوط في تطبيقك. هناك طريقتان يمكنك اتباعهما.
الطريقة الأولى هي إنشاء دالة مساعدة (utility function) تقوم بتصدير خط، استيراده، وتطبيق className
الخاص به حيثما تحتاج. هذا يضمن تحميل الخط مسبقًا فقط عند عرضه:
import { Inter, Roboto_Mono } from 'next/font/google'
export const inter = Inter({
subsets: ['latin'],
display: 'swap',
})
export const roboto_mono = Roboto_Mono({
subsets: ['latin'],
display: 'swap',
})
import { Inter, Roboto_Mono } from 'next/font/google'
export const inter = Inter({
subsets: ['latin'],
display: 'swap',
})
export const roboto_mono = Roboto_Mono({
subsets: ['latin'],
display: 'swap',
})
في المثال أعلاه، سيتم تطبيق Inter
بشكل عام، ويمكن استيراد Roboto Mono
وتطبيقه حسب الحاجة.
بدلاً من ذلك، يمكنك إنشاء متغير CSS واستخدامه مع حل CSS المفضل لديك:
html {
font-family: var(--font-inter);
}
h1 {
font-family: var(--font-roboto-mono);
}
في المثال أعلاه، سيتم تطبيق Inter
بشكل عام، وسيتم تنسيق أي علامات <h1>
باستخدام Roboto Mono
.
توصية: استخدم عدة خطوط بحذر حيث أن كل خط جديد يمثل موردًا إضافيًا يجب على العميل تنزيله.
الخطوط المحلية
استورد next/font/local
وحدد src
لملف الخط المحلي الخاص بك. نوصي باستخدام الخطوط المتغيرة (variable fonts) للحصول على أفضل أداء ومرونة.
import localFont from 'next/font/local'
// يمكن وضع ملفات الخطوط داخل مجلد `pages`
const myFont = localFont({ src: './my-font.woff2' })
export default function MyApp({ Component, pageProps }) {
return (
<main className={myFont.className}>
<Component {...pageProps} />
</main>
)
}
إذا كنت ترغب في استخدام عدة ملفات لعائلة خط واحدة، يمكن أن يكون src
مصفوفة:
const roboto = localFont({
src: [
{
path: './Roboto-Regular.woff2',
weight: '400',
style: 'normal',
},
{
path: './Roboto-Italic.woff2',
weight: '400',
style: 'italic',
},
{
path: './Roboto-Bold.woff2',
weight: '700',
style: 'normal',
},
{
path: './Roboto-BoldItalic.woff2',
weight: '700',
style: 'italic',
},
],
})
راجع مرجع Font API لمزيد من المعلومات.
مع Tailwind CSS
يتكامل next/font
بسلاسة مع Tailwind CSS باستخدام متغيرات CSS.
في المثال أدناه، نستخدم خطوط Inter
و Roboto_Mono
من next/font/google
(يمكنك استخدام أي خط من Google أو خط محلي). استخدم خيار variable
لتحديد اسم متغير CSS، مثل inter
و roboto_mono
لهذه الخطوط على التوالي. ثم طبق inter.variable
و roboto_mono.variable
لتضمين متغيرات CSS في مستند HTML الخاص بك.
جيد أن تعرف: يمكنك إضافة هذه المتغيرات إلى علامة
<html>
أو<body>
، حسب تفضيلك، احتياجات التنسيق أو متطلبات المشروع.
import { Inter } from 'next/font/google'
const inter = Inter({
subsets: ['latin'],
variable: '--font-inter',
})
const roboto_mono = Roboto_Mono({
subsets: ['latin'],
display: 'swap',
variable: '--font-roboto-mono',
})
export default function MyApp({ Component, pageProps }) {
return (
<main className={`${inter.variable} ${roboto_mono.variable} font-sans`}>
<Component {...pageProps} />
</main>
)
}
أخيرًا، أضف متغير CSS إلى إعداد Tailwind CSS:
Tailwind CSS v4
بدءًا من Tailwind v4، لا يلزم أي تكوين افتراضيًا. إذا كنت بحاجة إلى تكوين Tailwind، يمكنك اتباع التوثيق الرسمي لتكوين ملف CSS العام.
@import "tailwindcss";
@theme inline {
--font-sans: var(--font-inter);
--font-mono: var(--font-roboto-mono);
}
Tailwind CSS v3
/** @type {import('tailwindcss').Config} */
module.exports = {
content: [
'./pages/**/*.{js,ts,jsx,tsx}',
'./components/**/*.{js,ts,jsx,tsx}',
'./app/**/*.{js,ts,jsx,tsx}',
],
theme: {
extend: {
fontFamily: {
sans: ['var(--font-inter)'],
mono: ['var(--font-roboto-mono)'],
},
},
},
plugins: [],
}
يمكنك الآن استخدام فئات الأداة font-sans
و font-mono
لتطبيق الخط على عناصرك.
<p class="font-sans ...">The quick brown fox ...</p>
<p class="font-mono ...">The quick brown fox ...</p>
تطبيق الأنماط
يمكنك تطبيق أنماط الخط بثلاث طرق:
className
تُرجع className
للقراءة فقط للخط المحمل لتمريرها إلى عنصر HTML.
<p className={inter.className}>Hello, Next.js!</p>
style
تُرجع كائن style
للقراءة فقط للخط المحمل لتمريرها إلى عنصر HTML، بما في ذلك style.fontFamily
للوصول إلى اسم عائلة الخط والخطوط الاحتياطية.
<p style={inter.style}>Hello World</p>
متغيرات CSS
إذا كنت ترغب في تعيين أنماطك في ورقة أنماط خارجية وتحديد خيارات إضافية هناك، استخدم طريقة متغير CSS.
بالإضافة إلى استيراد الخط، استورد أيضًا ملف CSS حيث يتم تعريف متغير CSS وعيّن خيار متغير كائن محمل الخط كما يلي:
import { Inter } from 'next/font/google'
import styles from '../styles/component.module.css'
const inter = Inter({
variable: '--font-inter',
})
import { Inter } from 'next/font/google'
import styles from '../styles/component.module.css'
const inter = Inter({
variable: '--font-inter',
})
لاستخدام الخط، عيّن className
للحاوية الأصلية للنص الذي ترغب في تنسيقه إلى قيمة variable
لمحمل الخط و className
للنص إلى خاصية styles
من ملف CSS الخارجي.
<main className={inter.variable}>
<p className={styles.text}>Hello World</p>
</main>
<main className={inter.variable}>
<p className={styles.text}>Hello World</p>
</main>
عرّف فئة المحدد text
في ملف CSS component.module.css
كما يلي:
.text {
font-family: var(--font-inter);
font-weight: 200;
font-style: italic;
}
في المثال أعلاه، يتم تنسيق النص Hello World
باستخدام خط Inter
والخط الاحتياطي المُنشأ مع font-weight: 200
و font-style: italic
.
استخدام ملف تعريفات الخطوط
في كل مرة تستدعي فيها دالة localFont
أو خط Google، سيتم استضافة هذا الخط كنسخة واحدة في تطبيقك. لذلك، إذا كنت بحاجة إلى استخدام نفس الخط في أماكن متعددة، يجب تحميله في مكان واحد واستيراد كائن الخط ذي الصلة حيثما تحتاجه. يتم ذلك باستخدام ملف تعريفات الخطوط.
على سبيل المثال، أنشئ ملف fonts.ts
في مجلد styles
في جذر دليل التطبيق الخاص بك.
ثم، حدد تعريفات الخطوط الخاصة بك كما يلي:
import { Inter, Lora, Source_Sans_3 } from 'next/font/google'
import localFont from 'next/font/local'
// تعريف الخطوط المتغيرة
const inter = Inter()
const lora = Lora()
// تعريف وزنين لخط غير متغير
const sourceCodePro400 = Source_Sans_3({ weight: '400' })
const sourceCodePro700 = Source_Sans_3({ weight: '700' })
// تعريف خط محلي مخصص حيث يتم تخزين GreatVibes-Regular.ttf في مجلد styles
const greatVibes = localFont({ src: './GreatVibes-Regular.ttf' })
export { inter, lora, sourceCodePro400, sourceCodePro700, greatVibes }
import { Inter, Lora, Source_Sans_3 } from 'next/font/google'
import localFont from 'next/font/local'
// تعريف الخطوط المتغيرة
const inter = Inter()
const lora = Lora()
// تعريف وزنين لخط غير متغير
const sourceCodePro400 = Source_Sans_3({ weight: '400' })
const sourceCodePro700 = Source_Sans_3({ weight: '700' })
// تعريف خط محلي مخصص حيث يتم تخزين GreatVibes-Regular.ttf في مجلد styles
const greatVibes = localFont({ src: './GreatVibes-Regular.ttf' })
export { inter, lora, sourceCodePro400, sourceCodePro700, greatVibes }
يمكنك الآن استخدام هذه التعريفات في الكود الخاص بك كما يلي:
import { inter, lora, sourceCodePro700, greatVibes } from '../styles/fonts'
export default function Page() {
return (
<div>
<p className={inter.className}>Hello world using Inter font</p>
<p style={lora.style}>Hello world using Lora font</p>
<p className={sourceCodePro700.className}>
Hello world using Source_Sans_3 font with weight 700
</p>
<p className={greatVibes.className}>My title in Great Vibes font</p>
</div>
)
}
import { inter, lora, sourceCodePro700, greatVibes } from '../styles/fonts'
export default function Page() {
return (
<div>
<p className={inter.className}>Hello world using Inter font</p>
<p style={lora.style}>Hello world using Lora font</p>
<p className={sourceCodePro700.className}>
Hello world using Source_Sans_3 font with weight 700
</p>
<p className={greatVibes.className}>My title in Great Vibes font</p>
</div>
)
}
لتسهيل الوصول إلى تعريفات الخطوط في الكود الخاص بك، يمكنك تعريف مسار اختصار في ملفات tsconfig.json
أو jsconfig.json
كما يلي:
{
"compilerOptions": {
"paths": {
"@/fonts": ["./styles/fonts"]
}
}
}
يمكنك الآن استيراد أي تعريف خط كما يلي:
import { greatVibes, sourceCodePro400 } from '@/fonts'
import { greatVibes, sourceCodePro400 } from '@/fonts'
التحميل المسبق
عند استدعاء دالة خط في صفحة من موقعك، لا يكون الخط متاحًا عالميًا ولا يتم تحميله مسبقًا في جميع المسارات. بدلاً من ذلك، يتم تحميل الخط مسبقًا فقط في المسارات ذات الصلة بناءً على نوع الملف الذي يتم استخدامه فيه:
- إذا كانت صفحة فريدة، يتم تحميلها مسبقًا في المسار الفريد لتلك الصفحة.
- إذا كانت في التطبيق المخصص (custom App)، يتم تحميلها مسبقًا في جميع مسارات الموقع تحت
/pages
.
تغييرات الإصدار
الإصدار | التغييرات |
---|---|
v13.2.0 | تمت إعادة تسمية @next/font إلى next/font . لم يعد التثبيت مطلوبًا. |
v13.0.0 | تمت إضافة @next/font . |