Table of Contents
▼- Apa Itu CSS Writing Mode dan Kapan Menggunakannya
- Implementasi Layout Horizontal RTL untuk Komunitas Arab
- Implementasi Layout Vertikal untuk Konten Tionghoa
- Case Study Website untuk Komunitas Arab dan Tionghoa di Indonesia
- Fallback dan Browser Compatibility untuk Writing Mode
- Best Practice Kombinasi dengan Flexbox dan Grid
- Performance dan Accessibility Considerations
- Tips Debugging Writing Mode Issues
Website yang melayani komunitas multibahasa di Indonesia bukan sekadar soal menerjemahkan teks. Layout, arah baca, dan orientasi konten harus disesuaikan dengan karakteristik bahasa yang digunakan.
CSS writing-mode adalah properti yang memungkinkan developer mengatur arah aliran teks dan layout secara native tanpa JavaScript tambahan. Properti ini sangat krusial untuk website yang menargetkan komunitas Arab (Right-to-Left), Tionghoa tradisional (vertikal), atau bahasa lain dengan arah baca berbeda.
Di Indonesia, banyak website komunitas, media, dan platform e-commerce yang perlu mendukung layout multibahasa untuk melayani diaspora, komunitas keagamaan, atau pasar ekspor. Artikel ini memberikan panduan praktis implementasi CSS writing-mode dengan case study nyata di Indonesia.
Apa Itu CSS Writing Mode dan Kapan Menggunakannya
CSS writing-mode adalah properti yang mengontrol orientasi dan arah aliran konten pada halaman web.
Properti ini mengubah cara browser merender layout dari model horizontal-left-to-right default menjadi berbagai variasi seperti right-to-left atau vertical.
Ada tiga nilai utama writing-mode yang perlu dipahami:
horizontal-tb: Mode default, teks mengalir horizontal dari kiri ke kanan, baris baru turun ke bawah (top to bottom).
vertical-rl: Teks mengalir vertikal dari atas ke bawah, kolom baru ditambahkan dari kanan ke kiri (right to left). Mode ini digunakan untuk bahasa Mandarin tradisional, Jepang, dan Korea.
vertical-lr: Teks mengalir vertikal dari atas ke bawah, kolom baru ditambahkan dari kiri ke kanan (left to right). Mode ini jarang digunakan dalam bahasa natural, lebih sering untuk efek desain.
Kapan writing-mode perlu digunakan? Pertama, saat membangun website untuk komunitas Arab, Ibrani, atau bahasa RTL lainnya yang populer di Indonesia seperti di masjid, pesantren, atau organisasi keagamaan.
Kedua, saat membuat konten editorial atau galeri untuk komunitas Tionghoa yang lebih suka layout vertikal tradisional.
Ketiga, saat membuat desain kreatif dengan orientasi teks yang tidak konvensional untuk header, sidebar, atau elemen dekoratif.
Implementasi Layout Horizontal RTL untuk Komunitas Arab
Layout Right-to-Left (RTL) adalah kebutuhan dasar untuk website berbahasa Arab di Indonesia.
Meskipun writing-mode bisa digunakan, untuk RTL lebih disarankan menggunakan atribut HTML dir dan properti CSS direction.
Berikut implementasi dasar RTL:
<!DOCTYPE html>
<html lang="ar" dir="rtl">
<head>
<meta charset="UTF-8">
<title>موقع المجتمع الإسلامي</title>
<style>
body {
font-family: 'Scheherazade', 'Amiri', 'Traditional Arabic', serif;
direction: rtl;
text-align: right;
}
.container {
max-width: 1200px;
margin: 0 auto;
padding: 0 20px;
}
.navigation {
display: flex;
list-style: none;
padding: 0;
}
.navigation li {
margin-left: 20px; /* margin-left karena RTL */
margin-right: 0;
}
.card {
float: right; /* float right untuk RTL */
margin-left: 20px;
}
</style>
</head>
<body>
<div class="container">
<nav>
<ul class="navigation">
<li><a href="#">الرئيسية</a></li>
<li><a href="#">الأخبار</a></li>
<li><a href="#">الفعاليات</a></li>
</ul>
</nav>
</div>
</body>
</html>
Perhatikan beberapa poin penting dalam implementasi RTL:
Gunakan dir="rtl" pada tag HTML untuk memberikan instruksi global ke browser. Ini akan membalik banyak elemen otomatis seperti scrollbar, form input, dan table.
Properti direction: rtl di CSS memberikan kontrol yang lebih spesifik pada elemen tertentu.
Margin dan padding perlu dibalik: yang biasanya margin-right menjadi margin-left dan sebaliknya.
Float juga terbalik: float: right untuk elemen yang seharusnya di kiri dalam konteks RTL.
Untuk membuat website yang support switching antara LTR dan RTL, gunakan logical properties:
.card {
margin-inline-start: 20px; /* otomatis menjadi margin-right di LTR, margin-left di RTL */
padding-inline-end: 15px; /* otomatis menjadi padding-right di LTR, padding-left di RTL */
}
.sidebar {
border-inline-start: 3px solid #333; /* border-left di LTR, border-right di RTL */
}
Logical properties seperti inline-start, inline-end, block-start, dan block-end secara otomatis menyesuaikan dengan direction yang aktif.
Ini membuat kode lebih maintainable karena tidak perlu menulis style terpisah untuk LTR dan RTL.
Implementasi Layout Vertikal untuk Konten Tionghoa
Layout vertikal dengan writing-mode: vertical-rl sangat cocok untuk konten tradisional Tionghoa, terutama untuk website budaya, galeri seni kaligrafi, atau platform sastra.
Di Indonesia, komunitas Tionghoa masih menghargai layout vertikal untuk konten editorial tertentu.
Berikut implementasi dasar layout vertikal:
<!DOCTYPE html>
<html lang="zh-Hant">
<head>
<meta charset="UTF-8">
<title>传统中文文学平台</title>
<style>
body {
font-family: 'Noto Serif TC', 'Source Han Serif', serif;
margin: 0;
padding: 20px;
background: #f5f5dc;
}
.vertical-container {
writing-mode: vertical-rl;
text-orientation: upright;
max-height: 80vh;
overflow-x: auto;
padding: 40px;
background: white;
border: 2px solid #8b4513;
}
.vertical-container h1 {
font-size: 2em;
margin-block-end: 30px; /* margin vertikal dalam konteks vertical */
}
.vertical-container p {
line-height: 2.5em; /* jarak antar kolom */
margin-block-end: 40px;
}
/* Tombol toggle untuk switch horizontal-vertical */
.toggle-mode {
position: fixed;
top: 20px;
left: 20px;
padding: 10px 20px;
background: #8b4513;
color: white;
border: none;
cursor: pointer;
z-index: 1000;
}
.horizontal-mode {
writing-mode: horizontal-tb;
max-height: none;
overflow-x: visible;
}
</style>
</head>
<body>
<button class="toggle-mode" onclick="toggleWritingMode()">切換模式</button>
<article class="vertical-container" id="article">
<h1>古典詩詞</h1>
<p>
春眠不覺曉,處處聞啼鳥。<br>
夜來風雨聲,花落知多少。
</p>
<p>
床前明月光,疑是地上霜。<br>
舉頭望明月,低頭思故鄉。
</p>
</article>
<script>
function toggleWritingMode() {
const article = document.getElementById('article');
article.classList.toggle('horizontal-mode');
}
</script>
</body>
</html>
Properti text-orientation: upright sangat penting untuk karakter Tionghoa agar tidak dirotasi dalam mode vertikal.
Tanpa properti ini, karakter akan terlihat miring atau terbalik.
Perhatikan penggunaan line-height yang lebih besar pada mode vertikal. Dalam konteks vertical writing, line-height mengontrol jarak antar kolom, bukan jarak antar baris.
Property margin-block-end adalah logical property yang otomatis menyesuaikan apakah margin diberikan di bottom (horizontal mode) atau di left (vertical-rl mode).
Untuk membuat mixed content dengan sebagian teks horizontal dalam layout vertikal:
.vertical-container .latin-text {
writing-mode: horizontal-tb;
text-orientation: mixed;
display: inline-block;
}
.vertical-container .quote {
border-inline-start: 3px solid #8b4513; /* border kiri dalam vertical context */
padding-inline-start: 20px;
margin-block: 20px;
}
Elemen dengan writing-mode: horizontal-tb dalam parent yang vertical-rl akan dirender secara horizontal, berguna untuk nama Latin, angka, atau kutipan dalam bahasa lain.
Case Study Website untuk Komunitas Arab dan Tionghoa di Indonesia
Mari kita lihat implementasi nyata website yang support multibahasa dengan writing-mode yang berbeda.
Case 1: Platform Pembelajaran Bahasa Arab Online
Sebuah startup edutech di Jakarta membuat platform pembelajaran bahasa Arab untuk santri dan mahasiswa. Mereka perlu interface yang bisa switch antara bahasa Indonesia (LTR) dan Arab (RTL).
/* Base styles dengan logical properties */
:root {
--spacing-small: 8px;
--spacing-medium: 16px;
--spacing-large: 24px;
}
* {
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
margin: 0;
padding: 0;
}
body[dir="rtl"] {
font-family: 'Amiri', 'Traditional Arabic', serif;
}
.container {
max-width: 1200px;
margin-inline: auto; /* horizontal center otomatis LTR/RTL */
padding-inline: var(--spacing-large);
}
.lesson-card {
display: grid;
grid-template-columns: 200px 1fr;
gap: var(--spacing-medium);
padding: var(--spacing-medium);
margin-block-end: var(--spacing-medium);
border: 1px solid #ddd;
border-radius: 8px;
}
.lesson-card__image {
width: 100%;
height: auto;
border-radius: 4px;
}
.lesson-card__content {
text-align: start; /* start otomatis left di LTR, right di RTL */
}
.lesson-card__title {
margin-block-start: 0;
margin-block-end: var(--spacing-small);
}
.btn-primary {
padding-block: var(--spacing-small);
padding-inline: var(--spacing-medium);
background: #2ecc71;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
}
/* Language switcher */
.language-switcher {
position: fixed;
inset-block-start: 20px; /* top di horizontal, right di vertical */
inset-inline-end: 20px; /* right di LTR, left di RTL */
z-index: 1000;
}
JavaScript untuk toggle language:
const languageSwitcher = document.getElementById('lang-switcher');
const htmlElement = document.documentElement;
languageSwitcher.addEventListener('change', (e) => {
const selectedLang = e.target.value;
if (selectedLang === 'ar') {
htmlElement.setAttribute('dir', 'rtl');
htmlElement.setAttribute('lang', 'ar');
} else {
htmlElement.setAttribute('dir', 'ltr');
htmlElement.setAttribute('lang', 'id');
}
// Fetch konten sesuai bahasa
loadContent(selectedLang);
});
Dengan pendekatan ini, layout otomatis menyesuaikan tanpa perlu menulis CSS terpisah untuk setiap direction.
Case 2: Galeri Kaligrafi Tionghoa Digital
Museum seni di Surabaya membuat galeri online untuk koleksi kaligrafi Tionghoa mereka. Pengunjung bisa melihat karya dalam layout vertikal tradisional atau horizontal modern.
<div class="gallery-container">
<div class="gallery-controls">
<button onclick="setLayout('vertical')">垂直布局</button>
<button onclick="setLayout('horizontal')">水平布局</button>
</div>
<div class="artwork-display" id="artwork" data-layout="vertical">
<div class="artwork-title">
<h1>蘭亭集序</h1>
<p class="artist">王羲之</p>
</div>
<div class="artwork-content">
<p>永和九年,歲在癸丑,暮春之初,會於會稽山陰之蘭亭,修禊事也。</p>
<p>群賢畢至,少長咸集。此地有崇山峻嶺,茂林修竹;</p>
</div>
</div>
</div>
.artwork-display[data-layout="vertical"] {
writing-mode: vertical-rl;
text-orientation: upright;
height: 80vh;
overflow-x: auto;
overflow-y: hidden;
}
.artwork-display[data-layout="horizontal"] {
writing-mode: horizontal-tb;
max-width: 800px;
margin-inline: auto;
}
.artwork-title {
margin-inline-end: 40px; /* right di vertical, bottom di horizontal */
}
.artwork-content p {
line-height: 2.5em; /* kolom spacing di vertical */
margin-inline-end: 30px;
font-size: 1.2em;
}
/* Responsive: di mobile paksa horizontal */
@media (max-width: 768px) {
.artwork-display[data-layout="vertical"] {
writing-mode: horizontal-tb;
height: auto;
overflow-x: visible;
}
.artwork-content p {
line-height: 1.8em;
}
}
JavaScript untuk toggle layout:
function setLayout(mode) {
const artwork = document.getElementById('artwork');
artwork.setAttribute('data-layout', mode);
// Simpan preferensi user
localStorage.setItem('preferred-layout', mode);
}
// Load preferensi saat page load
window.addEventListener('DOMContentLoaded', () => {
const savedLayout = localStorage.getItem('preferred-layout') || 'vertical';
setLayout(savedLayout);
});
Implementasi ini memberikan fleksibilitas kepada user untuk memilih cara baca yang paling nyaman sambil tetap menghormati tradisi kaligrafi vertikal.
Fallback dan Browser Compatibility untuk Writing Mode
CSS writing-mode didukung dengan baik di browser modern, tapi tetap perlu strategi fallback untuk browser lama atau edge cases.
Support browser untuk writing-mode saat ini:
- Chrome/Edge: Full support sejak versi 48
- Firefox: Full support sejak versi 43
- Safari: Full support sejak versi 10.1
- Opera: Full support sejak versi 35
Untuk browser lama yang tidak support writing-mode, gunakan feature detection:
/* Default fallback */
.vertical-text {
writing-mode: horizontal-tb;
transform: rotate(-90deg);
transform-origin: left bottom;
}
/* Modern browsers dengan writing-mode */
@supports (writing-mode: vertical-rl) {
.vertical-text {
writing-mode: vertical-rl;
transform: none;
}
}
Pendekatan @supports memastikan browser yang tidak mengenal writing-mode akan menggunakan fallback transform: rotate().
Untuk RTL, fallback lebih simple karena direction: rtl sudah support sejak lama:
.rtl-content {
direction: rtl;
text-align: right;
}
/* Tidak perlu fallback untuk RTL */
JavaScript detection untuk writing-mode:
function supportsWritingMode() {
const testElement = document.createElement('div');
testElement.style.writingMode = 'vertical-rl';
return testElement.style.writingMode === 'vertical-rl';
}
if (!supportsWritingMode()) {
// Load polyfill atau gunakan alternative layout
console.warn('Writing mode not supported, using fallback');
document.body.classList.add('no-writing-mode');
}
Butuh jasa pembuatan website profesional? KerjaKode menyediakan layanan pembuatan website berkualitas tinggi dengan harga terjangkau. Kunjungi jasa pembuatan website KerjaKode untuk konsultasi gratis dan wujudkan website impian Anda.
CSS fallback untuk browser yang tidak support logical properties:
.card {
/* Fallback untuk browser lama */
margin-left: 20px;
padding-right: 15px;
border-left: 3px solid #333;
}
/* Override dengan logical properties untuk browser modern */
@supports (margin-inline-start: 0) {
.card {
margin-left: unset;
margin-inline-start: 20px;
padding-right: unset;
padding-inline-end: 15px;
border-left: unset;
border-inline-start: 3px solid #333;
}
}
Pattern ini memastikan website tetap berfungsi di browser lama sambil memanfaatkan fitur modern di browser baru.
Best Practice Kombinasi dengan Flexbox dan Grid
Writing-mode bekerja sangat baik dengan Flexbox dan CSS Grid, tapi ada beberapa hal yang perlu diperhatikan.
Flexbox dengan Writing Mode
Flexbox axis berubah mengikuti writing-mode. Main axis dan cross axis akan berbeda antara horizontal dan vertical writing mode.
.flex-container {
display: flex;
writing-mode: vertical-rl;
height: 100vh;
}
.flex-item {
/* flex-basis mengikuti main axis (vertikal) */
flex-basis: 200px;
/* flex-grow dan flex-shrink tetap bekerja normal */
flex-grow: 1;
}
/* Align dan justify terbalik dalam konteks vertikal */
.flex-container {
justify-content: center; /* center secara vertikal */
align-items: flex-start; /* align di top (kanan dalam vertical-rl) */
}
Kombinasi Flexbox dengan mixed writing modes:
.horizontal-navbar {
display: flex;
writing-mode: horizontal-tb; /* navbar horizontal */
}
.vertical-sidebar {
display: flex;
flex-direction: column;
writing-mode: vertical-rl; /* sidebar vertikal */
}
.vertical-sidebar .menu-item {
writing-mode: horizontal-tb; /* text menu tetap horizontal */
padding: 10px;
}
CSS Grid dengan Writing Mode
CSS Grid mendukung writing-mode dengan sangat baik. Grid tracks dan areas akan menyesuaikan dengan direction.
.grid-container {
display: grid;
writing-mode: vertical-rl;
grid-template-columns: 1fr 2fr 1fr; /* kolom dari kanan ke kiri */
grid-template-rows: auto;
gap: 20px;
height: 100vh;
}
/* Grid areas juga ikut berubah */
.grid-layout {
display: grid;
writing-mode: vertical-rl;
grid-template-areas:
"header header header"
"sidebar main aside"
"footer footer footer";
height: 100vh;
}
.header { grid-area: header; }
.sidebar { grid-area: sidebar; }
.main { grid-area: main; }
.aside { grid-area: aside; }
.footer { grid-area: footer; }
Grid dengan mixed content:
.magazine-layout {
display: grid;
writing-mode: horizontal-tb;
grid-template-columns: 2fr 1fr;
gap: 30px;
}
.article-main {
writing-mode: vertical-rl; /* artikel utama vertikal */
text-orientation: upright;
padding: 20px;
}
.sidebar-widgets {
writing-mode: horizontal-tb; /* widget sidebar horizontal */
}
Responsive Design dengan Writing Mode
Media query untuk adaptasi writing mode di berbagai device:
/* Desktop: layout vertikal untuk pengalaman tradisional */
@media (min-width: 1024px) {
.content {
writing-mode: vertical-rl;
text-orientation: upright;
max-height: 90vh;
overflow-x: auto;
}
}
/* Tablet: optional vertical dengan toggle */
@media (min-width: 768px) and (max-width: 1023px) {
.content {
writing-mode: horizontal-tb; /* default horizontal */
}
.content.vertical-mode {
writing-mode: vertical-rl;
text-orientation: upright;
}
}
/* Mobile: paksa horizontal untuk readability */
@media (max-width: 767px) {
.content {
writing-mode: horizontal-tb !important;
text-orientation: mixed;
}
}
Container queries untuk component-level adaptation:
.article-container {
container-type: inline-size;
}
/* Jika container cukup lebar, gunakan vertical */
@container (min-width: 600px) {
.article-content {
writing-mode: vertical-rl;
text-orientation: upright;
}
}
/* Container sempit, paksa horizontal */
@container (max-width: 599px) {
.article-content {
writing-mode: horizontal-tb;
}
}
Pattern ini memastikan konten tetap readable di semua ukuran screen.
Performance dan Accessibility Considerations
Implementasi writing-mode yang baik harus memperhatikan performance dan accessibility.
Performance Tips
Writing-mode dapat mempengaruhi rendering performance, terutama pada konten panjang.
Gunakan contain property untuk isolasi rendering:
.vertical-article {
writing-mode: vertical-rl;
contain: layout style paint; /* isolasi rendering */
will-change: scroll-position; /* hint untuk browser */
}
Lazy load content untuk artikel panjang:
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
const section = entry.target;
section.classList.add('loaded');
observer.unobserve(section);
}
});
}, { rootMargin: '200px' });
document.querySelectorAll('.article-section').forEach(section => {
observer.observe(section);
});
Hindari animasi pada elemen dengan writing-mode yang kompleks. Animating writing-mode sendiri sangat mahal secara computational.
Accessibility untuk Writing Mode
Screen reader harus bisa membaca konten dengan benar terlepas dari writing mode.
<article lang="zh-Hant" dir="ltr">
<div class="vertical-content" role="article" aria-label="傳統詩詞">
<h1>古詩</h1>
<p>春眠不覺曉,處處聞啼鳥。</p>
</div>
</article>
Gunakan semantic HTML yang tepat. Screen reader membaca berdasarkan DOM order, bukan visual order yang diubah oleh writing-mode.
Pastikan focus indicators tetap visible:
.vertical-link:focus {
outline: 3px solid #2ecc71;
outline-offset: 3px;
}
/* Adjust outline untuk berbagai writing mode */
[dir="rtl"] .link:focus {
outline-offset: -3px;
}
Keyboard navigation harus tetap intuitif. Arrow keys mengikuti visual direction, bukan logical direction.
Test dengan screen reader populer di Indonesia seperti NVDA dan JAWS untuk memastikan content accessible.
Tips Debugging Writing Mode Issues
Masalah umum saat implementasi writing-mode dan cara fix-nya:
1. Text overflow di vertical mode
/* Masalah: text overflow tidak terlihat */
.vertical-text {
writing-mode: vertical-rl;
overflow-x: auto; /* horizontal scroll untuk vertical text */
overflow-y: hidden;
max-height: 100vh;
}
2. Margin dan padding tidak konsisten
/* Gunakan logical properties untuk konsistensi */
.element {
margin-inline: 20px; /* horizontal di current writing mode */
margin-block: 10px; /* vertical di current writing mode */
padding-inline-start: 15px;
padding-inline-end: 15px;
}
3. Fixed positioning tidak bekerja seperti expected
/* Fixed positioning mengikuti viewport writing mode */
.fixed-element {
position: fixed;
inset-block-start: 20px; /* top di horizontal, right di vertical-rl */
inset-inline-end: 20px; /* right di horizontal LTR, left di RTL */
}
4. Flexbox axis terbalik
/* Pahami axis berubah dengan writing mode */
.flex-vertical {
display: flex;
writing-mode: vertical-rl;
/* Main axis sekarang vertikal, cross axis horizontal */
justify-content: flex-start; /* align top dalam vertical */
align-items: center; /* center horizontal dalam vertical */
}
Developer tools browser modern memiliki visualizer untuk writing mode dan logical properties yang sangat membantu debugging.
CSS writing-mode membuka kemungkinan baru untuk website multibahasa yang truly localized. Dengan memahami properti ini dan best practice-nya, developer Indonesia bisa membuat website yang melayani komunitas multibahasa dengan lebih baik.
Implementasi yang tepat tidak hanya soal teknis, tapi juga respek terhadap budaya dan preferensi user dari berbagai background bahasa.