Skip to content

Biến trong CSS

Trong bài này, ta sẽ cùng tìm hiểu biến trong CSS (hay được biết đến nhiều hơn với tên gọi Custom Properties). Đây là cách để gán giá trị cho một biến và sử dụng nó trong CSS, giúp giảm lặp code và dễ dàng thay đổi giá trị của biến. Lưu ý bài này chỉ nói về biến trong CSS được hỗ trợ bởi chính CSS, không phải biến trong CSS preprocessor như SASS hay LESS.

Ta có ví dụ sau:

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Document</title>
    <style>
        h1 {
            color: #00334C;
        }
        h2 {
            padding: 12px;
            color: white;
        }
        main {
            display: flex;
            border: 5px solid black;
            gap: 12px;
            width: 412px;
        }
        section {
            flex-basis: 200px;
            flex-shrink: 0;
            flex-grow: 0;
            background-color: #00334C;
        }
    </style>
</head>
<body>
    <header>
        <h1>CSS Variables</h1>
    </header>
    <main>
        <section>
            <h2>Section 1</h2>
        </section>
        <section>
            <h2>Section 2</h2>
        </section>
    </main>
</body>
</html>

Ta có một header và hai section, mỗi section có một h2. Ta thấy rằng màu của header và section giống nhau. Ta sẽ muốn đặt biến cho màu này. Ngoài ra width: 412px có vẻ ảo, nó chính là tổng của 2 lần flex-basis: 200pxgap: 12px, ta sẽ muốn tính toán giá trị này.

Ta sẽ tạo biến bằng cách đưa chúng vào trong pseudo class :root, lý do là vì ta muốn biến này có thể sử dụng ở bất kỳ đâu trong CSS. Bạn cũng có thể để biến vào html hay bất kỳ rule set nào khác, nhưng việc này không phổ biến lắm. Ta sẽ dùng -- để bắt đầu tên biến, ví dụ --main-color: #00334C. Khi dùng ta chỉ cần viết var(--main-color) thay vì #00334C.

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Document</title>
    <style>
        :root {
            --main-color: #00334C;
        }
        h1 {
            color: var(--main-color);
        }
        h2 {
            padding: 12px;
            color: white;
        }
        main {
            display: flex;
            border: 5px solid black;
            gap: 12px;
            width: 412px;
        }
        section {
            flex-basis: 200px;
            flex-shrink: 0;
            flex-grow: 0;
            background-color: var(--main-color);
        }
    </style>
</head>
<body>
    <header>
        <h1>CSS Variables</h1>
    </header>
    <main>
        <section>
            <h2>Section 1</h2>
        </section>
        <section>
            <h2>Section 2</h2>
        </section>
    </main>
</body>
</html>

Với width, ta sẽ tạo --section-size: 200px để thay cho flex-basis, tiếp đến là --flex-gap: 12px để thay cho gap, ta sẽ muốn tính lại width với calc(var(--section-size) * 2 + var(--flex-gap)).

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Document</title>
    <style>
        :root {
            --main-color: #00334C;
            --section-size: 200px;
            --flex-gap: 12px;
        }
        h1 {
            color: var(--main-color);
        }
        h2 {
            padding: 12px;
            color: white;
        }
        main {
            display: flex;
            border: 5px solid black;
            gap: var(--flex-gap);
            width: calc(var(--section-size) * 2 + var(--flex-gap));
        }
        section {
            flex-basis: var(--section-size);
            flex-shrink: 0;
            flex-grow: 0;
            background-color: var(--main-color);
        }
    </style>
</head>
<body>
    <header>
        <h1>CSS Variables</h1>
    </header>
    <main>
        <section>
            <h2>Section 1</h2>
        </section>
        <section>
            <h2>Section 2</h2>
        </section>
    </main>
</body>
</html>

Thêm một vấn đề nữa, nếu ta đổi :root thành main, thì biến sẽ chỉ có thể sử dụng trong main thôi, phần header sẽ không bị ảnh hưởng, giả sử ta đổi màu --main-color thành đỏ thì màu của header sẽ không đổi.

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Document</title>
    <style>
        main {
            --main-color: red;
            --section-size: 200px;
            --flex-gap: 12px;
        }
        h1 {
            color: var(--main-color);
        }
        h2 {
            padding: 12px;
            color: white;
        }
        main {
            display: flex;
            border: 5px solid black;
            gap: var(--flex-gap);
            width: calc(var(--section-size) * 2 + var(--flex-gap));
        }
        section {
            flex-basis: var(--section-size);
            flex-shrink: 0;
            flex-grow: 0;
            background-color: var(--main-color);
        }
    </style>
</head>
<body>
    <header>
        <h1>CSS Variables</h1>
    </header>
    <main>
        <section>
            <h2>Section 1</h2>
        </section>
        <section>
            <h2>Section 2</h2>
        </section>
    </main>
</body>
</html>

Comments

Authors: farmerboy95