<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:series="https://publishpress.com/"
	>

<channel>
	<title>Html/CSS Archives - Tomoshare</title>
	<atom:link href="https://blog.tomosia.com.vn/danh-muc/html-css/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.tomosia.com.vn/danh-muc/html-css/</link>
	<description>Kênh chia sẻ kiến thức Tomosia Việt Nam</description>
	<lastBuildDate>Fri, 22 May 2026 07:28:24 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://blog.tomosia.com.vn/wp-content/uploads/2023/09/cropped-icon-32x32.png</url>
	<title>Html/CSS Archives - Tomoshare</title>
	<link>https://blog.tomosia.com.vn/danh-muc/html-css/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Tại sao position: sticky của bạn không hoạt động ?</title>
		<link>https://blog.tomosia.com.vn/tai-sao-position-sticky-cua-ban-khong-hoat-dong/</link>
					<comments>https://blog.tomosia.com.vn/tai-sao-position-sticky-cua-ban-khong-hoat-dong/#comments</comments>
		
		<dc:creator><![CDATA[Thang Dang]]></dc:creator>
		<pubDate>Fri, 22 May 2026 07:28:21 +0000</pubDate>
				<category><![CDATA[Html/CSS]]></category>
		<guid isPermaLink="false">https://blog.tomosia.com.vn/?p=3952</guid>

					<description><![CDATA[<p>Position: sticky là một trong những thuộc tính CSS mạnh mẽ, dùng trong nhiều trường hợp để nội&#8230;</p>
<p>The post <a href="https://blog.tomosia.com.vn/tai-sao-position-sticky-cua-ban-khong-hoat-dong/">Tại sao position: sticky của bạn không hoạt động ?</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Position: sticky là một trong những thuộc tính CSS mạnh mẽ, dùng trong nhiều trường hợp để nội dung được hoạt động xuyên suốt nhưng cũng rất dễ &#8220;không hoạt động&#8221; nếu hiểu sai bản chất</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 id="1-position-sticky-hoat-dong-nhu-the-nao" class="wp-block-heading">1. <code>position: sticky</code> hoạt động như thế nào?</h2>



<p class="wp-block-paragraph">Một element có <code>position: sticky</code> sẽ:</p>



<ol class="wp-block-list">
<li><strong>Hoạt động như <code>position: relative</code></strong> cho đến khi</li>



<li><strong>Một cạnh</strong> (<code>top</code> / <code>bottom</code> / <code>left</code> / <code>right</code>) <strong>chạm tới offset</strong> đã chỉ định trong vùng scroll</li>



<li>Sau đó nó sẽ <strong>&#8220;dính&#8221; (stick)</strong> tại vị trí đó</li>
</ol>



<p class="wp-block-paragraph">📌 <strong>Quan trọng</strong>: Sticky luôn bị giới hạn trong phạm vi của parent (không vượt ra ngoài).</p>



<h3 id="vi-du-minh-hoa" class="wp-block-heading">Ví dụ minh họa</h3>



<pre class="wp-block-code"><code>.header {
  position: sticky;
  top: 0;
  background: white;
  z-index: 10;
}</code></pre>



<p class="wp-block-paragraph">Header này sẽ cuộn bình thường cho đến khi cạnh trên chạm vị trí <code>0px</code> từ đỉnh viewport, sau đó sẽ &#8220;dính&#8221; lại ở đó khi bạn tiếp tục cuộn xuống.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 id="2-dieu-kien-bat-buoc-de-sticky-hoat-dong" class="wp-block-heading">2. Điều kiện bắt buộc để sticky hoạt động</h2>



<h3 id="2-1-phai-co-it-nhat-mot-offset" class="wp-block-heading">2.1. Phải có ít nhất một offset</h3>



<p class="wp-block-paragraph">❌ <strong>Sai:</strong></p>



<pre class="wp-block-code"><code>.sticky {
  position: sticky;
}
</code></pre>



<p class="wp-block-paragraph">✅ <strong>Đúng:</strong></p>



<pre class="wp-block-code"><code>.sticky {
  position: sticky;
  top: 0;
}
</code></pre>



<p class="wp-block-paragraph"><strong>Tailwind CSS:</strong></p>



<pre class="wp-block-code"><code>&lt;div class="sticky top-0"&gt;...&lt;/div&gt;
</code></pre>



<h3 id="2-2-parent-khong-duoc-co-overflow-hidden-auto-scroll" class="wp-block-heading">2.2. Parent không được có <code>overflow: hidden | auto | scroll</code></h3>



<p class="wp-block-paragraph">Nếu bất kỳ cha nào có <code>overflow</code> khác <code>visible</code> → sticky bị vô hiệu hóa.</p>



<p class="wp-block-paragraph">❌ <strong>Sai:</strong></p>



<pre class="wp-block-code"><code>.parent {
  overflow: hidden;
}</code></pre>



<p class="wp-block-paragraph">✅ <strong>Fix:</strong></p>



<ul class="wp-block-list">
<li>Xoá <code>overflow</code></li>



<li>Hoặc đưa sticky ra ngoài container đó</li>



<li>Hoặc áp dụng <code>overflow</code> cho một container bên trong</li>
</ul>



<h3 id="2-3-parent-phai-du-cao-de-co-scroll" class="wp-block-heading">2.3. Parent phải đủ cao để có scroll</h3>



<p class="wp-block-paragraph">Sticky chỉ kích hoạt khi có scroll thật.</p>



<p class="wp-block-paragraph">❌ <strong>Sai:</strong></p>



<pre class="wp-block-code"><code>&lt;div style="height: 100px">
  &lt;div class="sticky">Short parent&lt;/div>
&lt;/div></code></pre>



<p class="wp-block-paragraph">✅ <strong>Đúng:</strong></p>



<pre class="wp-block-code"><code>&lt;div style="min-height: 200vh">
  &lt;div class="sticky">Tall parent&lt;/div>
&lt;/div></code></pre>



<h3 id="2-4-parent-khong-duoc-dung-transform" class="wp-block-heading">2.4. Parent không được dùng <code>transform</code></h3>



<p class="wp-block-paragraph">Nếu parent có:</p>



<ul class="wp-block-list">
<li><code>transform: translateZ(0);</code></li>



<li><code>transform: scale(1);</code></li>



<li>hoặc animation/transition với transform</li>
</ul>



<p class="wp-block-paragraph">→ sticky không hoạt động.</p>



<p class="wp-block-paragraph"><strong>Giải pháp</strong>: Di chuyển transform ra khỏi parent, hoặc áp dụng cho element khác.</p>



<h3 id="2-5-z-index-co-the-lam-ban-tuong-sticky-khong-chay" class="wp-block-heading">2.5. <code>z-index</code> có thể làm bạn tưởng sticky không chạy</h3>



<p class="wp-block-paragraph">Sticky vẫn hoạt động nhưng bị che bởi các element khác.</p>



<pre class="wp-block-code"><code>.sticky {
  position: sticky;
  top: 0;
  z-index: 10;
  background: white; /* Quan trọng để không bị trong suốt */
}
</code></pre>



<p class="wp-block-paragraph"><strong>Tailwind CSS:</strong></p>



<pre class="wp-block-code"><code>&lt;div class="sticky top-0 z-10 bg-white"&gt;...&lt;/div&gt;
</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 id="3-vi-sao-top-30px-khong-hoat-dong-nhung-bottom-30px-lai-duoc" class="wp-block-heading">3. Vì sao <code>top: 30px</code> không hoạt động nhưng <code>bottom: 30px</code> lại được?</h2>



<p class="wp-block-paragraph">Đây là bẫy rất phổ biến và gây nhầm lẫn nhiều nhất.</p>



<h3 id="nguyen-nhan-cot-loi" class="wp-block-heading">Nguyên nhân cốt lõi</h3>



<p class="wp-block-paragraph">Sticky chỉ hoạt động nếu <strong>cạnh được chỉ định CÓ KHẢ NĂNG chạm tới offset đó khi scroll</strong>.</p>



<ul class="wp-block-list">
<li><code>top: 30px</code> → cạnh trên phải chạm 30px từ đỉnh vùng scroll</li>



<li><code>bottom: 30px</code> → cạnh dưới phải chạm 30px từ đáy vùng scroll</li>
</ul>



<p class="wp-block-paragraph">👉 <strong>Trong layout của bạn:</strong></p>



<ul class="wp-block-list">
<li>Cạnh trên không bao giờ chạm được 30px → <code>top</code> không hoạt động</li>



<li>Nhưng cạnh dưới có thể chạm → <code>bottom</code> hoạt động</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 id="4-cac-tinh-huong-gay-ra-hien-tuong-nay" class="wp-block-heading">4. Các tình huống gây ra hiện tượng này</h2>



<h3 id="4-1-element-da-nam-san-gan-top-parent" class="wp-block-heading">4.1. Element đã nằm sẵn gần top parent</h3>



<pre class="wp-block-code"><code>&lt;div class="parent">
  &lt;div class="sticky" style="position: sticky; top: 30px">
    Tôi đã nằm ở đây từ đầu
  &lt;/div>
&lt;/div></code></pre>



<p class="wp-block-paragraph"><strong>Phân tích:</strong></p>



<ul class="wp-block-list">
<li>Nếu sticky ban đầu đã nằm ≤ 30px từ top</li>



<li><code>top: 30px</code> → không có thời điểm kích hoạt</li>



<li>Browser coi như <code>position: relative</code></li>
</ul>



<p class="wp-block-paragraph"><strong>Trong khi đó:</strong></p>



<ul class="wp-block-list">
<li>Khi scroll, cạnh dưới vẫn có thể chạm đáy viewport</li>



<li>→ <code>bottom</code> hoạt động bình thường</li>
</ul>



<h3 id="4-2-parent-khong-du-cao" class="wp-block-heading">4.2. Parent không đủ cao</h3>



<p class="wp-block-paragraph">Sticky bị giới hạn trong parent.</p>



<ul class="wp-block-list">
<li>Khoảng cách từ sticky → đỉnh parent quá ngắn → <code>top</code> không kích hoạt</li>



<li>Khoảng cách tới đáy parent vẫn còn → <code>bottom</code> hoạt động</li>
</ul>



<pre class="wp-block-code"><code>&lt;div style="height: 200px"> &lt;!-- Parent quá ngắn -->
  &lt;div style="position: sticky; top: 30px">
    Không đủ khoảng cách để stick
  &lt;/div>
&lt;/div></code></pre>



<h3 id="4-3-scroll-container-khong-phai-window" class="wp-block-heading">4.3. Scroll container không phải window</h3>



<pre class="wp-block-code"><code>.wrapper {
  height: 100vh;
  overflow-y: auto;
}</code></pre>



<p class="wp-block-paragraph"><code>top</code> được tính theo <code>.wrapper</code>, không phải theo màn hình.</p>



<p class="wp-block-paragraph">Nếu sticky đã gần top của wrapper → <code>top</code> không ăn.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 id="5-minh-hoa-truc-quan" class="wp-block-heading">5. Minh họa trực quan</h2>



<h3 id="top-khong-hoat-dong" class="wp-block-heading"><code>top</code> không hoạt động</h3>



<pre class="wp-block-code"><code>┌─────────────┐
│  viewport   │
│             │
│   30px ↓    │ ← Mốc sticky mong muốn
│  &#91;sticky]   │ ← Nhưng element đã nằm sẵn ở đây
│   content   │
│      ⋮      │
└─────────────┘
</code></pre>



<p class="wp-block-paragraph"><strong>Không có lúc nào cạnh trên chạm mốc 30px</strong> → Sticky không kích hoạt</p>



<h3 id="bottom-hoat-dong" class="wp-block-heading"><code>bottom</code> hoạt động</h3>



<pre class="wp-block-code"><code>┌─────────────┐
│   content   │
│      ⋮      │
│  &#91;sticky]   │ ← Element bắt đầu ở đây
│             │
│   30px ↑    │ ← Khi scroll, cạnh dưới sẽ chạm mốc này
│  viewport   │
└─────────────┘
</code></pre>



<p class="wp-block-paragraph"><strong>Cạnh dưới có lúc chạm 30px</strong> → Sticky kích hoạt</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 id="6-cach-fix-top-30px-khong-hoat-dong" class="wp-block-heading">6. Cách fix <code>top: 30px</code> không hoạt động</h2>



<h3 id="%e2%9c%85-cach-1-tao-khoang-cach-ban-dau" class="wp-block-heading">✅ Cách 1: Tạo khoảng cách ban đầu</h3>



<pre class="wp-block-code"><code>.sticky {
  margin-top: 40px; /* Đẩy xuống để có khoảng cách */
  position: sticky;
  top: 30px;
}</code></pre>



<h3 id="%e2%9c%85-cach-2-dat-sticky-thap-hon-trong-dom" class="wp-block-heading">✅ Cách 2: Đặt sticky thấp hơn trong DOM</h3>



<pre class="wp-block-code"><code>&lt;div class="parent">
  &lt;div style="height: 100px">&lt;/div> &lt;!-- Spacer -->
  &lt;div class="sticky" style="position: sticky; top: 30px">
    Bây giờ có khoảng cách để stick
  &lt;/div>
&lt;/div></code></pre>



<h3 id="%e2%9c%85-cach-3-kiem-tra-overflow-cua-parent" class="wp-block-heading">✅ Cách 3: Kiểm tra overflow của parent</h3>



<pre class="wp-block-code"><code>.parent {
  overflow: visible; /* Hoặc bỏ hoàn toàn */
}</code></pre>



<h3 id="%e2%9c%85-cach-4-debug-nhanh-bang-outline" class="wp-block-heading">✅ Cách 4: Debug nhanh bằng outline</h3>



<pre class="wp-block-code"><code>.sticky {
  position: sticky;
  top: 30px;
  outline: 2px solid red; /* Giúp nhìn rõ khi nào sticky kích hoạt */
}</code></pre>



<p class="wp-block-paragraph">Khi bạn scroll, nếu outline màu đỏ &#8220;dính&#8221; lại ở vị trí 30px từ trên xuống, nghĩa là sticky đã hoạt động.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 id="7-checklist-debug-sticky-90-fix-duoc-van-de" class="wp-block-heading">7. Checklist debug sticky (90% fix được vấn đề)</h2>



<p class="wp-block-paragraph">Khi sticky không hoạt động, hãy check theo thứ tự:</p>



<ul class="wp-block-list">
<li>✔ <strong>Có <code>top</code> / <code>bottom</code> / <code>left</code> / <code>right</code></strong> được khai báo?</li>



<li>✔ <strong>Parent không có <code>overflow: hidden/auto/scroll</code></strong>?</li>



<li>✔ <strong>Có scroll thật</strong> (parent đủ cao)?</li>



<li>✔ <strong>Parent không dùng <code>transform</code></strong>?</li>



<li>✔ <strong>Có <code>z-index</code> và <code>background</code></strong> nếu cần?</li>



<li>✔ <strong>Cạnh được chỉ định có khả năng chạm offset</strong> không?</li>
</ul>



<h3 id="debug-tool-nhanh" class="wp-block-heading">Debug tool nhanh</h3>



<pre class="wp-block-code"><code>/* Thêm vào element sticky để debug */
.sticky {
  outline: 3px dashed red;
  outline-offset: -3px;
}

/* Thêm vào parent để kiểm tra */
.parent {
  outline: 2px solid blue;
}</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 id="8-vi-du-thuc-te-sticky-header" class="wp-block-heading">8. Ví dụ thực tế: Sticky header</h2>



<h3 id="%e2%9d%8c-khong-hoat-dong" class="wp-block-heading">❌ Không hoạt động</h3>



<pre class="wp-block-code"><code>&lt;div style="overflow: hidden"> &lt;!-- Lỗi: overflow -->
  &lt;header style="position: sticky; top: 0">
    Menu
  &lt;/header>
  &lt;main>Content...&lt;/main>
&lt;/div></code></pre>



<h3 id="%e2%9c%85-hoat-dong-dung" class="wp-block-heading">✅ Hoạt động đúng</h3>



<pre class="wp-block-code"><code>&lt;div> &lt;!-- Không có overflow -->
  &lt;header style="position: sticky; top: 0; z-index: 10; background: white">
    Menu
  &lt;/header>
  &lt;main style="min-height: 200vh">
    Content...
  &lt;/main>
&lt;/div></code></pre>



<h3 id="voi-tailwind-css" class="wp-block-heading">Với Tailwind CSS</h3>



<pre class="wp-block-code"><code>&lt;div>
  &lt;header class="sticky top-0 z-10 bg-white shadow">
    &lt;nav class="container mx-auto">Menu&lt;/nav>
  &lt;/header>
  &lt;main class="min-h-&#91;200vh]">
    Content...
  &lt;/main>
&lt;/div></code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 id="9-vi-du-nang-cao-sticky-sidebar" class="wp-block-heading">9. Ví dụ nâng cao: Sticky sidebar</h2>



<pre class="wp-block-code"><code>&lt;div class="flex gap-4">
  &lt;!-- Sidebar sticky -->
  &lt;aside class="w-64">
    &lt;div class="sticky top-4">
      &lt;nav>Navigation links...&lt;/nav>
    &lt;/div>
  &lt;/aside>
  
  &lt;!-- Main content -->
  &lt;main class="flex-1 min-h-&#91;200vh]">
    Long content...
  &lt;/main>
&lt;/div></code></pre>



<p class="wp-block-paragraph"><strong>Tailwind CSS:</strong></p>



<pre class="wp-block-code"><code>&lt;div class="flex gap-4">
  &lt;aside class="w-64">
    &lt;div class="sticky top-4">
      &lt;nav>Navigation&lt;/nav>
    &lt;/div>
  &lt;/aside>
  &lt;main class="flex-1 min-h-&#91;200vh]">Content&lt;/main>
&lt;/div></code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 id="10-luu-y-khi-dung-voi-framework" class="wp-block-heading">10. Lưu ý khi dùng với framework</h2>



<h3 id="nuxt-vue" class="wp-block-heading">Nuxt / Vue</h3>



<pre class="wp-block-code"><code>&lt;template>
  &lt;div class="container">
    &lt;!-- ❌ Tránh -->
    &lt;div style="overflow-x: hidden">
      &lt;header class="sticky top-0">Header&lt;/header>
    &lt;/div>
    
    &lt;!-- ✅ Đúng -->
    &lt;header class="sticky top-0 z-10 bg-white">Header&lt;/header>
  &lt;/div>
&lt;/template>

&lt;style scoped>
.container {
  /* Không dùng overflow ở đây */
}
&lt;/style></code></pre>



<h3 id="react-next-js" class="wp-block-heading">React / Next.js</h3>



<pre class="wp-block-code"><code>export default function Layout({ children }) {
  return (
    &lt;div className="min-h-screen">
      &lt;header className="sticky top-0 z-10 bg-white shadow">
        &lt;nav>Menu&lt;/nav>
      &lt;/header>
      &lt;main className="container mx-auto">
        {children}
      &lt;/main>
    &lt;/div>
  )
}</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 id="11-ket-luan" class="wp-block-heading">11. Kết luận</h2>



<p class="wp-block-paragraph"><code>position: sticky</code> không hề lỗi, chỉ là nó rất <strong>nghiêm ngặt về điều kiện kích hoạt</strong>.</p>



<h3 id="nguyen-tac-vang" class="wp-block-heading">Nguyên tắc vàng</h3>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>&#8220;Cạnh này có thực sự chạm được offset đó khi scroll không?&#8221;</strong></p>
</blockquote>



<p class="wp-block-paragraph">Nếu <code>top</code> không hoạt động nhưng <code>bottom</code> lại được, <strong>99% là do cạnh trên không bao giờ chạm được offset đã chỉ định</strong>.</p>



<h3 id="loi-khuyen-cuoi" class="wp-block-heading">Lời khuyên cuối</h3>



<ul class="wp-block-list">
<li>Nếu bạn đang dùng <strong>Nuxt / Tailwind / layout phức tạp</strong>, chỉ cần sai 1 class <code>overflow-hidden</code> là sticky hỏng hoàn toàn</li>



<li>Luôn test sticky với <strong>outline</strong> hoặc <strong>background màu nổi</strong> để debug</li>



<li>Đọc kỹ các điều kiện ở phần 2, đặc biệt là <strong>overflow</strong> và <strong>transform</strong></li>



<li>Khi gặp lỗi, check lại <strong>chiều cao parent</strong> và <strong>vị trí ban đầu</strong> của element</li>
</ul>



<p class="wp-block-paragraph">💡 <strong>Pro tip</strong>: Tạo một component/utility class sticky chuẩn cho project và tái sử dụng, tránh phải debug nhiều lần.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph"><strong>Chúc bạn code vui! 🚀</strong></p>
<p>The post <a href="https://blog.tomosia.com.vn/tai-sao-position-sticky-cua-ban-khong-hoat-dong/">Tại sao position: sticky của bạn không hoạt động ?</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.tomosia.com.vn/tai-sao-position-sticky-cua-ban-khong-hoat-dong/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Sử dụng :where() và :is() trong CSS Selector &#8211; Ngắn gọn và mạnh mẽ</title>
		<link>https://blog.tomosia.com.vn/su-dung-where-va-is-trong-css-selector-ngan-gon-va-manh-me/</link>
					<comments>https://blog.tomosia.com.vn/su-dung-where-va-is-trong-css-selector-ngan-gon-va-manh-me/#comments</comments>
		
		<dc:creator><![CDATA[Dang Van Luan]]></dc:creator>
		<pubDate>Tue, 28 Nov 2023 06:10:35 +0000</pubDate>
				<category><![CDATA[Html/CSS]]></category>
		<category><![CDATA[css selector]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[html]]></category>
		<guid isPermaLink="false">https://blog.tomosia.com.vn/?p=1998</guid>

					<description><![CDATA[<p>CSS (Cascading Style Sheets) ngày càng phát triển với những tính năng mới, và một số pseudo-classes mới&#8230;</p>
<p>The post <a href="https://blog.tomosia.com.vn/su-dung-where-va-is-trong-css-selector-ngan-gon-va-manh-me/">Sử dụng :where() và :is() trong CSS Selector &#8211; Ngắn gọn và mạnh mẽ</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"> CSS (Cascading Style Sheets) ngày càng phát triển với những tính năng mới, và một số pseudo-classes mới như <code>:where()</code> và <code>:is()</code> đã giúp làm cho việc chọn lựa và áp dụng kiểu cho các phần tử trở nên linh hoạt và dễ dàng hơn. Trong bài viết này, chúng ta sẽ khám phá cách sử dụng <code>:where()</code> và <code>:is()</code> để tối ưu hóa CSS selector.</p>



<h3 id="i-tai-sao-chung-ta-can-where-va-is" class="wp-block-heading">I. <strong>Tại sao chúng ta cần <code>:where()</code> và <code>:is()</code>?</strong></h3>



<p class="wp-block-paragraph">Trước khi có những pseudo-classes này, để áp dụng kiểu cho nhiều selector, chúng ta thường phải sử dụng một danh sách dài các selector, đôi khi dẫn đến mã CSS dài và khó đọc. Cùng xem xét một ví dụ:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:8.4296875px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">CSS</span><span role="button" tabindex="0" data-code="h1, h2, h3, h4, h5, h6 {
  color: blue;
}" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">h1</span><span style="color: #F6F6F4">,</span><span style="color: #F286C4"> h2</span><span style="color: #F6F6F4">,</span><span style="color: #F286C4"> h3</span><span style="color: #F6F6F4">,</span><span style="color: #F286C4"> h4</span><span style="color: #F6F6F4">,</span><span style="color: #F286C4"> h5</span><span style="color: #F6F6F4">,</span><span style="color: #F286C4"> h6</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #97E1F1">color</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">blue</span><span style="color: #F6F6F4">;</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">Trong trường hợp này, chúng ta muốn áp dụng màu xanh cho tất cả các phần tử tiêu đề từ h1 đến h6. Tuy nhiên, khi cần loại bỏ một số phần tử khỏi danh sách, chúng ta phải lặp lại toàn bộ danh sách và loại bỏ chúng:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:8.4296875px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">CSS</span><span role="button" tabindex="0" data-code="h1, h2, h3, h5, h6 {
  color: blue;
}" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">h1</span><span style="color: #F6F6F4">,</span><span style="color: #F286C4"> h2</span><span style="color: #F6F6F4">,</span><span style="color: #F286C4"> h3</span><span style="color: #F6F6F4">,</span><span style="color: #F286C4"> h5</span><span style="color: #F6F6F4">,</span><span style="color: #F286C4"> h6</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #97E1F1">color</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">blue</span><span style="color: #F6F6F4">;</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">Với <code>:where()</code> và <code>:is()</code>, chúng ta có cách tiếp cận mới giúp giảm sự lặp lại và làm cho mã CSS trở nên sáng sủa hơn.</p>



<h3 id="ii-su-dung-where-va-is" class="wp-block-heading">II. <strong>Sử Dụng <code>:where()</code> và <code>:is()</code></strong></h3>



<h4 id="1-su-dung-where" class="wp-block-heading">1. <strong>Sử dụng <code>:where()</code></strong></h4>



<p class="wp-block-paragraph">Cú pháp của <code>:where()</code> rất đơn giản. Nó cho phép bạn nhóm các selector lại một cách hiệu quả mà không cần phải lặp lại toàn bộ danh sách:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:8.4296875px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">CSS</span><span role="button" tabindex="0" data-code=":where(h1, h2, h3, h4, h5, h6) {
  color: blue;
}" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4; font-style: italic">:</span><span style="color: #62E884; font-style: italic">where</span><span style="color: #F286C4">(h1</span><span style="color: #F6F6F4">,</span><span style="color: #F286C4"> h2</span><span style="color: #F6F6F4">,</span><span style="color: #F286C4"> h3</span><span style="color: #F6F6F4">,</span><span style="color: #F286C4"> h4</span><span style="color: #F6F6F4">,</span><span style="color: #F286C4"> h5</span><span style="color: #F6F6F4">,</span><span style="color: #F286C4"> h6)</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #97E1F1">color</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">blue</span><span style="color: #F6F6F4">;</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">Câu lệnh trên sẽ có kết quả giống như ví dụ đầu tiên, áp dụng màu xanh cho tất cả các phần tử tiêu đề từ h1 đến h6</p>



<h4 id="2-su-dung-is" class="wp-block-heading">2. <strong>Sử dụng <code>:is()</code></strong></h4>



<p class="wp-block-paragraph">Tương tự như <code>:where()</code>, <code>:is()</code> cung cấp một cách khác để nhóm các selector:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:8.4296875px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">CSS</span><span role="button" tabindex="0" data-code=":is(h1, h2, h3, h4, h5, h6) {
  color: blue;
}" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4; font-style: italic">:</span><span style="color: #62E884; font-style: italic">is</span><span style="color: #F286C4">(h1</span><span style="color: #F6F6F4">,</span><span style="color: #F286C4"> h2</span><span style="color: #F6F6F4">,</span><span style="color: #F286C4"> h3</span><span style="color: #F6F6F4">,</span><span style="color: #F286C4"> h4</span><span style="color: #F6F6F4">,</span><span style="color: #F286C4"> h5</span><span style="color: #F6F6F4">,</span><span style="color: #F286C4"> h6)</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #97E1F1">color</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">blue</span><span style="color: #F6F6F4">;</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">Cả hai cách tiếp cận đều tạo ra kết quả tương tự và giúp bạn làm cho mã CSS ngắn gọn hơn và dễ đọc hơn.</p>



<h3 id="iii-uu-diem-va-luu-y" class="wp-block-heading">III. <strong>Ưu điểm và Lưu ý</strong></h3>



<h4 id="1-ngan-gon-va-de-doc" class="wp-block-heading">1. <strong>Ngắn Gọn và Dễ Đọc:</strong></h4>



<p class="wp-block-paragraph">Cả <code>:where()</code> và <code>:is()</code> giúp giảm sự lặp lại trong mã CSS, làm cho nó trở nên ngắn gọn và dễ đọc hơn.</p>



<h4 id="2-tich-hop-de-dang" class="wp-block-heading">2. <strong>Tích hợp Dễ Dàng:</strong></h4>



<p class="wp-block-paragraph">Cả hai pseudo-classes này tích hợp tốt với các selector khác, giúp bạn duy trì tính tương thích và tính linh hoạt trong mã nguồn của mình.</p>



<h4 id="3-de-bao-tri" class="wp-block-heading">3. <strong>Dễ Bảo Trì:</strong></h4>



<p class="wp-block-paragraph">Khi cần thêm hoặc loại bỏ các selector, bạn chỉ cần thực hiện thay đổi ở một địa điểm duy nhất, giúp dễ bảo trì hơn.</p>



<h4 id="4-trinh-duyet-ho-tro" class="wp-block-heading">4. <strong>Trình duyệt hỗ trợ:</strong></h4>



<p class="wp-block-paragraph"><strong>:where()</strong></p>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="327" src="http://blog.tomosia.com.vn/wp-content/uploads/2023/11/where_support-1024x327.png" alt="" class="wp-image-2030" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2023/11/where_support-1024x327.png 1024w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/where_support-300x96.png 300w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/where_support-768x245.png 768w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/where_support-380x121.png 380w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/where_support-800x255.png 800w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/where_support-1160x370.png 1160w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/where_support.png 1382w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph"><strong>:is()</strong></p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="354" src="http://blog.tomosia.com.vn/wp-content/uploads/2023/11/is_support-1024x354.png" alt="" class="wp-image-2031" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2023/11/is_support-1024x354.png 1024w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/is_support-300x104.png 300w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/is_support-768x266.png 768w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/is_support-380x131.png 380w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/is_support-800x277.png 800w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/is_support-1160x401.png 1160w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/is_support.png 1368w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h3 id="iv-ket-luan" class="wp-block-heading">IV. <strong>Kết Luận</strong></h3>



<p class="wp-block-paragraph">Sử dụng <code>:where()</code> và <code>:is()</code> trong CSS selector mang lại những lợi ích đáng kể về sự ngắn gọn và dễ đọc. Đặc biệt, chúng là một công cụ hữu ích khi bạn cần áp dụng kiểu cho nhiều phần tử cùng loại một cách linh hoạt. Hãy tích hợp chúng vào công cụ lập trình CSS của bạn để trải nghiệm sự tiện lợi mà chúng mang lại.</p>
<p>The post <a href="https://blog.tomosia.com.vn/su-dung-where-va-is-trong-css-selector-ngan-gon-va-manh-me/">Sử dụng :where() và :is() trong CSS Selector &#8211; Ngắn gọn và mạnh mẽ</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.tomosia.com.vn/su-dung-where-va-is-trong-css-selector-ngan-gon-va-manh-me/feed/</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
			</item>
		<item>
		<title>Khám Phá CSS Parent Selector :has()</title>
		<link>https://blog.tomosia.com.vn/kham-pha-css-parent-selector-has/</link>
					<comments>https://blog.tomosia.com.vn/kham-pha-css-parent-selector-has/#comments</comments>
		
		<dc:creator><![CDATA[Dang Van Luan]]></dc:creator>
		<pubDate>Tue, 28 Nov 2023 06:07:36 +0000</pubDate>
				<category><![CDATA[Html/CSS]]></category>
		<category><![CDATA[css selector]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[html]]></category>
		<guid isPermaLink="false">https://blog.tomosia.com.vn/?p=2036</guid>

					<description><![CDATA[<p>CSS, ngôn ngữ định dạng trang web mạnh mẽ, ngày càng được cải tiến với những tính năng&#8230;</p>
<p>The post <a href="https://blog.tomosia.com.vn/kham-pha-css-parent-selector-has/">Khám Phá CSS Parent Selector :has()</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">CSS, ngôn ngữ định dạng trang web mạnh mẽ, ngày càng được cải tiến với những tính năng mới giúp lập trình viên tối ưu hóa mã CSS của mình. Một trong những thêm mới gần đây là pseudo-class <code>:has()</code>, mang lại khả năng lựa chọn các phần tử dựa trên nội dung của chúng. Trong bài viết này, chúng ta sẽ chi tiết tìm hiểu về cú pháp và ứng dụng của <code>:has()</code>.</p>



<h3 id="i-gioi-thieu-ve-has" class="wp-block-heading">I. <strong>Giới Thiệu về :has()</strong></h3>



<p class="wp-block-paragraph"><code>:has()</code> là một pseudo-class mới trong CSS, cho phép bạn chọn các phần tử cha dựa trên nội dung của các phần tử con bên trong chúng. Cú pháp cơ bản như sau:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:8.4296875px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">CSS</span><span role="button" tabindex="0" data-code="parent:has(child) {
  /* CSS styles */ 
}" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">parent</span><span style="color: #F286C4; font-style: italic">:</span><span style="color: #62E884; font-style: italic">has</span><span style="color: #F286C4">(child)</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #7B7F8B">/* CSS styles */</span><span style="color: #F6F6F4"> </span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">Với <code>:has()</code>, bạn có thể áp dụng kiểu cho các phần tử cha chứa một hoặc nhiều phần tử con cụ thể, làm cho việc chọn lựa và định dạng trang web trở nên linh hoạt hơn.</p>



<h3 id="ii-su-dung-cu-phap-has" class="wp-block-heading">II. <strong>Sử Dụng Cú Pháp :has()</strong></h3>



<h4 id="1-chon-parent-co-phan-tu-con-cu-the" class="wp-block-heading">1. <strong>Chọn Parent Có Phần Tử Con Cụ Thể</strong></h4>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:8.4296875px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">CSS</span><span role="button" tabindex="0" data-code="div:has(p) {
  background-color: #f0f0f0;
}" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">div</span><span style="color: #F286C4; font-style: italic">:</span><span style="color: #62E884; font-style: italic">has</span><span style="color: #F286C4">(p)</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #97E1F1">background-color</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">#f0f0f0</span><span style="color: #F6F6F4">;</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">Trong trường hợp này, tất cả các <code>div</code> chứa ít nhất một phần tử <code>p</code> sẽ có nền màu xám nhạt.</p>



<h4 id="2-ket-hop-nhieu-phan-tu-con" class="wp-block-heading">2. <strong>Kết Hợp Nhiều Phần Tử Con</strong></h4>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:8.4296875px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">CSS</span><span role="button" tabindex="0" data-code="article:has(h2, p) {
  border: 1px solid #ccc;
}" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">article</span><span style="color: #F286C4; font-style: italic">:</span><span style="color: #62E884; font-style: italic">has</span><span style="color: #F286C4">(h2</span><span style="color: #F6F6F4">,</span><span style="color: #F286C4"> p)</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #97E1F1">border</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">1</span><span style="color: #F286C4">px</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">solid</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">#ccc</span><span style="color: #F6F6F4">;</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">Câu lệnh trên sẽ chọn tất cả các phần tử <code>article</code> chứa ít nhất một phần tử <code>h2</code> hoặc <code>p</code> và áp dụng đường viền xám nhạt.</p>



<h4 id="3-su-dung-nested-has" class="wp-block-heading">3. <strong>Sử Dụng Nested :has()</strong></h4>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:8.4296875px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">CSS</span><span role="button" tabindex="0" data-code="section:has(article:has(h2)) {
  margin: 10px;
}" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">section</span><span style="color: #F286C4; font-style: italic">:</span><span style="color: #62E884; font-style: italic">has</span><span style="color: #F286C4">(article</span><span style="color: #F286C4; font-style: italic">:</span><span style="color: #62E884; font-style: italic">has</span><span style="color: #F286C4">(h2))</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #97E1F1">margin</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">10</span><span style="color: #F286C4">px</span><span style="color: #F6F6F4">;</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">Trong trường hợp này, <code>section</code> sẽ được chọn nếu nó chứa ít nhất một <code>article</code> có chứa ít nhất một phần tử <code>h2</code>.</p>



<h3 id="iii-uu-diem-va-han-che" class="wp-block-heading">III. <strong>Ưu Điểm và Hạn Chế</strong></h3>



<h4 id="1-uu-diem-cua-has" class="wp-block-heading">1. <strong>Ưu Điểm của :has()</strong></h4>



<ul class="wp-block-list">
<li><strong>Linh Hoạt:</strong> Cho phép bạn chọn các phần tử cha dựa trên nội dung của phần tử con, mang lại sự linh hoạt cao khi định dạng trang web.</li>



<li><strong>Dễ Đọc:</strong> Làm cho mã CSS trở nên rõ ràng hơn, giảm sự phức tạp của selector.</li>
</ul>



<h4 id="2-han-che-va-luu-y" class="wp-block-heading">2. <strong>Hạn Chế và Lưu ý</strong></h4>



<ul class="wp-block-list">
<li><strong>Hạn Chế Sự Linh Hoạt:</strong> Mặc dù mạnh mẽ, nhưng <code>:has()</code> có thể hạn chế sự linh hoạt khi so sánh với một số phương pháp khác như JavaScript.</li>



<li><strong>Hỗ Trợ Trình Duyệt:</strong> Hiện tại, <code>:has()</code> chưa được hỗ trợ rộng rãi, vì vậy hãy kiểm tra hỗ trợ trình duyệt trước khi sử dụng.</li>
</ul>



<h4 id="3-trinh-duyet-ho-tro" class="wp-block-heading">3. Trình duyệt hỗ trợ</h4>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="422" src="http://blog.tomosia.com.vn/wp-content/uploads/2023/11/has_supprot-1024x422.png" alt="" class="wp-image-2038" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2023/11/has_supprot-1024x422.png 1024w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/has_supprot-300x124.png 300w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/has_supprot-768x317.png 768w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/has_supprot-380x157.png 380w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/has_supprot-800x330.png 800w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/has_supprot-1160x478.png 1160w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/has_supprot.png 1370w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h3 id="iv-ket-luan" class="wp-block-heading">IV. <strong>Kết Luận</strong></h3>



<p class="wp-block-paragraph">Pseudo-class <code>:has()</code> mang lại một cách tiếp cận mới và thú vị cho việc chọn các phần tử cha dựa trên nội dung của phần tử con trong CSS. Tuy nhiên, đối với sự hỗ trợ và linh hoạt, cân nhắc kết hợp <code>:has()</code> với các phương pháp khác để đảm bảo tính ổn định và tương thích trình duyệt. Hãy thử nghiệm và tận dụng sức mạnh của <code>:has()</code> để tối ưu hóa mã CSS của bạn.</p>
<p>The post <a href="https://blog.tomosia.com.vn/kham-pha-css-parent-selector-has/">Khám Phá CSS Parent Selector :has()</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.tomosia.com.vn/kham-pha-css-parent-selector-has/feed/</wfw:commentRss>
			<slash:comments>7</slash:comments>
		
		
			</item>
		<item>
		<title>Tối ưu cách viết CSS</title>
		<link>https://blog.tomosia.com.vn/toi-uu-cach-viet-css/</link>
					<comments>https://blog.tomosia.com.vn/toi-uu-cach-viet-css/#comments</comments>
		
		<dc:creator><![CDATA[Anh Le]]></dc:creator>
		<pubDate>Thu, 12 Oct 2023 01:53:39 +0000</pubDate>
				<category><![CDATA[Html/CSS]]></category>
		<guid isPermaLink="false">https://blog.tomosia.com.vn/?p=1177</guid>

					<description><![CDATA[<p>CSS có thể làm cho một trang web HTML nhàm chán thành các trang web sinh động, nhưng&#8230;</p>
<p>The post <a href="https://blog.tomosia.com.vn/toi-uu-cach-viet-css/">Tối ưu cách viết CSS</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">CSS có thể làm cho một trang web HTML nhàm chán thành các trang web sinh động, nhưng việc sử dụng CSS không đúng cách cũng có thể khiến trang web của bạn gặp vấn đề ngay trước cả khi trang web của bạn được render. Ngoài tối ưu thuật toán, xử lý ở phần controller, model hoặc cơ sở dữ liệu thì CSS cũng cần được tối ưu hóa để giúp trang web chạy nhanh hơn.<br>Chính vì vậy, bài viết này sẽ đưa tới cho bạn các tips để tối ưu hóa CSS một cách hiệu quả.</p>



<h5 id="basic" class="wp-block-heading"><strong>Basic</strong></h5>



<p class="wp-block-paragraph">CSS không phải nguyên nhân trực tiếp gây ra vấn đề khi load trang web, nhưng bạn vẫn nên tối ưu những phần nặng của dữ liệu mà CSS có thể chứa như: Xử dung CDN, xoá các tệp không xử dụng đến, thay đổi kích thước hình ảnh, xử dụng thumbnail, giảm thiểu số file css nếu có thể,&#8230;</p>



<p class="wp-block-paragraph">Tuân thủ một số quy tắc trong style coding conventions cũng là một điều nên nhớ, dưới đây là một số quy tắc bạn có thể tham khảo:</p>



<ul class="wp-block-list">
<li>Lùi vào 2 space (khoảng trống) cho mỗi thuộc tính</li>



<li>Sử dụng ngoặc kép thay vì sử dụng ngoặc đơn (font-family: &#8220;Arial Black&#8221;, input[type=&#8221;checkbox&#8221;])</li>



<li>Đặt một dấu cách ở đằng sau dấu :</li>



<li>Đặt một dấu cách ở trước dấu {</li>



<li>Kết thúc định nghĩa các thuộc tính bằng một dấu chấm phẩy (mặc dù việc thêm dấu chấm phẩy là không bắt buộc nhé)</li>



<li>Sử dụng các cú pháp ngắn gọn nếu có thể ví dụ như (padding, margin&#8230;)</li>



<li>Chỉ khai báo mỗi dòng một thuộc tính (dễ nhìn, nếu lỗi có thể biết lỗi được ở dòng nào thuộc tính nào)</li>



<li>Code thêm những thuộc tính khác mà trình duyệt này hỗ trợ mà trình duyệt khác không hỗ trợ</li>



<li>Giữa các khối CSS nên có một khoảng trắng</li>



<li>Khuyến khích sử dụng mã màu (#fff)</li>



<li>&#8230;</li>
</ul>



<h5 id="css-pre-processors" class="wp-block-heading"><strong>CSS Pre-Processors</strong></h5>



<p class="wp-block-paragraph">CSS Pre-Processors là một ngôn ngữ tiền xử lý CSS, các bạn có thể hiểu nó là một kiểu viết mở rộng, nâng cấp hơn so với CSS. Mục đích của CSS Pre-Processors được sinh ra nhằm mục đích đưa các đoạn code CSS trở nên giống hơn một ngôn ngữ lập trình, và cách viết này sẽ biên dịch lại thành các đoạn code CSS bình thường.</p>



<p class="wp-block-paragraph">Để áp dụng các CSS Pre-Processors vào dự án của bạn thì có vài công cụ nổi tiếng giúp các bạn áp dụng vào dự án như: SCSS, SASS, LESS, Stylus&#8230; Trong bài này mình sẽ giới thiệu về SCSS/SASS.</p>



<p class="wp-block-paragraph">Tất nhiên là phải có những lợi ích nhất định của CSS Pre-Processors thì nó mới được áp dụng vào các dự án như:</p>



<ul class="wp-block-list">
<li>Cải thiện thời gian viết CSS</li>



<li>Linh hoạt hơn và có khả năng sử dụng lại code</li>



<li>Dễ dàng bảo trì cũng như là phát triển</li>



<li>Cấu trúc viết code rõ ràng, dễ nhìn hơn rất nhiền</li>



<li>Hạn chế được những đoạn code trùng lặp, file code nhỏ gọn.</li>
</ul>



<h6 id="sass" class="wp-block-heading"><strong>SASS</strong></h6>



<p class="wp-block-paragraph">SASS là viết tắt của Syntactically Awesome StyleSheets là một CSS Pre-Processors nổi tiếng được biết đến trong giới Front-end Developer. SASS được sinh ra bởi lập trình viên Ruby, nếu như bạn đã làm việc với Ruby thì ắt hẳn sẽ biết tới các template phổ biến như HAML hay SLIM.</p>



<p class="wp-block-paragraph">Tại sao mà mình lại nhắc đến Ruby, nó liên quan gì đến CSS thì mình xin giải thích đó chính là đến từ cú pháp. Ví dụ như khi viết SLIM các bạn sẽ không cần các dấu đóng thẻ, hay dấu chấm phẩy, hay nhận biết các thẻ con bằng cách lùi dòng vào&#8230; Điều này chính là những kiểu viết của SASS.</p>



<p class="wp-block-paragraph">Ví dụ như thế này</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code=".nav

  width: 100%

  height: 100%

  float: right

  p

    color: #e1e1e1

    font-size: 14px;" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F8F8F2">.nav</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">  width: </span><span style="color: #BD93F9">100</span><span style="color: #FF79C6">%</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">  height: </span><span style="color: #BD93F9">100</span><span style="color: #FF79C6">%</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">  float: right</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">  p</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    color: #e1e1e1</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    font</span><span style="color: #FF79C6">-</span><span style="color: #F8F8F2">size: 14px;</span></span></code></pre></div>



<h6 id="scss" class="wp-block-heading"><strong>SCSS</strong></h6>



<p class="wp-block-paragraph">Một phần không nhỏ developer không thích cách viết của SASS lắm vì nó mang lại cảm giác đọc hơi rối cả khó hiểu, có lẽ chính vì thế nên đã có sự nâng cấp tuyệt vời đến từ SCSS.</p>



<p class="wp-block-paragraph">SCSS hay còn gọi là Sassy CSS, có cú pháp giống với CSS hơn là SASS giúp chúng ta tiếp cận dễ hơn rất nhiều. Hiểu đơn giản thì SCSS là một phiên bản nâng cấp của SASS.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code=".nav {

  width: 100%;

  height: 100%;

  float: right;

  p {

    color: #e1e1e1

    font-size: 14px;

  }

}" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F8F8F2">.nav {</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">  width: </span><span style="color: #BD93F9">100</span><span style="color: #FF79C6">%</span><span style="color: #F8F8F2">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">  height: </span><span style="color: #BD93F9">100</span><span style="color: #FF79C6">%</span><span style="color: #F8F8F2">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">  float: right;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">  p {</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    color: #e1e1e1</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    font</span><span style="color: #FF79C6">-</span><span style="color: #F8F8F2">size: 14px;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">  }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">}</span></span></code></pre></div>



<h6 id="su-khac-biet-co-ban-cua-scss-va-sass" class="wp-block-heading"><strong>Sự khác biệt cơ bản của SCSS và SASS</strong></h6>



<p class="wp-block-paragraph">Qua 2 phần giới thiệu ở trên thì phần nào các bạn cũng đã hiểu hiểu SCSS và SASS là gì và cách viết như thế nào. Ở phần này mình xin tóm tắt lại chút sự khác biệt để các bạn có cái nhìn tổng quát hơn.</p>



<p class="wp-block-paragraph">SASS:</p>



<ul class="wp-block-list">
<li>Cú pháp ngắn gọn hơn</li>



<li>Sử dụng indent để thể hiện quy tắc xếp chồng (nested rules)</li>



<li>Khi kết thúc một property thì không cần dấu ; để kết thúc</li>



<li>Khai báo mixins bằng ký tự =</li>



<li>Sử dụng mixins bằng ký tự +</li>
</ul>



<p class="wp-block-paragraph">SCSS</p>



<ul class="wp-block-list">
<li>Cú pháp gần với CSS hơn</li>



<li>Sử dụng cặp dấu {} để thể hiện quy tắc xếp chồng</li>



<li>Kết thúc 1 khai báo property CSS bằng dấu ;</li>



<li>Khai báo mixins bằng cú pháp @mixins ten-mixins</li>



<li>Sử dụng mixins bằng cú pháp @include ten-mixins</li>
</ul>



<h6 id="su-dung-variables" class="wp-block-heading"><strong>Sử dụng variables</strong></h6>



<p class="wp-block-paragraph">Bây giờ mình bắt đầu giới thiệu những thứ hay ho để giúp bạn viết CSS chuyên nghiệp hơn, hay ho hơn.</p>



<p class="wp-block-paragraph">Để bắt đầu thì mình xin giới thiệu về variables. Đến CSS mà còn có cả variables (biến) thì cũng hơi bị thú vị rồi đấy.</p>



<p class="wp-block-paragraph">Giả sử như dự án của bạn dùng đến cả trăm chỗ có thể sử dụng cùng một giá trị màu chả hạn, đối với các mã màu đơn giản thì các bạn nhớ được thôi chứ ví dụ có những mà màu rắc rối giả sử như DEFQ13 chả hạn, thì nhớ làm sao được, nhà còn bao việc 😄</p>



<p class="wp-block-paragraph">Để tối ưu hơn trong việc này chúng ta sẽ đặt cái mã màu này trong một biến, giúp chúng ta thuận tiện sử dụng hơn nhiều.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="$text-grey: #e1e1e1;

/* Sử dụng */

p {

  color: $text-grey;

}

div.container a {

  color: $text-grey;

}" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F8F8F2">$text</span><span style="color: #FF79C6">-</span><span style="color: #F8F8F2">grey: #e1e1e1;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6272A4">/* Sử dụng */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">p {</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">  color: $text</span><span style="color: #FF79C6">-</span><span style="color: #F8F8F2">grey;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">div.container a {</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">  color: $text</span><span style="color: #FF79C6">-</span><span style="color: #F8F8F2">grey;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">}</span></span></code></pre></div>



<p class="wp-block-paragraph">&#8230;</p>



<p class="wp-block-paragraph">Viết đơn giản không phải cầu kì.</p>



<h6 id="mixins" class="wp-block-heading"><strong>Mixins</strong></h6>



<p class="wp-block-paragraph">Mình từng nói ở trên là CSS Pre-Processors giúp chúng ta có thể tái sử dụng code. Mixins chính là cách để giúp chúng ta có thể làm được việc này một cách đơn giản.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="@mixin bordered {

  border: 1px solid #ddd;
  
  &amp;:hover {
  
  border-color: #999;
  
  }

}

/*Sử dụng chỉ cần include mixins đã khai báo*/

div {

    @include bordered;

}" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F8F8F2">@</span><span style="color: #50FA7B; font-style: italic">mixin</span><span style="color: #F8F8F2"> bordered {</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">  border: 1px solid #ddd;</span></span>
<span class="line"><span style="color: #F8F8F2">  </span></span>
<span class="line"><span style="color: #F8F8F2">  </span><span style="color: #FF79C6">&amp;</span><span style="color: #F8F8F2">:hover {</span></span>
<span class="line"><span style="color: #F8F8F2">  </span></span>
<span class="line"><span style="color: #F8F8F2">  border</span><span style="color: #FF79C6">-</span><span style="color: #F8F8F2">color: #</span><span style="color: #BD93F9">999</span><span style="color: #F8F8F2">;</span></span>
<span class="line"><span style="color: #F8F8F2">  </span></span>
<span class="line"><span style="color: #F8F8F2">  }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6272A4">/*Sử dụng chỉ cần include mixins đã khai báo*/</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">div {</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    @</span><span style="color: #50FA7B; font-style: italic">include</span><span style="color: #F8F8F2"> bordered;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">}</span></span></code></pre></div>



<p class="wp-block-paragraph">Thậm chí chúng ta có thể truyền cả tham số vào mixins.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="@mixin bordered($width) {

  border: $width solid #ddd;
  
  &amp;:hover {
  
    border-color: #999;
    
  }
  
}

/*Sử dụng chỉ cần include mixins đã khai báo*/

div {
  @include bordered(1px);
}" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F8F8F2">@</span><span style="color: #50FA7B; font-style: italic">mixin</span><span style="color: #F8F8F2"> </span><span style="color: #50FA7B">bordered</span><span style="color: #F8F8F2">($width) {</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">  border: $width solid #ddd;</span></span>
<span class="line"><span style="color: #F8F8F2">  </span></span>
<span class="line"><span style="color: #F8F8F2">  </span><span style="color: #FF79C6">&amp;</span><span style="color: #F8F8F2">:hover {</span></span>
<span class="line"><span style="color: #F8F8F2">  </span></span>
<span class="line"><span style="color: #F8F8F2">    border</span><span style="color: #FF79C6">-</span><span style="color: #F8F8F2">color: #</span><span style="color: #BD93F9">999</span><span style="color: #F8F8F2">;</span></span>
<span class="line"><span style="color: #F8F8F2">    </span></span>
<span class="line"><span style="color: #F8F8F2">  }</span></span>
<span class="line"><span style="color: #F8F8F2">  </span></span>
<span class="line"><span style="color: #F8F8F2">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6272A4">/*Sử dụng chỉ cần include mixins đã khai báo*/</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">div {</span></span>
<span class="line"><span style="color: #F8F8F2">  @</span><span style="color: #50FA7B; font-style: italic">include</span><span style="color: #F8F8F2"> </span><span style="color: #50FA7B">bordered</span><span style="color: #F8F8F2">(1px);</span></span>
<span class="line"><span style="color: #F8F8F2">}</span></span></code></pre></div>



<h6 id="nested" class="wp-block-heading"><strong>Nested</strong></h6>



<p class="wp-block-paragraph">Khi mà mới học lập trình HTML, CSS thì mình đã từng thế này, và mình nghĩ cũng nhiều bạn đã từng như mình.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="&lt;div class=&quot;container&quot;&gt;

    &lt;ul class=&quot;nav&quot;&gt;

        &lt;li class=&quot;item&quot;&gt;

            &lt;a class=&quot;item-children&quot;&gt;Hello&lt;/a&gt;

        &lt;/li&gt;

    &lt;/ul&gt;

&lt;/div&gt;" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F8F8F2">&lt;</span><span style="color: #FF79C6">div</span><span style="color: #F8F8F2"> </span><span style="color: #50FA7B; font-style: italic">class</span><span style="color: #FF79C6">=</span><span style="color: #E9F284">&quot;</span><span style="color: #F1FA8C">container</span><span style="color: #E9F284">&quot;</span><span style="color: #F8F8F2">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    &lt;</span><span style="color: #FF79C6">ul</span><span style="color: #F8F8F2"> </span><span style="color: #50FA7B; font-style: italic">class</span><span style="color: #FF79C6">=</span><span style="color: #E9F284">&quot;</span><span style="color: #F1FA8C">nav</span><span style="color: #E9F284">&quot;</span><span style="color: #F8F8F2">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        &lt;</span><span style="color: #FF79C6">li</span><span style="color: #F8F8F2"> </span><span style="color: #50FA7B; font-style: italic">class</span><span style="color: #FF79C6">=</span><span style="color: #E9F284">&quot;</span><span style="color: #F1FA8C">item</span><span style="color: #E9F284">&quot;</span><span style="color: #F8F8F2">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">            &lt;</span><span style="color: #FF79C6">a</span><span style="color: #F8F8F2"> </span><span style="color: #50FA7B; font-style: italic">class</span><span style="color: #FF79C6">=</span><span style="color: #E9F284">&quot;</span><span style="color: #F1FA8C">item-children</span><span style="color: #E9F284">&quot;</span><span style="color: #F8F8F2">&gt;Hello&lt;/</span><span style="color: #FF79C6">a</span><span style="color: #F8F8F2">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        &lt;/</span><span style="color: #FF79C6">li</span><span style="color: #F8F8F2">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    &lt;/</span><span style="color: #FF79C6">ul</span><span style="color: #F8F8F2">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">&lt;/</span><span style="color: #FF79C6">div</span><span style="color: #F8F8F2">&gt;</span></span></code></pre></div>



<p class="wp-block-paragraph">Xong khi viết CSS sẽ dạng dạng như thế này.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code=".container {

  width: 100%;

}

.container .nav {

  font-size: 14px;

}

.container .nav .item {

  float: left;

}

.container .nav .item .children {

  texx-decoration: none

}" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F8F8F2">.container {</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">  width: </span><span style="color: #BD93F9">100</span><span style="color: #FF79C6">%</span><span style="color: #F8F8F2">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">.container .nav {</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">  font</span><span style="color: #FF79C6">-</span><span style="color: #F8F8F2">size: 14px;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">.container .nav .item {</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">  float: left;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">.container .nav .item .children {</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">  texx</span><span style="color: #FF79C6">-</span><span style="color: #F8F8F2">decoration: none</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">}</span></span></code></pre></div>



<p class="wp-block-paragraph">Nhìn đoạn code trên có khiếp không, lặp đi lặp lại các selector, đó là chỉ với trường hợp mình có 4 item con con bên trong. Chả lẽ giờ có đến chục item con con bên trong các bạn cũng viết kiểu như thế này thì rõ ràng là không hề ổn chút nào. Lúc người khác đọc lại code phải dò dò xem đâu là cha của nó các kiểu con đà điểu thì sẽ rất mất thời gian.</p>



<p class="wp-block-paragraph">Nếu như ai còn đang viết kiểu như thế mình khuyên nên bỏ đi và áp dụng ngay kiểu nested rules như sau đây.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code=".container {

    width: 100%;

    .nav {

        font-size: 14px;

        .item {

            float: left;

            .children {

                text-decoration: none;

            }

        }

    }

}" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F8F8F2">.container {</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    width: </span><span style="color: #BD93F9">100</span><span style="color: #FF79C6">%</span><span style="color: #F8F8F2">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    .nav {</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        font</span><span style="color: #FF79C6">-</span><span style="color: #F8F8F2">size: 14px;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        .item {</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">            float: left;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">            .children {</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">                text</span><span style="color: #FF79C6">-</span><span style="color: #F8F8F2">decoration: none;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">            }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">        }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">}</span></span></code></pre></div>



<p class="wp-block-paragraph">Nhìn trông code có phải gọn gàng, dễ quản lí và chuyên nghiệp hơn chút rồi đấy. Hãy áp dụng nhé các bạn.</p>



<p class="wp-block-paragraph">Ngoài ra còn rất nhiều các tính năng khác mà các bạn có thể lên trang chủ của nó tìm đọc nếu muốn.</p>



<h5 id="ki-thuat-oocss" class="wp-block-heading"><strong>Kĩ thuật OOCSS</strong></h5>



<p class="wp-block-paragraph">OOCSS là viết tắt của Object-Oriented CSS, hướng đối tượng trong CSS. Cụ thể mà tính chất hướng đối tượng này đó là tính kế thừa.</p>



<p class="wp-block-paragraph">Kĩ thuật này được sinh ra nhằm hạn chế việc trùng lặp code.</p>



<p class="wp-block-paragraph">Khai báo class bổ trợ.</p>



<p class="wp-block-paragraph">Nếu bạn nào đã sử dụng Bootstrap thì đây chính là kinh nghiệm khá hay mà chúng ta có thể học hỏi từ Bootstrap.</p>



<p class="wp-block-paragraph">Viết cs ngắn gọn</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="&lt;!DOCTYPE html&gt;

&lt;html&gt;

  &lt;head&gt;
  
    &lt;style&gt;
    
    body {
      /* Thay vì viết từng thuộc tính */
    
      font-style: italic;
    
      font-weight: bold;
    
      font-size: .8em;
    
      line-height: 1.2;
    
      font-family: Arial, sans-serif;
    
      background-image: url(&quot;https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSjnIfv9UzLhhQwAG_0mxil1Z5KyQT7xROTYA&amp;usqp=CAU&quot;);
  
      background-repeat: no-repeat;
  
      background-position: center center;
  
      background-attachment: fixed;
    
      background-color: #fff;
      /* thì chúng ta có thể viết gọn lại như sau */
  
      font: italic bold .8em/1.2 Arial, sans-serif;
    
      background: #fff url(&quot;https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSjnIfv9UzLhhQwAG_0mxil1Z5KyQT7xROTYA&amp;usqp=CAU&quot;) no-repeat fixed center center;
    
    }
    
    h1 {
    
      color: green;
    
      text-align: center;
    
    }
    
    p {
    
      font-family: verdana;
    
      font-size: 20px;
    
      position: fixed;
    
      bottom: 0;
    
      text-align: center;
    
      width: 100%;
    
    }
    
    &lt;/style&gt;
  
  &lt;/head&gt;

  &lt;body&gt;
  
    &lt;h1&gt;Welcome to&lt;/h1&gt;
    
    &lt;p&gt;All Rights Reserved&lt;/p&gt;
  
  &lt;/body&gt;

&lt;/html&gt;" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #FF79C6">&lt;!</span><span style="color: #F8F8F2">DOCTYPE html</span><span style="color: #FF79C6">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">&lt;</span><span style="color: #FF79C6">html</span><span style="color: #F8F8F2">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">  &lt;</span><span style="color: #FF79C6">head</span><span style="color: #F8F8F2">&gt;</span></span>
<span class="line"><span style="color: #F8F8F2">  </span></span>
<span class="line"><span style="color: #F8F8F2">    &lt;</span><span style="color: #FF79C6">style</span><span style="color: #F8F8F2">&gt;</span></span>
<span class="line"><span style="color: #F8F8F2">    </span></span>
<span class="line"><span style="color: #F8F8F2">    body </span><span style="color: #FF79C6">{</span></span>
<span class="line"><span style="color: #F8F8F2">      </span><span style="color: #6272A4">/* Thay vì viết từng thuộc tính */</span></span>
<span class="line"><span style="color: #F8F8F2">    </span></span>
<span class="line"><span style="color: #F8F8F2">      font</span><span style="color: #FF79C6">-</span><span style="color: #F8F8F2">style: italic;</span></span>
<span class="line"><span style="color: #F8F8F2">    </span></span>
<span class="line"><span style="color: #F8F8F2">      font</span><span style="color: #FF79C6">-</span><span style="color: #F8F8F2">weight: bold;</span></span>
<span class="line"><span style="color: #F8F8F2">    </span></span>
<span class="line"><span style="color: #F8F8F2">      font</span><span style="color: #FF79C6">-</span><span style="color: #F8F8F2">size: .8em;</span></span>
<span class="line"><span style="color: #F8F8F2">    </span></span>
<span class="line"><span style="color: #F8F8F2">      line</span><span style="color: #FF79C6">-</span><span style="color: #F8F8F2">height: </span><span style="color: #BD93F9">1.2</span><span style="color: #F8F8F2">;</span></span>
<span class="line"><span style="color: #F8F8F2">    </span></span>
<span class="line"><span style="color: #F8F8F2">      font</span><span style="color: #FF79C6">-</span><span style="color: #F8F8F2">family: Arial, sans</span><span style="color: #FF79C6">-</span><span style="color: #F8F8F2">serif;</span></span>
<span class="line"><span style="color: #F8F8F2">    </span></span>
<span class="line"><span style="color: #F8F8F2">      background</span><span style="color: #FF79C6">-</span><span style="color: #F8F8F2">image: </span><span style="color: #50FA7B">url</span><span style="color: #F8F8F2">(</span><span style="color: #E9F284">&quot;</span><span style="color: #F1FA8C">https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSjnIfv9UzLhhQwAG_0mxil1Z5KyQT7xROTYA&amp;usqp=CAU</span><span style="color: #E9F284">&quot;</span><span style="color: #F8F8F2">);</span></span>
<span class="line"><span style="color: #F8F8F2">  </span></span>
<span class="line"><span style="color: #F8F8F2">      background</span><span style="color: #FF79C6">-</span><span style="color: #F8F8F2">repeat: no</span><span style="color: #FF79C6">-</span><span style="color: #F8F8F2">repeat;</span></span>
<span class="line"><span style="color: #F8F8F2">  </span></span>
<span class="line"><span style="color: #F8F8F2">      background</span><span style="color: #FF79C6">-</span><span style="color: #F8F8F2">position: center center;</span></span>
<span class="line"><span style="color: #F8F8F2">  </span></span>
<span class="line"><span style="color: #F8F8F2">      background</span><span style="color: #FF79C6">-</span><span style="color: #F8F8F2">attachment: fixed;</span></span>
<span class="line"><span style="color: #F8F8F2">    </span></span>
<span class="line"><span style="color: #F8F8F2">      background</span><span style="color: #FF79C6">-</span><span style="color: #F8F8F2">color: #fff;</span></span>
<span class="line"><span style="color: #F8F8F2">      </span><span style="color: #6272A4">/* thì chúng ta có thể viết gọn lại như sau */</span></span>
<span class="line"><span style="color: #F8F8F2">  </span></span>
<span class="line"><span style="color: #F8F8F2">      font: italic bold .8em</span><span style="color: #FF79C6">/</span><span style="color: #BD93F9">1.2</span><span style="color: #F8F8F2"> Arial, sans</span><span style="color: #FF79C6">-</span><span style="color: #F8F8F2">serif;</span></span>
<span class="line"><span style="color: #F8F8F2">    </span></span>
<span class="line"><span style="color: #F8F8F2">      background: #fff </span><span style="color: #50FA7B">url</span><span style="color: #F8F8F2">(</span><span style="color: #E9F284">&quot;</span><span style="color: #F1FA8C">https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSjnIfv9UzLhhQwAG_0mxil1Z5KyQT7xROTYA&amp;usqp=CAU</span><span style="color: #E9F284">&quot;</span><span style="color: #F8F8F2">) no</span><span style="color: #FF79C6">-</span><span style="color: #F8F8F2">repeat fixed center center;</span></span>
<span class="line"><span style="color: #F8F8F2">    </span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #FF79C6">}</span></span>
<span class="line"><span style="color: #F8F8F2">    </span></span>
<span class="line"><span style="color: #F8F8F2">    h1 </span><span style="color: #FF79C6">{</span></span>
<span class="line"><span style="color: #F8F8F2">    </span></span>
<span class="line"><span style="color: #F8F8F2">      color: green;</span></span>
<span class="line"><span style="color: #F8F8F2">    </span></span>
<span class="line"><span style="color: #F8F8F2">      text</span><span style="color: #FF79C6">-</span><span style="color: #F8F8F2">align: center;</span></span>
<span class="line"><span style="color: #F8F8F2">    </span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #FF79C6">}</span></span>
<span class="line"><span style="color: #F8F8F2">    </span></span>
<span class="line"><span style="color: #F8F8F2">    p </span><span style="color: #FF79C6">{</span></span>
<span class="line"><span style="color: #F8F8F2">    </span></span>
<span class="line"><span style="color: #F8F8F2">      font</span><span style="color: #FF79C6">-</span><span style="color: #F8F8F2">family: verdana;</span></span>
<span class="line"><span style="color: #F8F8F2">    </span></span>
<span class="line"><span style="color: #F8F8F2">      font</span><span style="color: #FF79C6">-</span><span style="color: #F8F8F2">size: 20px;</span></span>
<span class="line"><span style="color: #F8F8F2">    </span></span>
<span class="line"><span style="color: #F8F8F2">      position: fixed;</span></span>
<span class="line"><span style="color: #F8F8F2">    </span></span>
<span class="line"><span style="color: #F8F8F2">      bottom: </span><span style="color: #BD93F9">0</span><span style="color: #F8F8F2">;</span></span>
<span class="line"><span style="color: #F8F8F2">    </span></span>
<span class="line"><span style="color: #F8F8F2">      text</span><span style="color: #FF79C6">-</span><span style="color: #F8F8F2">align: center;</span></span>
<span class="line"><span style="color: #F8F8F2">    </span></span>
<span class="line"><span style="color: #F8F8F2">      width: </span><span style="color: #BD93F9">100</span><span style="color: #FF79C6">%</span><span style="color: #F8F8F2">;</span></span>
<span class="line"><span style="color: #F8F8F2">    </span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #FF79C6">}</span></span>
<span class="line"><span style="color: #F8F8F2">    </span></span>
<span class="line"><span style="color: #F8F8F2">    &lt;/</span><span style="color: #FF79C6">style</span><span style="color: #F8F8F2">&gt;</span></span>
<span class="line"><span style="color: #F8F8F2">  </span></span>
<span class="line"><span style="color: #F8F8F2">  &lt;/</span><span style="color: #FF79C6">head</span><span style="color: #F8F8F2">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">  &lt;</span><span style="color: #FF79C6">body</span><span style="color: #F8F8F2">&gt;</span></span>
<span class="line"><span style="color: #F8F8F2">  </span></span>
<span class="line"><span style="color: #F8F8F2">    &lt;</span><span style="color: #FF79C6">h1</span><span style="color: #F8F8F2">&gt;Welcome to&lt;/</span><span style="color: #FF79C6">h1</span><span style="color: #F8F8F2">&gt;</span></span>
<span class="line"><span style="color: #F8F8F2">    </span></span>
<span class="line"><span style="color: #F8F8F2">    &lt;</span><span style="color: #FF79C6">p</span><span style="color: #F8F8F2">&gt;All Rights Reserved&lt;/</span><span style="color: #FF79C6">p</span><span style="color: #F8F8F2">&gt;</span></span>
<span class="line"><span style="color: #F8F8F2">  </span></span>
<span class="line"><span style="color: #F8F8F2">  &lt;/</span><span style="color: #FF79C6">body</span><span style="color: #F8F8F2">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">&lt;/</span><span style="color: #FF79C6">html</span><span style="color: #F8F8F2">&gt;</span></span></code></pre></div>



<p class="wp-block-paragraph">Lưu ý &amp; suy ngẫm</p>



<p class="wp-block-paragraph">Một selector với trọng số lớn liệu có tốt không?</p>



<p class="wp-block-paragraph"> Ví dụ:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="/* Trọng số là 2,3,4 */

#main article.sports table#stats tr:nth-child(even) td:last-child {

  ...

}" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #6272A4">/* Trọng số là 2,3,4 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">#main article.sports table#stats tr:nth</span><span style="color: #FF79C6">-</span><span style="color: #50FA7B">child</span><span style="color: #F8F8F2">(even) td:last</span><span style="color: #FF79C6">-</span><span style="color: #F8F8F2">child {</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">  </span><span style="color: #FF79C6">...</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">}</span></span></code></pre></div>



<p class="wp-block-paragraph">Với trọng số là 2,3,4, bạn sẽ rất khó để override nó, và sẽ làm cho code của bạn rối rắm và khó để maintain hay extend.</p>



<p class="wp-block-paragraph">Bất kì khi nào bạn rơi vào tình huống không hiểu vì sao element của mình lại có style không như mong muốn, thì Specificity sẽ giúp bạn. Tuy nhiên thay vì ngồi đếm trọng số bằng tay, giờ đây với công cụ devtools mạnh mẽ của các browser thì việc xác định lỗi style là vô cùng đơn giản. Tuy nhiên các công cụ này cũng xây dựng trên nguyên lý CSS Specificity mà thôi chứ không có gì khác biệt đâu. Bạn có thể tham khảo hình ảnh bên dưới để hiểu hơn về cách đánh trọng số.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="791" height="1024" src="http://blog.tomosia.com.vn/wp-content/uploads/2023/10/specifishity-1-791x1024.png" alt="" class="wp-image-1235" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2023/10/specifishity-1-791x1024.png 791w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/specifishity-1-232x300.png 232w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/specifishity-1-768x994.png 768w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/specifishity-1-1187x1536.png 1187w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/specifishity-1-380x492.png 380w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/specifishity-1-800x1035.png 800w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/specifishity-1-1160x1501.png 1160w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/specifishity-1.png 1275w" sizes="auto, (max-width: 791px) 100vw, 791px" /></figure>



<p class="wp-block-paragraph">Specificity chỉ có ý nghĩa nếu một element có nhiều selector cùng trỏ (target) đến nó. Nói nôm na là nếu cuộc chiến mà chỉ có 1 người tham gia thì hiển nhiên người đó thắng rồi.</p>



<p class="wp-block-paragraph">Trong CSS có việc kế thừa style từ các element cha. Tuy nhiên việc kế thừa này sẽ luôn xếp sau những selector trỏ (target) đích danh đến element nhé. Bạn để ý khi sử dụng devtools là thấy thôi.</p>



<p class="wp-block-paragraph">Việc có nên sử dụng inline styles không vẫn là một vấn đề gây tranh cãi. Một số linter sẽ warning nếu bạn viết inline styles, nhưng bạn vẫn có thể tắt warning đó đi nếu muốn. Một trong những lý do là vì trọng số của nó quá cao sẽ dễ gây ra các lỗi không mong muốn, hoặc sẽ rất khó để override và buộc phải dùng đến !important. Một lý do khác nữa là với nhiều “chuyên gia” thì CSS nên đặt trong các file .css để dễ quản lý, chứ nếu nằm trong style (html) thì rối loạn lên hết?</p>



<p class="wp-block-paragraph">Mặc dù trùm cuối !important vô cùng mạnh mẽ, việc dùng đến !important không phải là một giải pháp tốt và cần hạn chế sử dụng, giống như inline styles mà mình vừa đề cập đến. Trước khi buộc phải dùng đến !important, bạn hãy suy xét cẩn thận xem chúng ta có thể sử dụng CSS Specificity để đạt được mục đích hay không.</p>



<h5 id="bem" class="wp-block-heading">BEM</h5>



<p class="wp-block-paragraph">Đây là một kĩ thuật để đặt tên cho class trong HTML/CSS. Cách đặt tên class với BEM sẽ làm code của chúng ta nhìn rất chuyên nghiệp và có logic hơn rất nhiều.</p>



<p class="wp-block-paragraph">Việc áp dụng kĩ thuật này vào trong project sẽ giúp chúng ta dễ dàng maintain và phát triển, dễ dàng hơn với những người vào dự án sau này khi đọc lại code.</p>



<p class="wp-block-paragraph">BEM là viết tắt của Block, Element và Modifier. Nguyên tắc để đặt tên class sẽ dựa trên 3 thành phần kia để chúng ta đặt tên class cho chuẩn chỉ.</p>



<p class="wp-block-paragraph">Block: Một khối độc lập mang ý nghĩa riêng, mô tả rõ mục đích của nó. (header, container, menu&#8230;). Block sẽ chứa những định dạng chung để có thể tái sử dụng.</p>



<p class="wp-block-paragraph">Element: Là một phần thuộc một khối và thực hiện một chức năng cụ thể, element này sẽ phụ thuộc vào block để đặt tên sao cho phải.</p>



<p class="wp-block-paragraph">Modifier: Modifier sẽ dùng để thao tác nếu muốn thay đổi cách hiển thị của block hoặc element.</p>



<p class="wp-block-paragraph">Ở đây mình không phải muốn giải thích hay giới thiệu chi tiết về 2 “phương pháp” này, mà chỉ muốn chỉ ra một vài điểm liên quan với Specificity thôi. Ngoài BEM và ITCSS ra còn có nhiều phương pháp khác nữa, nhưng cơ bản đều xây dựng trên Specificity cả.</p>



<p class="wp-block-paragraph">BEM: mình mặc định bạn đã biết đến BEM, thì một vài tôn chỉ của nó có thể kể đến như:</p>



<p class="wp-block-paragraph">Tránh sử dụng id (#foo): lý do thì như mình đã chia sẻ, id có trọng số lớn và khá khó để override, nên việc cố gắng override nó sẽ dễ đẩy CSS của bạn đến một tương lai không mấy sáng sủa.</p>



<p class="wp-block-paragraph">Tránh nested selector, cố gắng làm phẳng selector: cũng cùng lý do, nested selector cũng làm tăng trọng số của selector. </p>



<p class="wp-block-paragraph">Ví dụ BEM sẽ khuyến khích:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="/* BEM thích điều này, trọng số chỉ là 0,1,0 nhưng vẫn rất specific

và khó bị conflict */



.block {}

.block__elem1 {}

.block__elem2 {}

.block__elem3 {}

/* Trọng số sẽ là 0,2,0, cũng không quá tệ, nhưng BEM không khuyến khích

và nó cũng rất dễ bị conflict. */

.block {}

.block .elem1 {}

.block .elem2 {}

.block .elem3 {}" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #6272A4">/* BEM thích điều này, trọng số chỉ là 0,1,0 nhưng vẫn rất specific</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6272A4">và khó bị conflict */</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">.block {}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">.block__elem1 {}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">.block__elem2 {}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">.block__elem3 {}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6272A4">/* Trọng số sẽ là 0,2,0, cũng không quá tệ, nhưng BEM không khuyến khích</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6272A4">và nó cũng rất dễ bị conflict. */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">.block {}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">.block .elem1 {}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">.block .elem2 {}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">.block .elem3 {}</span></span></code></pre></div>



<h5 id="tong-ket" class="wp-block-heading"><strong>Tổng kết</strong></h5>



<p class="wp-block-paragraph">Trên đây là một số kiến thức nhỏ mình đã tìm hiểu được, hi vọng nó sẽ giúp ích cho bạn trong dự án.</p>
<p>The post <a href="https://blog.tomosia.com.vn/toi-uu-cach-viet-css/">Tối ưu cách viết CSS</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.tomosia.com.vn/toi-uu-cach-viet-css/feed/</wfw:commentRss>
			<slash:comments>7</slash:comments>
		
		
			</item>
	</channel>
</rss>
