HTML (HyperText Markup Language) គឺជាភាសា Markup ដែលប្រើបង្កើត Structure និង Content នៃទំព័រ Web។ HTML ប្រើ Tags (ស្លាក) ដើម្បីកំណត់ប្រភេទ Content។
HTML ≠ Programming Language — HTML គ្រាន់តែពណ៌នា Structure ប៉ុណ្ណោះ មិនមែន Logic ដូច C++, Java ទេ។
<!-- HTML Document Structure --> <!DOCTYPE html> <!-- HTML5 Declaration --> <html lang="km"> <!-- Root Element --> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>ទំព័រ Web ដំបូងរបស់ខ្ញុំ</title> </head> <body> Content ទាំងអស់ត្រូវដាក់ក្នុង body... </body> </html>
lang="km" — ប្រាប់ Browser ថា Content ជាភាសាខ្មែរ
charset="UTF-8" — Support ភាសាទាំងអស់ រួមទាំងខ្មែរ
| ប្រភេទ | ឧទាហរណ៍ | ន័យ |
|---|---|---|
| Opening Tag | <p> |
ចាប់ផ្ដើម Element |
| Closing Tag | </p> |
បញ្ចប់ Element |
| Self-closing |
<br>
<img>
<input>
|
Tag ដែលមិនចាំបាច់ Close |
| Attribute |
href="url"
class="name"
|
ព័ត៌មានបន្ថែមទៅ Tag |
| Nesting |
<div><p>Text</p></div>
|
Tags ដាក់ក្នុង Tags |
<!-- Element ធម្មតា — Opening + Closing --> <p>នេះជា Paragraph</p> <!-- Attribute — ពត៌មានបន្ថែម --> <a href="https://google.com" target="_blank"> Google </a> <!-- Self-closing Tags --> <br> <!-- ចុះបន្ទាត់ --> <hr> <!-- បន្ទាត់ Horizontal --> <img src="photo.jpg" alt="Photo"> <!-- Nesting — Tags ក្នុង Tags --> <div> <h2>ចំណងជើង</h2> <p>Paragraph ម្ដង</p> <p>Paragraph ពីរ</p> </div>
<!-- Headings h1 ធំបំផុត → h6 តូចបំផុត --> <h1>ចំណងជើង ១ — ធំបំផុត (SEO ចម្បង)</h1> <h2>ចំណងជើង ២</h2> <h3>ចំណងជើង ៣</h3> <h4>ចំណងជើង ៤</h4> <h5>ចំណងជើង ៥</h5> <h6>ចំណងជើង ៦ — តូចបំផុត</h6> <!-- Paragraphs --> <p>នេះជា Paragraph ទីមួយ។ HTML ជា Language ដែលបង្កើត Structure ។</p> <p>នេះជា Paragraph ទីពីរ។ Browser បន្ថែម Spacing ដោយស្វ័យប្រវត្តិ។</p> <!-- Line Break --> <p>បន្ទាត់ទីមួយ<br>បន្ទាត់ទីពីរ (ជាប់គ្នា)</p> <!-- Horizontal Rule --> <hr> <!-- Preformatted Text --> <pre> Text ដែលរក្សា Spacing ដើម</pre>
ចំណងជើង ១ — ធំបំផុត
ចំណងជើង ២
ចំណងជើង ៣
នេះជា Paragraph ទីមួយ។ HTML ជា Language ដែលបង្កើត Structure ។
នេះជា Paragraph ទីពីរ។ Browser បន្ថែម Spacing ដោយស្វ័យប្រវត្តិ។
បន្ទាត់ទីមួយ
បន្ទាត់ទីពីរ
(ជាប់គ្នា)
<!-- === LINKS === --> <!-- External Link --> <a href="https://www.google.com" target="_blank"> ចូល Google </a> <!-- Internal Link --> <a href="about.html">អំពីយើង</a> <!-- Anchor Link (ចូលទៅ Section ក្នុងទំព័រ) --> <a href="#contact">ទំនាក់ទំនង</a> <!-- Email Link --> <a href="mailto:info@example.com">ផ្ញើ Email</a> <!-- Phone Link --> <a href="tel:+85512345678">ទូរស័ព្ទ</a> <!-- === IMAGES === --> <!-- Image ធម្មតា --> <img src="photo.jpg" alt="ពណ៌នារូបភាព (ចាំបាច់!)" width="300" height="200" > <!-- Responsive Image --> <img src="banner.jpg" alt="Banner" style="max-width: 100%; height: auto;" > <!-- Image as Link --> <a href="home.html"> <img src="logo.png" alt="Logo" width="120"> </a>
target="_blank" — បើក Link ក្នុង Tab ថ្មី
<!-- Unordered List (bullets) --> <ul> <li>ផ្លែប៉ោម</li> <li>ផ្លែស្វាយ</li> <li>ផ្លែក្រូច</li> </ul> <!-- Ordered List (numbers) --> <ol> <li>ជំហានទីមួយ</li> <li>ជំហានទីពីរ</li> <li>ជំហានទីបី</li> </ol> <!-- Ordered — start attribute --> <ol start="5" type="A"> <li>ចាប់ពី E</li> <li>F</li> </ol> <!-- Nested List --> <ul> <li>ភេសជ្ជៈ <ul> <li>ទឹកក្រូច</li> <li>ទឹកដំណើក</li> </ul> </li> <li>អាហារ</li> </ul> <!-- Description List --> <dl> <dt>HTML</dt> <dd>HyperText Markup Language</dd> <dt>CSS</dt> <dd>Cascading Style Sheets</dd> </dl>
- ផ្លែប៉ោម
- ផ្លែស្វាយ
- ផ្លែក្រូច
- ជំហានទីមួយ
- ជំហានទីពីរ
- ជំហានទីបី
<table border="1"> <!-- Table Header --> <thead> <tr> <th>ឈ្មោះ</th> <th>អាយុ</th> <th>ពិន្ទុ</th> </tr> </thead> <!-- Table Body --> <tbody> <tr> <td>វណ្ណា</td> <td>20</td> <td>95</td> </tr> <tr> <td>សុភា</td> <td>22</td> <td>88</td> </tr> </tbody> <!-- colspan/rowspan --> <tfoot> <tr> <td colspan="2">មធ្យម</td> <td>91.5</td> </tr> </tfoot> </table>
rowspan="2" — Cell ត្រូបដែន 2 Row
ប្រើ CSS ជំនួស
border="1" ក្នុង Project
ពិតប្រាកដ
<p> <strong>អត្ថបទ Bold</strong> និង <em>អត្ថបទ Italic</em> និង <mark>អត្ថបទ Highlight</mark> </p> <p>តម្លៃ <del>$20</del> <ins>$15</ins></p> <p>H<sub>2</sub>O និង E=mc<sup>2</sup></p> <blockquote cite="https://source.com"> ការអប់រំគឺជាអាវុធដ៏មានថាមពលបំផុត ដែលអ្នកអាចប្រើដើម្បីផ្លាស់ប្ដូរពិភពលោក។ </blockquote> <p>ប្រើ <code>console.log("Hello")</code> ក្នុង JavaScript</p> <abbr title="HyperText Markup Language">HTML</abbr>
អត្ថបទ Bold និង អត្ថបទ Italic និង អត្ថបទ Highlight
តម្លៃ $20 $15
H2O និង E=mc2
ការអប់រំគឺជាអាវុធដ៏មានថាមពលបំផុត ដែលអ្នកអាចប្រើដើម្បីផ្លាស់ប្ដូរពិភពលោក។
ប្រើ
console.log("Hello")
ក្នុង JavaScript
<form action="/submit" method="POST"> <!-- Text Input --> <label for="name">ឈ្មោះ:</label> <input type="text" id="name" name="name" placeholder="បញ្ចូលឈ្មោះ" required> <!-- Email --> <label for="email">អ៊ីម៉ែល:</label> <input type="email" id="email" name="email"> <!-- Password --> <input type="password" name="pass" minlength="8"> <!-- Number --> <input type="number" name="age" min="1" max="120"> <!-- Date --> <input type="date" name="birthday"> <!-- Radio Buttons --> <input type="radio" name="gender" value="male"> ប្រុស <input type="radio" name="gender" value="female"> ស្រី <!-- Checkbox --> <input type="checkbox" name="agree" checked> យល់ព្រម <!-- Dropdown --> <select name="city"> <option value="pp">ភ្នំពេញ</option> <option value="sr">សៀមរាប</option> </select> <!-- Textarea --> <textarea name="msg" rows="4" cols="40" placeholder="សរសេរសាររបស់អ្នក..."></textarea> <!-- Submit Button --> <button type="submit">ផ្ញើ</button> <button type="reset">សូន្យ</button> </form>
Semantic HTML ប្រើ Tags ដែលមានន័យ Meaningful — ប្រាប់ Browser និង Search Engine ពី Purpose នៃ Content។
| Semantic Tag | ន័យ | ប្រើនៅ |
|---|---|---|
<header> |
ផ្នែកខាងលើ | Logo, Navigation, Banner |
<nav> |
Navigation Menu | Links Menu Bar |
<main> |
Content ចម្បង | Main content area (1 ក្នុង Page) |
<section> |
ផ្នែក | Group content ដែលពាក់ព័ន្ធ |
<article> |
អត្ថបទ/Post | Blog post, News article |
<aside> |
ខ្ទង់ Sidebar | Related links, Widgets |
<footer> |
ផ្នែកខាងក្រោម | Copyright, Contact |
<figure> |
Media Container | Image + Caption |
<body> <header> <h1>ឈ្មោះ Website</h1> <nav> <ul> <li><a href="/">ទំព័រដើម</a></li> <li><a href="/about">អំពីយើង</a></li> </ul> </nav> </header> <main> <section id="hero"> <h2>សូមស្វាគមន៍</h2> <p>នេះជា Hero Section</p> </section> <section id="blog"> <article> <h2>ចំណងជើង Post</h2> <time datetime="2025-01-15">ថ្ងៃទី ១៥ មករា</time> <p>Content នៃ Post...</p> <figure> <img src="post.jpg" alt="Post Image"> <figcaption>ពណ៌នារូបភាព</figcaption> </figure> </article> </section> <aside> <h3>Related Posts</h3> </aside> </main> <footer> <p>© 2025 ឈ្មោះ Company</p> </footer> </body>
| <div> | <span> | |
|---|---|---|
| ប្រភេទ | Block Element | Inline Element |
| Display | ចាប់ Line ថ្មី, Width 100% | ស្ថិតក្នុង Text |
| ប្រើ | Group Sections, Layout | Style Text ផ្នែកក្នុង Paragraph |
<!-- div — Block Container --> <div class="card" style="background:#f0f; padding:10px;"> <h3>ចំណងជើង Card</h3> <p>Content ក្នុង Card...</p> </div> <!-- span — Inline Container --> <p> ពណ៌ <span style="color: red;">ក្រហម</span> និង <span style="color: blue; font-weight: bold;">ខៀវ</span> ស្អាត! </p> <!-- Layout ជាមួយ div --> <div style="display:flex; gap:10px;"> <div style="flex:1; background:#e3f2fd; padding:15px;"> Column ១ </div> <div style="flex:1; background:#f3e5f5; padding:15px;"> Column ២ </div> </div>
CSS (Cascading Style Sheets) ប្រើដើម្បី Style HTML Elements — ការប្ដូរពណ៌, ទំហំ, Font, Layout...
<!-- 1. INLINE CSS --> <p style="color: red; font-size: 18px;">Text ក្រហម</p> <!-- 2. INTERNAL CSS --> <style> body { font-family: Arial, sans-serif; background-color: #f5f5f5; margin: 0; padding: 20px; } h1 { color: #0891b2; font-size: 2rem; text-align: center; } .card { /* Class Selector */ background: white; border-radius: 8px; padding: 20px; box-shadow: 0 2px 8px rgba(0,0,0,0.1); margin-bottom: 16px; } #hero { /* ID Selector */ background: linear-gradient(135deg, #0891b2, #06b6d4); color: white; padding: 60px; } </style> <!-- 3. EXTERNAL CSS — Best Practice --> <link rel="stylesheet" href="style.css">
<!-- HTML --> <!-- Multiple classes --> <div class="card featured"> Card ពិសេស </div> <button class="btn btn-primary">Click</button> <button class="btn btn-danger">Delete</button> <p id="intro">Unique Element</p> /* CSS */ .card { border: 1px solid #ddd; padding: 16px; } .featured { border-color: #0891b2; background: #e0f7fa; } /* Base button */ .btn { padding: 10px 20px; border: none; border-radius: 6px; cursor: pointer; font-size: 14px; } /* Variant buttons */ .btn-primary { background: #0891b2; color: white; } .btn-danger { background: #dc2626; color: white; } /* Hover state */ .btn:hover { opacity: 0.85; transform: translateY(-1px); } #intro { font-size: 1.2rem; color: #0e7490; }
<!-- VIDEO --> <video width="640" height="360" controls <!-- បង្ហាញ Play/Pause/Volume --> autoplay <!-- ចាប់ផ្ដើម Auto --> muted <!-- Silent ដើមដំបូង --> loop <!-- Loop ម្ដងម្ដងៗ --> poster="thumb.jpg" <!-- Cover Image --> > <source src="video.mp4" type="video/mp4"> <source src="video.webm" type="video/webm"> Browser ចាស់មិន Support Video </video> <!-- AUDIO --> <audio controls> <source src="song.mp3" type="audio/mpeg"> <source src="song.ogg" type="audio/ogg"> </audio> <!-- YOUTUBE Embed --> <iframe width="560" height="315" src="https://www.youtube.com/embed/VIDEO_ID" title="YouTube video" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen ></iframe> <!-- Google Map Embed --> <iframe src="https://maps.google.com/maps?q=Phnom+Penh&output=embed" width="100%" height="300" style="border:0;" loading="lazy" ></iframe>
Flexbox ជា Layout System ដ៏ល្អ សម្រាប់ បែងចែក Space នៅក្នុង Container — Row ឬ Column.
<!-- HTML --> <div class="flex-container"> <div class="flex-item">1</div> <div class="flex-item">2</div> <div class="flex-item">3</div> </div> /* CSS */ .flex-container { display: flex; flex-direction: row; /* row | column | row-reverse */ justify-content: center; /* center | space-between | flex-start */ align-items: center; /* center | flex-start | stretch */ flex-wrap: wrap; /* wrap | nowrap */ gap: 16px; min-height: 200px; background: #f0f9ff; border-radius: 10px; padding: 20px; } .flex-item { flex: 1; /* ចែក Space ស្មើ */ min-width: 120px; background: #0891b2; color: white; text-align: center; padding: 24px; border-radius: 8px; font-size: 1.2rem; font-weight: bold; } /* Navbar with Flexbox */ nav { display: flex; justify-content: space-between; align-items: center; padding: 0 24px; background: #0e7490; height: 60px; }
<!-- HTML --> <div class="grid-layout"> <header class="g-header">Header</header> <nav class="g-nav">Sidebar</nav> <main class="g-main">Main Content</main> <footer class="g-footer">Footer</footer> </div> /* CSS Grid */ .grid-layout { display: grid; grid-template-areas: "header header" "nav main " "footer footer"; grid-template-columns: 200px 1fr; grid-template-rows: auto 1fr auto; gap: 12px; min-height: 100vh; } .g-header { grid-area: header; background: #0891b2; color: white; padding: 16px; } .g-nav { grid-area: nav; background: #e0f7fa; padding: 16px; } .g-main { grid-area: main; background: white; padding: 20px; } .g-footer { grid-area: footer; background: #0e7490; color: white; padding: 12px; } /* Card Grid — Auto-fill */ .card-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 20px; }
<!-- ចាំបាច់! Viewport Meta Tag --> <meta name="viewport" content="width=device-width, initial-scale=1.0"> /* === MOBILE FIRST APPROACH === */ /* Default (Mobile) */ .container { width: 100%; padding: 0 16px; } .grid { display: grid; grid-template-columns: 1fr; /* 1 column on mobile */ gap: 16px; } /* Tablet (≥ 768px) */ @media (min-width: 768px) { .container { max-width: 768px; margin: 0 auto; } .grid { grid-template-columns: 1fr 1fr; } .sidebar { display: block; } /* Show sidebar */ } /* Desktop (≥ 1024px) */ @media (min-width: 1024px) { .container { max-width: 1200px; } .grid { grid-template-columns: 1fr 1fr 1fr; } } /* Dark Mode */ @media (prefers-color-scheme: dark) { body { background: #121212; color: #ffffff; } } /* Print */ @media print { nav, footer { display: none; } body { font-size: 12pt; } }
/* === TRANSITIONS === */ .btn { background: #0891b2; color: white; padding: 12px 24px; border-radius: 8px; transition: all 0.3s ease; /* Smooth change */ } .btn:hover { background: #0e7490; transform: translateY(-3px); box-shadow: 0 8px 20px rgba(8,145,178,0.4); } /* === KEYFRAMES ANIMATION === */ @keyframes fadeIn { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } @keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } @keyframes pulse { 0%, 100% { transform: scale(1); } 50% { transform: scale(1.05); } } .hero { animation: fadeIn 0.8s ease forwards; } .loader { animation: spin 1s linear infinite; } .card:hover { animation: pulse 0.4s ease; } /* Stagger animation — delay each child */ .item:nth-child(1) { animation-delay: 0.1s; } .item:nth-child(2) { animation-delay: 0.2s; } .item:nth-child(3) { animation-delay: 0.3s; }
<form action="/register" method="POST" novalidate> <!-- Fieldset Group --> <fieldset> <legend>ព័ត៌មានផ្ទាល់ខ្លួន</legend> <!-- Pattern Validation --> <label for="phone">លេខទូរស័ព្ទ:</label> <input type="tel" id="phone" pattern="[0-9]{9,10}" placeholder="012345678" required > <!-- Range Slider --> <label>ពិន្ទុ: <span id="val">50</span></label> <input type="range" min="0" max="100" value="50" oninput="document.getElementById('val').textContent=this.value"> <!-- Color Picker --> <label>ពណ៌ដែលចូលចិត្ត:</label> <input type="color" name="fav_color" value="#0891b2"> <!-- Datalist (Autocomplete) --> <label>ខេត្ត/ក្រុង:</label> <input list="cities" name="city" placeholder="វាយ..."> <datalist id="cities"> <option value="ភ្នំពេញ"> <option value="សៀមរាប"> <option value="សីហនុ"> <option value="បាត់ដំបង"> </datalist> <!-- File Upload --> <input type="file" accept="image/*" multiple> </fieldset> <button type="submit">ចុះឈ្មោះ</button> </form>
Accessibility (a11y) ធ្វើឱ្យ Website ប្រើបានដោយ គ្រប់គ្នា — រួមទាំងអ្នកពិការភ្នែក, ពិការដៃ, ប្រើ Screen Readers។
<!-- Skip to main content --> <a href="#main" class="skip-link">Skip to main content</a> <!-- ARIA Roles --> <nav role="navigation" aria-label="Main Navigation"> <ul> <li><a href="/">ទំព័រដើម</a></li> </ul> </nav> <!-- Button ជាមួយ aria-label --> <button aria-label="Close dialog">✕</button> <!-- Icon Button --> <button aria-label="Search"> <svg aria-hidden="true">...</svg> </button> <!-- Form Accessibility --> <div role="group" aria-labelledby="addr-label"> <span id="addr-label">អាសយដ្ឋាន</span> <input aria-required="true" aria-invalid="false"> </div> <!-- Focus management --> <div tabindex="0" role="button" aria-pressed="false"> Custom Button </div> <!-- Live regions --> <div aria-live="polite" aria-atomic="true"> Dynamic Content Update... </div> <!-- Image with descriptive alt --> <img src="chart.png" alt="ក្រាហ្វបង្ហាញការលក់ប្រចាំខែ 2024 — ខែ មករា: $50K, កុម្ភៈ: $65K"> <!-- Decorative image --> <img src="divider.png" alt="" role="presentation">
<head> <!-- === ESSENTIAL META === --> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="description" content="ពណ៌នា Page (150-160 chars) — ចំណាំ SEO"> <meta name="keywords" content="HTML, CSS, JavaScript, Web"> <meta name="author" content="ឈ្មោះ Author"> <meta name="robots" content="index, follow"> <!-- Canonical URL --> <link rel="canonical" href="https://example.com/page"> <!-- === OPEN GRAPH (Facebook/LinkedIn) === --> <meta property="og:type" content="website"> <meta property="og:url" content="https://example.com"> <meta property="og:title" content="ចំណងជើង Page"> <meta property="og:description" content="ពណ៌នា Content"> <meta property="og:image" content="https://example.com/og.jpg"> <meta property="og:locale" content="km_KH"> <!-- === TWITTER CARDS === --> <meta name="twitter:card" content="summary_large_image"> <meta name="twitter:title" content="ចំណងជើង Page"> <meta name="twitter:image" content="https://example.com/tw.jpg"> <!-- Favicon --> <link rel="icon" href="favicon.ico"> <link rel="icon" href="icon.svg" type="image/svg+xml"> <link rel="apple-touch-icon" href="apple-icon.png"> <!-- Theme Color (Mobile Browser Bar) --> <meta name="theme-color" content="#0891b2"> <title>ចំណងជើង Page | ឈ្មោះ Site</title> </head>