طراحی RTL با CSS
بهنام نوبخت · ۱۴۰۵/۶/۲۸
وقتی برای زبانهایی مانند فارسی یا عربی وبسایت طراحی میکنیم، تنها تغییر جهت متن از چپ به راست به راست به چپ کافی نیست. جهت صفحه روی نحوه قرارگیری متن، فاصلهها، Layout، Navigation، فرمها، آیکونها، جدولها و حتی بعضی از رفتارهای ظاهری عناصر تأثیر میگذارد.
به همین دلیل، طراحی یک سایت فارسی باید از ابتدا با در نظر گرفتن RTL یا Right-to-Left انجام شود.
در این مقاله یاد میگیریم چگونه یک Layout استاندارد راستبهچپ بسازیم، چه تفاوتی میان direction و text-align وجود دارد، چرا استفاده از ویژگیهای Logical CSS اهمیت زیادی دارد و چگونه یک صفحه واقعی فارسی مانند سایت «بنو سرویس» را به شکل اصولی RTL کنیم.
RTL چیست؟
RTL مخفف:
Right To Leftبه معنی «راست به چپ» است.
در زبان فارسی، مسیر اصلی خواندن متن از سمت راست شروع میشود و به سمت چپ ادامه پیدا میکند.
در مقابل، زبانهایی مانند انگلیسی از:
Left To Rightاستفاده میکنند.
بنابراین:
English
Hello World →اما در فارسی:
← سلام دنیاRTL فقط مربوط به متن نیست.
در یک صفحه RTL، جهت کلی Layout نیز میتواند تحت تأثیر قرار بگیرد.
تفاوت direction و text-align
این دو ویژگی بسیار مهم هستند اما کاربرد یکسانی ندارند.
direction
ویژگی direction جهت نوشتار و جریان متن را مشخص میکند.
مثلاً:
body {
direction: rtl;
}در این حالت جهت نوشتار صفحه RTL میشود.
text-align
اما text-align محل قرارگیری متن داخل فضای خودش را مشخص میکند.
مثلاً:
.title {
text-align: right;
}این کد متن را به سمت راست تراز میکند.
بنابراین:
direction
↓
جهت نوشتار و جریان متن
text-align
↓
تراز شدن محتوااین دو را نباید با یکدیگر اشتباه بگیریم.
بهترین روش برای RTL کردن صفحه
اگر کل سایت فارسی است، میتوانیم جهت را در عنصر html مشخص کنیم:
<html lang="fa" dir="rtl">این روش بسیار مناسب است، زیرا جهت صفحه را در خود HTML مشخص میکند.
مثلاً:
<!DOCTYPE html>
<html lang="fa" dir="rtl">
<head>
<meta charset="UTF-8">
<title>بنو سرویس</title>
</head>
<body>
<h1>
زیرساخت دیجیتال کسبوکار شما
</h1>
</body>
</html>در اینجا:
lang="fa"زبان سند را فارسی مشخص میکند و:
dir="rtl"جهت متن را راستبهچپ مشخص میکند.
آیا باید direction: rtl هم بنویسیم؟
اگر در HTML از:
<html dir="rtl">استفاده کردهایم، معمولاً نیازی نیست برای body دوباره:
body {
direction: rtl;
}بنویسیم.
میتوانیم جهت را در HTML مشخص کنیم:
<html lang="fa" dir="rtl">و CSS را برای سایر ویژگیهای ظاهری استفاده کنیم.
RTL و متن فارسی
فرض کنید:
<p>
بنو سرویس مجموعهای از خدمات دیجیتال
برای کسبوکارها ارائه میدهد.
</p>با:
<html lang="fa" dir="rtl">مرورگر متن را با جهت مناسب نمایش میدهد.
اما اگر لازم باشد تراز متن را نیز کنترل کنیم:
p {
text-align: right;
}یا برای متن وسط:
p {
text-align: center;
}یک اشتباه رایج
بعضی توسعهدهندگان برای تمام عناصر سایت مینویسند:
* {
text-align: right;
}این کار معمولاً مناسب نیست.
چون بعضی عناصر ممکن است نیاز به:
text-align: center;یا حتی:
text-align: left;داشته باشند.
بهتر است Alignment را بر اساس نقش هر عنصر تعیین کنیم.
RTL و Flexbox
Flexbox یکی از مهمترین ابزارهای Layout در طراحی RTL است.
مثلاً:
<div class="header">
<div class="logo">
بنو سرویس
</div>
<nav>
<a href="#">خانه</a>
<a href="#">خدمات</a>
<a href="#">محصولات</a>
</nav>
</div>CSS:
.header {
display: flex;
align-items: center;
justify-content: space-between;
}وقتی Container در یک محیط RTL قرار دارد، جهت نوشتار و جریان Flex میتواند روی ترتیب نمایش آیتمها تأثیر بگذارد.
اما یک نکته مهم وجود دارد:
جهت Layout را نباید صرفاً با حدس کنترل کنیم.
اگر ترتیب دقیق برای یک Component اهمیت دارد، باید آن را بهصورت واضح طراحی کنیم.
row-reverse چیست؟
Flexbox دارای ویژگی:
flex-direction: row-reverse;است.
این ویژگی ترتیب محور اصلی Flex را معکوس میکند.
مثلاً:
.navigation {
display: flex;
flex-direction: row-reverse;
}اما در سایتهای RTL نباید صرفاً برای «RTL کردن» از row-reverse استفاده کنیم.
RTL و row-reverse یک مفهوم نیستند.
direction مربوط به جهت نوشتار و جریان Inline است، در حالی که flex-direction جهت محور Flex را کنترل میکند.
استفاده از ویژگیهای Logical CSS
یکی از مهمترین موضوعات در طراحی مدرن RTL، استفاده از Logical Properties است.
در CSS سنتی ممکن است بنویسیم:
margin-left: 20px;
margin-right: 20px;اما این ویژگیها به سمت فیزیکی صفحه اشاره میکنند.
در CSS مدرن میتوانیم از:
margin-inline: 20px;استفاده کنیم.
این روش برای Layoutهای LTR و RTL انعطافپذیرتر است.
ویژگیهای Physical و Logical
مثلاً:
margin-leftیک ویژگی Physical است.
در مقابل:
margin-inline-startیک ویژگی Logical است.
برخی نمونههای مهم:
Physical | Logical |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ویژگیهای Logical باعث میشوند CSS بهتر بتواند با جهتهای مختلف نوشتار سازگار شود.
margin-inline
به جای:
.card {
margin-left: 20px;
margin-right: 20px;
}میتوانیم بنویسیم:
.card {
margin-inline: 20px;
}اگر فقط ابتدای Inline را بخواهیم:
.card {
margin-inline-start: 20px;
}و انتها:
.card {
margin-inline-end: 20px;
}padding-inline
مثلاً:
.button {
padding-inline: 24px;
}یعنی Padding در دو سمت Inline اعمال شود.
این روش برای Componentهایی که در RTL و LTR استفاده میشوند بسیار مناسب است.
padding-block
برای محور عمودی میتوانیم از:
padding-block: 20px;استفاده کنیم.
مثلاً:
.section {
padding-block: 60px;
padding-inline: 20px;
}این CSS بسیار خواناتر از مجموعهای از padding-top، padding-bottom، padding-left و padding-right است.
Inline و Block چیست؟
برای درک Logical Properties باید دو مفهوم را بشناسیم.
Inline Axis
محور Inline معمولاً همان جهت جریان متن است.
در یک صفحه LTR:
Left → Rightو در RTL:
Right → LeftBlock Axis
محور Block معمولاً جهت قرارگیری خطوط و بلوکها است:
Top
↓
Bottomبنابراین:
Inline
=
جهت جریان متن
Block
=
جهت عمودی Layoutmargin-inline: auto
یکی از کاربردیترین مثالها:
.container {
max-width: 1200px;
margin-inline: auto;
}این روش Container را در مرکز قرار میدهد.
مزیت آن این است که نیازی نداریم بنویسیم:
margin-left: auto;
margin-right: auto;text-align: start و end
در طراحی RTL بهتر است در بسیاری از موارد به جای:
text-align: left;از:
text-align: start;استفاده کنیم.
و به جای:
text-align: right;میتوانیم از:
text-align: end;استفاده کنیم.
مثلاً:
.title {
text-align: start;
}در محیط RTL، start معمولاً به سمت شروع جریان متن اشاره میکند.
در محیط LTR، همان قانون میتواند رفتار متفاوتی داشته باشد.
این موضوع برای Componentهای چندزبانه بسیار مفید است.
مثال عملی
فرض کنید یک Card داریم:
<article class="card">
<span class="card-category">
خدمات
</span>
<h3>
طراحی سایت
</h3>
<p>
طراحی سایتهای مدرن و Responsive
برای کسبوکار شما.
</p>
<a href="#">
مشاهده خدمات
</a>
</article>CSS:
.card {
padding: 24px;
border: 1px solid #ddd;
border-radius: 16px;
text-align: start;
}
.card-category {
margin-block-end: 12px;
}
.card h3 {
margin-block: 0 12px;
}
.card p {
margin-block-end: 20px;
line-height: 2;
}
.card a {
display: inline-flex;
padding-inline: 20px;
min-block-size: 44px;
align-items: center;
}این CSS بدون استفاده زیاد از ویژگیهای چپ و راست نوشته شده است.
RTL در Grid
CSS Grid نیز در صفحات RTL بسیار کاربردی است.
مثلاً:
.services {
display: grid;
grid-template-columns:
repeat(3, 1fr);
gap: 24px;
}اگر صفحه RTL باشد، ترتیب Inline Layout نیز باید با طراحی موردنظر هماهنگ باشد.
اما بهتر است به جای وابستگی به موقعیت فیزیکی «چپ» و «راست»، ساختار Grid را بر اساس نقش محتوا طراحی کنیم.
RTL و gap
ویژگی:
gapبرای فاصله بین آیتمها بسیار مناسب است:
.navigation {
display: flex;
gap: 24px;
}مزیت آن این است که دیگر مجبور نیستیم برای هر آیتم بنویسیم:
margin-left: 24px;یا:
margin-right: 24px;در نتیجه CSS سادهتر و مستقلتر از جهت صفحه میشود.
RTL در Header
یک Header فارسی میتواند چنین ساختاری داشته باشد:
<header class="site-header">
<div class="container header-inner">
<a href="#" class="logo">
بنو سرویس
</a>
<nav class="navigation">
<a href="#">خانه</a>
<a href="#">خدمات</a>
<a href="#">محصولات</a>
<a href="#">آموزش</a>
<a href="#">تماس با ما</a>
</nav>
<a href="#" class="header-button">
ورود
</a>
</div>
</header>CSS:
.header-inner {
min-block-size: 72px;
display: flex;
align-items: center;
justify-content: space-between;
gap: 24px;
}
.navigation {
display: flex;
align-items: center;
gap: 24px;
}
.header-button {
padding-inline: 20px;
min-block-size: 44px;
display: inline-flex;
align-items: center;
justify-content: center;
}تقریباً هیچ وابستگی مستقیمی به left یا right نداریم.
RTL در فرمها
فرمها یکی از قسمتهایی هستند که در سایت فارسی باید با دقت طراحی شوند.
مثلاً:
<form class="form">
<label for="name">
نام
</label>
<input
id="name"
type="text"
placeholder="نام خود را وارد کنید"
>
<label for="email">
ایمیل
</label>
<input
id="email"
type="email"
placeholder="ایمیل خود را وارد کنید"
>
<button type="submit">
ارسال
</button>
</form>CSS:
.form {
display: grid;
gap: 16px;
}
.form label {
text-align: start;
}
.form input {
min-block-size: 48px;
padding-inline: 16px;
border: 1px solid #ccc;
border-radius: 10px;
}فارسی و ورودیهای انگلیسی
یک نکته مهم این است که همه Inputها نباید الزاماً RTL باشند.
مثلاً:
نام کاربریممکن است فارسی یا انگلیسی باشد.
اما:
Email
URL
کد
شماره کارتممکن است نیاز به رفتار متفاوتی داشته باشند.
برای مثال:
input[type="email"] {
direction: ltr;
}البته باید این کار را بر اساس نوع داده و تجربه کاربری واقعی انجام داد، نه بهصورت کورکورانه برای تمام Inputها.
اعداد در صفحات فارسی
در سایتهای فارسی ممکن است اعداد به دو شکل نمایش داده شوند:
123456یا:
۱۲۳۴۵۶این موضوع یک بحث Typography و Localization نیز محسوب میشود و نباید صرفاً با direction حل شود.
برای اطلاعاتی مانند:
شماره تماس
کد سفارش
شماره پیگیری
کد تخفیفگاهی نمایش LTR برای جلوگیری از ابهام مناسبتر است.
مثلاً:
.tracking-code {
direction: ltr;
unicode-bidi: isolate;
}هدف این است که رشتههایی مانند کدها و شناسهها ترتیب خواندن قابل پیشبینی داشته باشند.
unicode-bidi چیست؟
CSS ویژگیهایی برای کنترل نحوه رفتار متن دوطرفه دارد.
یکی از آنها:
unicode-bidiاست.
در صفحات فارسی و ترکیب متن فارسی با انگلیسی، اعداد، URLها و کدها، الگوریتم Bidirectional Text مرورگر ممکن است باعث شود ترتیب ظاهری برخی رشتهها با چیزی که انتظار داریم متفاوت شود.
برای نمونه:
.code {
direction: ltr;
unicode-bidi: isolate;
}میتواند برای جدا نگه داشتن یک رشته از جریان متن اطراف آن مفید باشد.
RTL و آیکونها
یکی از اشتباهات رایج در طراحی RTL این است که تمام آیکونها را نیز برعکس کنیم.
اما همه آیکونها جهتدار نیستند.
مثلاً:
Home
Search
Settingsمعمولاً نیاز به چرخش ندارند.
اما آیکونهایی مانند:
Arrow Right
Arrow Left
Back
Forwardممکن است بر اساس جهت صفحه نیاز به تغییر داشته باشند.
مثلاً یک فلش «ادامه» در RTL میتواند از نظر بصری به سمت چپ حرکت کند.
بنابراین باید مفهوم آیکون را در نظر بگیریم، نه فقط نام آن را.
استفاده از transform برای آیکون
فرض کنید یک آیکون فلش داریم:
<span class="arrow">
→
</span>میتوانیم در RTL آن را تغییر دهیم:
[dir="rtl"] .arrow {
transform: scaleX(-1);
}اما این روش فقط زمانی مناسب است که واقعاً معنای آیکون با جهت صفحه تغییر کند.
استفاده از Selectors بر اساس جهت
میتوانیم مستقیماً از Attribute Selector استفاده کنیم:
[dir="rtl"] .icon {
...
}و برای LTR:
[dir="ltr"] .icon {
...
}این روش برای Componentهای چندزبانه بسیار مفید است.
طراحی RTL با Logical Properties
یکی از بهترین روشها این است که از ابتدا CSS را تا حد امکان Logical بنویسیم.
مثلاً به جای:
.card {
margin-left: 24px;
padding-right: 20px;
border-left: 1px solid #ddd;
}میتوانیم از:
.card {
margin-inline-start: 24px;
padding-inline-end: 20px;
border-inline-start: 1px solid #ddd;
}استفاده کنیم.
در این صورت CSS به جای اینکه بگوید:
سمت چپ
میگوید:
ابتدای محور Inline
و این تفاوت بسیار مهم است.
طراحی چند زبانه
فرض کنید سایت شما هم فارسی و هم انگلیسی دارد.
میتوانیم داشته باشیم:
<html lang="fa" dir="rtl">برای فارسی:
<html lang="en" dir="ltr">برای انگلیسی.
اگر CSS را با Logical Properties نوشته باشیم، مقدار زیادی از CSS بین این دو زبان مشترک باقی میماند.
مثلاً:
.card {
padding-inline: 24px;
margin-inline: auto;
text-align: start;
}این یکی از دلایل مهم استفاده از Logical CSS است.
یک Container حرفهای RTL
.container {
width: min(
calc(100% - 32px),
1200px
);
margin-inline: auto;
}و برای Section:
.section {
padding-block: clamp(
48px,
8vw,
120px
);
padding-inline: 16px;
}این ساختار:
Responsive است.
RTL و LTR را بهتر پشتیبانی میکند.
به
leftوrightوابستگی کمی دارد.قابل استفاده در پروژههای مختلف است.
یک صفحه کامل RTL برای بنو سرویس
حالا یک نمونه کوچک اما واقعی ایجاد کنیم.
HTML
<!DOCTYPE html>
<html lang="fa" dir="rtl">
<head>
<meta charset="UTF-8">
<meta
name="viewport"
content="width=device-width, initial-scale=1.0"
>
<title>
بنو سرویس
</title>
<link
rel="stylesheet"
href="style.css"
>
</head>
<body>
<header class="site-header">
<div class="container header-inner">
<a href="#" class="logo">
بنو سرویس
</a>
<nav class="navigation">
<a href="#">
خانه
</a>
<a href="#">
خدمات
</a>
<a href="#">
محصولات
</a>
<a href="#">
آموزش
</a>
<a href="#">
تماس با ما
</a>
</nav>
<a href="#" class="login-button">
ورود
</a>
</div>
</header>
<main>
<section class="hero">
<div class="container hero-content">
<div class="hero-text">
<span>
بنو سرویس
</span>
<h1>
زیرساخت دیجیتال
کسبوکار شما
</h1>
<p>
مجموعهای از محصولات و خدمات
دیجیتال برای رشد و توسعه کسبوکار شما.
</p>
<div class="hero-actions">
<a href="#">
مشاهده خدمات
</a>
<a href="#">
مشاهده محصولات
</a>
</div>
</div>
<div class="hero-image">
<img
src="images/hero.webp"
alt="خدمات دیجیتال بنو سرویس"
>
</div>
</div>
</section>
<section class="services">
<div class="container">
<div class="section-heading">
<span>
خدمات
</span>
<h2>
راهکارهای دیجیتال
برای کسبوکار شما
</h2>
</div>
<div class="service-grid">
<article class="service-card">
<h3>
طراحی سایت
</h3>
<p>
طراحی وبسایتهای مدرن،
سریع و Responsive.
</p>
<a href="#">
بیشتر بدانید
</a>
</article>
<article class="service-card">
<h3>
بهینهسازی موتور جستجو
</h3>
<p>
بهبود ساختار و عملکرد سایت
برای حضور بهتر در موتورهای جستجو.
</p>
<a href="#">
بیشتر بدانید
</a>
</article>
<article class="service-card">
<h3>
طراحی ربات تلگرامی
</h3>
<p>
طراحی و توسعه رباتهای
کاربردی برای کسبوکارها.
</p>
<a href="#">
بیشتر بدانید
</a>
</article>
</div>
</div>
</section>
</main>
<footer class="footer">
<div class="container">
<p>
تمامی حقوق محفوظ است.
</p>
</div>
</footer>
</body>
</html>CSS صفحه
* {
box-sizing: border-box;
}
html {
scroll-behavior: smooth;
}
body {
margin: 0;
font-family: sans-serif;
line-height: 1.7;
}
img {
display: block;
max-width: 100%;
height: auto;
}
a {
color: inherit;
text-decoration: none;
}
.container {
width: min(
calc(100% - 32px),
1200px
);
margin-inline: auto;
}
.site-header {
border-block-end: 1px solid #eee;
}
.header-inner {
min-block-size: 72px;
display: flex;
align-items: center;
justify-content: space-between;
gap: 24px;
}
.navigation {
display: flex;
align-items: center;
gap: 24px;
}
.login-button {
min-block-size: 44px;
padding-inline: 20px;
display: inline-flex;
align-items: center;
justify-content: center;
border-radius: 10px;
}
.hero {
padding-block:
clamp(60px, 10vw, 140px);
}
.hero-content {
display: grid;
gap: 48px;
align-items: center;
}
.hero-text h1 {
margin-block: 16px;
font-size:
clamp(2.2rem, 6vw, 4.5rem);
line-height: 1.25;
}
.hero-text p {
max-inline-size: 65ch;
line-height: 2;
}
.hero-actions {
display: flex;
flex-wrap: wrap;
gap: 12px;
margin-block-start: 28px;
}
.hero-actions a {
min-block-size: 48px;
padding-inline: 20px;
display: inline-flex;
align-items: center;
justify-content: center;
border-radius: 10px;
}
.services {
padding-block:
clamp(60px, 8vw, 120px);
}
.section-heading {
margin-block-end: 40px;
}
.section-heading h2 {
font-size:
clamp(2rem, 5vw, 3.5rem);
}
.service-grid {
display: grid;
grid-template-columns: 1fr;
gap: 20px;
}
.service-card {
padding: 28px;
border: 1px solid #ddd;
border-radius: 20px;
}
.service-card p {
line-height: 2;
}
.service-card a {
display: inline-flex;
min-block-size: 44px;
padding-inline: 18px;
align-items: center;
}
.footer {
padding-block: 40px;
border-block-start: 1px solid #eee;
}
@media (width >= 768px) {
.service-grid {
grid-template-columns:
repeat(2, 1fr);
}
}
@media (width >= 1000px) {
.hero-content {
grid-template-columns:
1fr 1fr;
}
.service-grid {
grid-template-columns:
repeat(3, 1fr);
}
}این نمونه تقریباً تمام مفاهیم اصلی این مقاله را در یک پروژه کوچک ترکیب میکند.
RTL و Responsive Design
یکی از مزیتهای مهم Logical Properties این است که RTL و Responsive Design را میتوانیم همزمان مدیریت کنیم.
مثلاً:
.container {
width: min(
calc(100% - 32px),
1200px
);
margin-inline: auto;
}یا:
.section {
padding-block:
clamp(48px, 8vw, 120px);
padding-inline: 16px;
}در اینجا نه به left نیاز داریم و نه به right.
RTL و Media Query
Media Query همچنان همان منطق را دارد:
@media (width >= 768px) {
.layout {
grid-template-columns:
repeat(2, 1fr);
}
}RTL بودن صفحه باعث نمیشود Media Query متفاوت شود.
Media Query اندازه و ویژگیهای محیط را کنترل میکند و direction جهت نوشتار را.
RTL و Position
در CSS قدیمی ممکن است بنویسیم:
.badge {
position: absolute;
right: 20px;
top: 20px;
}اگر هدف ما «ابتدای محور Inline» باشد، بهتر است در بسیاری از موارد از Logical Properties استفاده کنیم:
.badge {
position: absolute;
inset-block-start: 20px;
inset-inline-start: 20px;
}این روش در Layoutهای چندجهته بسیار انعطافپذیرتر است.
inset و Logical Positioning
ویژگیهای Logical برای Position نیز وجود دارند.
مثلاً:
.element {
inset-inline-start: 20px;
inset-block-start: 10px;
}در یک محیط RTL، inline-start به سمت شروع جریان Inline اشاره میکند.
این روش برای Componentهایی که در زبانهای مختلف استفاده میشوند بسیار مفید است.
جدولها در RTL
جدولها نیز باید با دقت طراحی شوند.
مثلاً:
<table dir="rtl">
<thead>
<tr>
<th>محصول</th>
<th>قیمت</th>
<th>وضعیت</th>
</tr>
</thead>
<tbody>
<tr>
<td>فروشگاه ساز</td>
<td>...</td>
<td>فعال</td>
</tr>
</tbody>
</table>اما برای جدولهای بزرگ در موبایل، ممکن است نیاز به Scroll افقی کنترلشده یا یک طراحی جایگزین داشته باشیم.
نباید صرفاً برای جلوگیری از Scroll، اطلاعات جدول را حذف کنیم.
RTL در Footer
Footer نیز باید بر اساس ساختار محتوا طراحی شود.
مثلاً:
.footer-grid {
display: grid;
grid-template-columns: 1fr;
gap: 32px;
}
@media (width >= 768px) {
.footer-grid {
grid-template-columns:
repeat(3, 1fr);
}
}بهتر است به جای استفاده زیاد از:
margin-left
margin-rightاز:
gap
margin-inline
padding-inlineاستفاده کنیم.
اشتباهات رایج در طراحی RTL
۱. فقط text-align: right
RTL کردن سایت فقط این نیست:
body {
text-align: right;
}این کار جهت صفحه را بهدرستی مدیریت نمیکند.
بهتر است جهت در HTML مشخص شود:
<html lang="fa" dir="rtl">
۲. استفاده بیش از حد از left و right
مثلاً:
margin-left: 20px;
padding-right: 30px;
right: 10px;اگر پروژه فقط فارسی باشد شاید در کوتاهمدت مشکلی ایجاد نکند، اما برای CSS قابل توسعه و چندزبانه بهتر است از Logical Properties استفاده شود.
۳. استفاده اشتباه از row-reverse
این کد:
display: flex;
flex-direction: row-reverse;راهکار عمومی برای RTL نیست.
باید ابتدا مشخص کنیم آیا واقعاً قصد تغییر ترتیب Flex را داریم یا فقط میخواهیم صفحه RTL باشد.
۴. برعکس کردن همه آیکونها
همه آیکونها Directional نیستند.
فقط آیکونهایی که مفهوم جهت دارند باید بر اساس معنای UI بررسی شوند.
۵. RTL کردن همه Inputها
مثلاً:
input {
direction: rtl;
}ممکن است برای Email، URL، کدها و برخی دادههای انگلیسی تجربه کاربری مناسبی ایجاد نکند.
۶. نادیده گرفتن متن فارسی در Responsive
متن فارسی ممکن است به دلیل طول کلمات، نیمفاصله و ترکیب فارسی و انگلیسی در عرضهای مختلف رفتار متفاوتی داشته باشد.
بنابراین Responsive Design باید با محتوای واقعی فارسی نیز تست شود.
تمرینهای مقاله
تمرین ۱ — صفحه RTL
یک صفحه ساده فارسی ایجاد کنید و:
<html lang="fa" dir="rtl">را به آن اضافه کنید.
تمرین ۲ — Container
یک Container ایجاد کنید که:
حداکثر عرض 1200px داشته باشد.
در مرکز قرار بگیرد.
در موبایل Padding مناسب داشته باشد.
راهنمایی:
.container {
width: min(
calc(100% - 32px),
1200px
);
margin-inline: auto;
}تمرین ۳ — تبدیل Physical به Logical
CSS زیر را:
.card {
margin-left: 20px;
margin-right: 30px;
padding-left: 24px;
padding-right: 16px;
}به Logical Properties تبدیل کنید.
تمرین ۴ — Header
یک Header فارسی ایجاد کنید که:
Logo داشته باشد.
Navigation داشته باشد.
دکمه ورود داشته باشد.
در موبایل Responsive شود.
تمرین ۵ — فرم فارسی
یک فرم ثبتنام ایجاد کنید که شامل:
نام
نام خانوادگی
ایمیل
شماره موبایل
رمز عبور
دکمه ثبتنامباشد.
سپس رفتار RTL هر Input را بررسی کنید.
جمعبندی
طراحی RTL چیزی بیشتر از قرار دادن متن در سمت راست صفحه است.
برای یک سایت فارسی حرفهای باید همزمان به موارد زیر توجه کنیم:
HTML Direction
↓
Typography
↓
Layout
↓
Flexbox / Grid
↓
Logical Properties
↓
Responsive Design
↓
Forms
↓
Icons
↓
Accessibilityیکی از مهمترین عادتهایی که باید از همین حالا در CSS ایجاد کنیم، استفاده از ویژگیهای Logical است.
به جای اینکه همیشه فکر کنیم:
left
right
top
bottomبهتر است در بسیاری از موارد به این شکل فکر کنیم:
inline-start
inline-end
block-start
block-endبرای مثال:
.card {
padding-inline: 24px;
padding-block: 20px;
margin-inline: auto;
text-align: start;
}این نوع CSS نهتنها برای فارسی مناسب است، بلکه در پروژههای چندزبانه و Layoutهای مدرن نیز انعطاف بسیار بیشتری دارد.
در ادامه دوره، پس از یادگیری RTL، به سراغ یکی دیگر از بخشهای بسیار مهم طراحی سایت فارسی میرویم: فونتهای فارسی در وب.
نظرات
هنوز نظری ثبت نشده است.