--------------- <> -----------------
--- KHOA HỌC - CÔNG NGHỆ - GIÁO DỤC - VIỆC LÀM ---
--- Học để đi cùng bà con trên thế giới ---

Tìm kiếm trong Blog

Học làm web (51) - CSS căn bản (27)

Tiếp theo của: Học làm web (50) - CSS căn bản (26)
----

2.6.7       Thiết lập màu nền cho các cột


Việc tô màu nền cho các cột sẽ tạo ra một giao diện đẹp và đem lại trải nghiệm tốt cho người dùng. Tuy nhiên, để ý trong hai kĩ thuật chia cột bằng float và position, các cột thường có chiều dài không bằng độ dài của trang. Nếu định dạng màu cho các cột sẽ xuất hiện các cột cao thấp khác nhau. Phần này sẽ tìm hiểu cách sử dụng CSS để khắc phục hạn chế này.

CSS không hỗ trợ việc thiết lập thuộc tính height của cột bằng 100% chiều cao của trang, để làm được việc này cần sử dụng JavaScript hoặc các kĩ thuật tạo bố cục flexbox hoặc grid. Tuy nhiên, vẫn có thể thiết lập màu nền cho các cột đều nhau bằng cách sử dụng ảnh nền cho background, như phần trình bày dưới đây.

Bố cục 2 cột, kích thước cố định

Đối với bố cục 2 cột, kích thước cố định (fixed-width), sử dụng ảnh nền gồm hai màu cho hai cột, chiều rộng của mỗi dải màu bằng với chiều rộng của mỗi cột, lặp lại ảnh nền và xếp lớp (tile) theo chiều dọc.

Ví dụ,

Chuẩn bị ảnh nền: mở phần mềm mspaint có sẵn trên các máy chạy Windows, vào trình đơn File, chọn Properties, thiết lập width là 960px, height 20px. Chèn hai hình chữ nhật, một cái rộng 680px, một cái rộng 280px (xem hình minh họa bên dưới). Đổ hai màu khác nhau cho hai hình chữ nhật. Lưu lại với tên bg.png.

[HTML]

<div id="wrapper">
            <div id="header">Phần đầu trang (menu, logo, quảng cáo, tiêu đề)</div>
            <div id="content">
                        <div id="main">Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.</div>
                        <div id="extras">Các liên kết, các mục tin</div>
            </div>
            <div id="footer">Thông tin bản quyền</div>
</div>

[CSS]


#wrapper {
            width: 960px;
            margin: 0 auto;
}
#content {
            overflow: hidden; /* khắc phục hiện tượng
            không hiển thị nền
            của #content do float */
            background-image: url(bg.png);
            background-repeat: repeat-y;
}
#header {
            background: #ccc;
}
#main {
            width: 650px;
            margin: 0 20px;
            float: left;
}
#extras {
            width: 250px;
            margin: 0 20px 0 0;
            float: left;
}
#footer {
            background: #ccc;
            clear: left;
}


Xem hình minh họa,



Bố cục 2 cột, kiểu fluid

Trong cố cục kiểu fluid, không thể biết chính xác được độ rộng của các cột. Vì vậy, để thiết lập màu nền, cần sử dụng một ảnh nền có chiều rộng rất lớn và thuộc tính background-position.

Mặc dù không thể biết chính xác độ rộng của mỗi cột, nhưng có thể biết được vị trí chia đôi của hai cột. Ví dụ, xét trường hợp cụ thể sau,

[HTML]

<div id="header">Phần đầu trang (menu, logo, quảng cáo, tiêu đề)</div>
<div id="main">Phần nội dung chính của trang</div>
<div id="extras">Các liên kết, các mục tin</div>
<div id="footer">Thông tin bản quyền</div>

[CSS]

#main {
            width: 60%;
            margin: 0 5%;
            float: left;
}
#extras {
            width: 25%;
            margin: 0 5% 0 0;
            float: left;
}
#footer {
            clear: left;
}

Từ mã HTML và CSS ở trên, sẽ biết được vị trí chia đôi của cột #main và #extras là 67.5% độ rộng của trang web, tính từ bên trái. Cụ thể: 60% độ rộng của #main + 5% margin left + 2.5% margin-right (chỉ lấy một nửa margin bên phải) = 67.5%.

Tạo ảnh nền gồm hai màu, có chiều rộng rất lớn, ví dụ 3000px, vì ảnh này có chiều cao rất nhỏ (vài px) nên kích thước ảnh không lớn. Độ rộng phần màu cho cột đầu tiên sẽ là 3000 x 67.5% = 2025 px
Sử dụng CSS để thiết lập ảnh nền cho phần tử body và sử dụng background-position để thiết lập vị trí cho ảnh nền, sao cho vị trí của đường chia luôn nằm giữa hai cột.

body {
background-image: url(two_cols_3000px.png);
background-repeat: repeat-y;
background-position: 67.5%;
}

Xem hình minh họa,



Bố cục 3 cột

Với bố cục ba cột, cách làm gần giống với trường hợp hai cột. Tuy nhiên, cần sử dụng hai ảnh nền. Ảnh nền đầu tiên thiết lập màu nền cho cột bên trái, phần còn lại bên phía phải của ảnh nền sẽ trong suốt (transparent). Ảnh nền thứ hai thiết lập màu nền cho cột bên phải, phần còn lại bên phía trái sẽ trong suốt. Màu nền của toàn trang sẽ xuyên qua vùng trong suốt của hai ảnh nền để thiết lập màu nền cho cột ở giữa.

Mã HTML sẽ gồm hai div, ví dụ #wrapper và #inner,

<div id="wrapper">
<div id="inner">
<div id="main"></div>
<div id="news"></div>
<div id="links"></div>
</div> <!-- end inner div -->
</div> <!-- end wrapper div -->

Khi đó, ảnh nền đầu tiên sẽ thiết lập cho #wrapper, giả sử đường chia giữa cột trái và cột giữa nằm tại vị trí 26.25%. Ảnh nền thứ hai sẽ thiết lập cho #inner, giả sử đường chia giữa cột phải và cột giữa nằm tại vị trí 73.75%.

Xem hình minh họa,


2.6.8       Câu hỏi & bài tập


1. Ứng với mỗi kiểu bố cục (cột trái), yếu tố nào (cột phải) quyết định đến kích thước của các vùng trên trang web? Lựa từng cặp cho phù hợp.

Bố cục kiểu fixed-width
a. Cửa sổ trình duyệt
Bố cục kiểu fluid
b. Kích thước font
Bố cục kiểu elastic
c. Người thiết kế

2. Lựa chọn đơn vị đo được sử dụng cho mỗi loại bố cục sau?

Bố cục kiểu fixed-width
a. em
Bố cục kiểu fluid
b. px
Bố cục kiểu elastic
c. % hoặc auto

3. Ưu điểm nổi bật của mỗi loại bố cục?

Bố cục kiểu fixed-width
a. Luôn biết trước độ dài của một hàng (line length)
Bố cục kiểu fluid
b. Giao diện không tồn tại các khoảng trắng “dư thừa”
Bố cục kiểu elastic
c. Bố cục có hàng/cột gọn gàng dựa trên px

4. Nhược điểm nổi bật của mỗi loại bố cục?

Bố cục kiểu fixed-width
a. Khi tăng kích thước cửa sổ trình duyệt, rất khó đọc nội dung, do hàng quá dài
Bố cục kiểu fluid
b. Kích thước hình ảnh không thể thay đổi theo kích thước trang
Bố cục kiểu elastic
c. Nội dung trang bị cắt mất phía phải, khi thu hẹp màn hình giao diện
-----------
Cập nhật [2/8/2018]
-----------
Xem thêm: Tổng hợp các bài viết về Học làm web
Xem thêm: Học làm web (52) - CSS căn bản (28)

Học làm web (50) - CSS căn bản (26): Flexbox, Grids

Tiếp theo của: Học làm web (49) - CSS căn bản (25)
----

2.6.5       Tạo bố cục bằng kĩ thuật Flexbox


Ở các phần trước đã tìm hiểu hai kĩ thuật tạo bố cục là float và position, phần này sẽ tìm hiểu tiếp một kĩ thuật nữa, đó là kĩ thuật flexbox[1].

Flexbox là viết rút gọn của flexible box, từ flexible nghĩa là linh hoạt. Flexbox thường được sử dụng để tạo bố cục cho các thành phần của một ứng dụng web hoặc các thành phần có kích thước nhỏ của trang web.

Ý tưởng của flexbox là sắp xếp các mục (item) trong một thùng chứa (container), các item có thể tự động thay đổi kích thước cho vừa với container. Nghĩa là không cần thiết lập kích thước cho item, không cần float, các item sẽ tự điều chỉnh việc hiển thị sao cho vừa gọn trong container.

Điểm khác biệt quan trọng nhất của flexbox so với các kiểu bố cục truyền thống, là tính linh hoạt của hướng hiển thị (direction-agnostic). Ở kiểu bố cục truyền thống, một phần tử kiểu block sẽ hiển thị theo hướng từ trên xuống dưới (vertical), một phần tử kiểu inline sẽ hiển thị theo hướng ngang (horizontal). Với flexbox, người lập trình có thể thay đổi hướng hiển thị theo chiều ngang hoặc chiều dọc. Lưu ý: flexbox chỉ sắp xếp các phần tử theo một chiều (one-dimension), hoặc là chiều ngang hoặc là chiều dọc.

Flexbox không phải là một thuộc tính đơn lẻ, mà nó là cả một mô-đun, với nhiều thành phần và thuộc tính đi kèm.

Hai thành phần cơ bản của flexbox là container (còn gọi là parent element) và các mục con bên trong gọi là item (hay children).

Xem hình minh họa,



Nếu bố cục truyền thống hoạt động dựa trên các đặc tính hiển thị của phần tử kiểu block và inline thì flexbox hiển thị dựa trên một mô hình có tên là “flex-flow directions”.

Xem hình minh họa,



Trong đó,

main-axis: hướng ngang của container, mặc định, các item sẽ được xếp theo chiều ngang, tuy nhiên, có thể thay đổi hướng bằng thuộc tính flex-direction

main-start, main-end: các item sẽ được đặt trong container, theo hàng, hướng từ main-start tới main-end

main-size: kích thước (chiều rộng hoặc chiều cao) của item tính theo main axis

cross-size: kích thước (chiều rộng hoặc chiều cao) của item tính theo cross axis

cross-start, cross-end: các hàng sẽ được đặt theo thứ tự từ cross-start tới cross-end

Để dễ hiểu về cách hoạt động của flexbox, quan sát ví dụ sau,

[HTML]

<div class="container">
            <div class="item1">Mục 1</div>
            <div class="item2">Mục 2</div>
            <div class="item3">Mục 3</div>
            <div class="item4">Mục 4</div>
</div>

[CSS]

Để tạo ra một container, sử dụng thuộc tính display: flex;

.container {
            display: flex;
}

Khi đó, các phần tử bên trong container sẽ trở thành item, và hiển thị theo mô hình flexbox. Từ đây có thể sử dụng rất nhiều các thuộc tính để định dạng container và item.

Dưới đây là một số ví dụ về cách sử dụng các thuộc tính,

– Mặc định, các item sẽ xuất hiện theo chiều ngang, từ trái sang phải; để đổi chiều từ phải sang trái, sử dụng thuộc tính flex-direction: row-reverse cho container

.container {
            display: flex;
            flex-direction: row-reverse;
}

– Để các item xuất hiện theo chiều dọc, sử dụng thuộc tính flex-direction: column

.container {
            display: flex;
            flex-direction: column;
}

– Để thay đổi thứ tự xuất hiện của các item, sử dụng thuộc tính order: value, với value là giá trị để xác định vị trí của item trong nhóm. Giá trị value mặc định của các item đều là 0, khi đó, thứ tự hiển thị sẽ dựa theo mã nguồn (HTML). Khi có thiết lập value, item nào có value lớn sẽ đứng sau. Trong trường hợp item cùng giá trị value, thì thứ tự xuất hiện sẽ dựa vào thứ tự trong mã nguồn.

Ví dụ, với hai lệnh CSS dưới đây, thứ tự xuất hiện của các item sẽ là: Mục 1 > Mục 4 > Mục 2 > Mục 3

.item2 {
            order: 1;
}
.item3 {
            order: 2;
}

Để làm việc với flexbox còn có rất nhiều các thuộc tính khác. Ví dụ các thuộc tính áp dụng cho container: display, flex-direction, flex-wrap, flex-flow, justify-content, align-item, align-content. Ví dụ các thuộc tính áp dụng cho item: order, flex-grow, flex-shrink, flex-basis, flex, align-self.

Tạo form đơn giản bằng Flexbox

Vừa chơi vừa học Flexbox:

2.6.6       Tạo bố cục bằng kĩ thuật Grid system


Khác với flexbox, là kĩ thuật tạo bố cục một chiều và thường được sử dụng để tạo bố cục cho các vùng nhỏ; grid là kĩ thuật tạo bố cục hai chiều (two-dimension), có thể thao tác theo cả hàng và cột. Grid thường được sử dụng để tạo bố cục cho toàn trang hoặc cho các thành phần nhỏ trên trang web.

Cũng giống với kĩ thuật flexbox, hệ thống grid cũng gồm hai thành phần và các thuộc tính. Hai thành phần gồm phần tử cha (parent element), phần tử chứa, được gọi là container và phần tử con, là các phần tử nằm bên trong, được gọi là item.

Xem hình minh họa,



Grid định nghĩa một hệ thống lưới gồm các đường (line) ngang và dọc. Khoảng không gian được giới hạn bởi các đường ngang/dọc được gọi là hàng/cột, hay được gọi chung là track.

Phần giao nhau của một hàng và cột gọi là ô (cell), tập hợp nhiều ô gọi là một vùng (area).

Độ rộng của track có thể được thiết lập cố định bằng px, cũng có thể thiết lập tương đối bằng %, hoặc bằng đơn vị fr. Fr là viết tắt của fraction, nghĩa là một phần không gian của container.

Có thể đặt các item vào vị trí chính xác trên grid bằng tên hàng, số hàng hoặc địa chỉ của một vùng.

Container và item

Để định nghĩa một phần tử là container, thiết lập thuộc tính display: grid hoặc display: inline-grid.

Ví dụ,

[HTML]

<div class="wrapper">
            <div class="item1">Mục 1</div>
            <div class="item2">Mục 2</div>
            <div class="item3">Mục 3</div>
            <div class="item4">Mục 4</div>
            <div class="item5">Mục 5</div>
</div>

[CSS]

.wrapper {
            display: grid;
}

Ngay khi .wrapper được thiết lập display: grid, các phần tử con trực tiếp của nó sẽ trở thành item.



Track

Để định nghĩa số hàng và số cột của grid, sử dụng thuộc tính grid-template-column và grid-template-row. Đây cũng chính là việc tạo các track.

Ví dụ sau sẽ tạo một grid gồm ba cột (track), kích thước của mỗi cột là 200px, các item sẽ được đặt vào hệ thống grid, mỗi item nằm ở một cell.

.wrapper {
            display: grid;
            grid-template-columns: 200px 200px 200px;
}

Xem hình minh họa,



Đơn vị fr

Ví dụ sau sẽ tạo ra ba track với độ rộng bằng nhau (tính bằng fr) và độ rộng này có thể tăng hoặc giảm theo kích thước của container,

 .wrapper {
            display: grid;
            grid-template-columns: 1fr 1fr 1fr;
}

Ví dụ sau sẽ tạo ra ba track, với độ rộng track đầu là 2fr, hai track sau là 1fr,

.wrapper {
            display: grid;
            grid-template-columns: 2fr 1fr 1fr;
}

Tạo nhiều track

Để tạo nhiều track có thể sử dụng từ khóa repeat.

Ví dụ, với đoạn mã sau,

.wrapper {
            display: grid;
            grid-template-columns: 1fr 1fr 1fr;
}

Có thể viết lại bằng repeat,

.wrapper {
            display: grid;
            grid-template-columns: repeat(3, 1fr);
}

Flexbox và grid là hai kĩ thuật tạo bố cục có nhiều ưu điểm, nên tìm đọc và thực hành theo các tài liệu đầy đủ về hai kĩ thuật này.



[1] https://css-tricks.com/snippets/css/a-guide-to-flexbox/
-----------
Cập nhật [2/10/2019]
-----------
Xem thêm: Tổng hợp các bài viết về Học làm web
Xem thêm: Học làm web (51) - CSS căn bản (27)