Học làm web (49) - CSS căn bản (25)

Tiếp theo của: Học làm web (48) - CSS căn bản (24)
----
Tạo ba cột, kiểu fluid

Cách làm: (tương tự như tạo hai cột, kiểu fluid) thiết lập độ rộng cho cả ba cột, thực hiện float ba cột sang trái, thiết lập thuộc tính clear cho footer để nó luôn nằm ở cuối trang.

[HTML]

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

[CSS]


#links {
            width: 22.5%;
            margin: 0 0 0 2.5%;
            float: left;
}
#main {
            width: 45%;
            margin: 0 2.5%;
            float: left;
}
#news {
            width: 22.5%;
            margin: 0 2.5% 0 0;
            float: left;
}
#footer {
            clear: left;
}


Xem hình minh họa,



Một số thông tin thêm,

– Mã HTML gồm năm div (#header, #links, #main, #news, và #footer)

– Vì ở phần này chỉ sử dụng float, nên phải để mã nguồn của div #main nằm giữa div #links và div #news thì ở giao diện cột #main sẽ nằm giữa cột #links và cột #news

– Cả ba cột điều được thiết lập độ rộng và float sang trái, cần lưu ý để tổng chiều rộng của ba cột và margin không vượt quá 100%

Lab2.6.a (exercise 16-1, p.388 [3])

Sử dụng margin giá trị âm

Khi tạo bố cục bằng kĩ thuật float, có một câu hỏi đặt ra là “có thể luôn luôn tạo được bố cục gồm ba cột, độc lập với mã HTML không?”. Câu trả lời là có, sử dụng margin với giá trị âm để thực hiện.

Cách làm: thiết lập độ rộng và float cho cả ba cột, sử dụng margin giá trị âm để “kéo” một cột từ phía phải sang phía trái trang web.

Quan sát ví dụ dưới đây, trong mã HTML, cột #main nằm trước cột #links, nhưng trên giao diện cột #main lại nằm sau cột #links. Ví dụ này thực hiện cho bố cục kiểu fixed, tuy nhiên cũng có thể thực hiện cho bố cục kiểu fluid với giá trị %.

[HTML]

<div id="wrapper">
            <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="news">Các mục tin tức</div>
            <div id="links">Các liên kết</div>
            <div id="footer">Thông tin bản quyền</div>
</div>

[CSS]


#wrapper {
            width: 960px;
            margin: 0 auto;
}
#links {
            width: 200px;
            margin-top: 0;
            margin-left: -960px;
            float: left;
}
#main {
            width: 520px;
            margin-top: 0;
            margin-right: 20px;
            margin-left: 220px;
            float: left;
}

#news {
            width: 200px;
            margin: 0;
            float: left;
}
#footer {
            clear: left;
}


Xem hình minh họa,



Một số thông tin thêm,

– Trong mã nguồn (HTML), cột #main đứng đầu, cột #links đứng cuối; tuy nhiên, ở giao diện, cột #links đứng đầu, cột #main đứng cuối. Toàn bộ nội dung của trang được bọc trong #wrapper, độ rộng của #wrapper là 960px. Độ rộng của #links là 200px, #main là 520px, #news là 200px, khoảng cách giữa các cột là 20px.

– Để có được giao diện như yêu cầu, bước đầu tiên là float cả ba cột sang trái; sau đó di chuyển cột #main vào giữa, để trống một khoảng đủ để đặt cột bên trái (kích thước 200px) cộng thêm khoảng cách giữa hai cột là 20px, như vậy sẽ thiết lập margin-left cho #main là 220px; thiết lập khoảng cách giữa #main với cột bên phải bằng margin-right: 20px.

– Sử dụng margin giá trị âm để kéo cột #links đang bị rớt xuống dưới về phía trái. Vì cột #links sẽ nằm ở đầu của #wrapper, nên cần kéo nó sang trái một khoảng đúng bằng độ rộng của tất cả các phần tử nằm trước nó trong mã nguồn. Cụ thể, #main là 520px, cộng thêm margin-left 220px, cộng thêm margin-right 20px, cộng thêm #news 200px. Kết quả: 520 + 220 + 20 + 200 = 960px. Vậy cột #links sẽ thiết lập là margin-left: -960px.

– Kĩ thuật margin giá trị âm có thể thực hiện cho các cột ở vị trí bất kì

Lab2.6.b (exercise 16-2, p.391 [3])

2.6.4       Tạo bố cục nhiều cột bằng kĩ thuật position


Để tạo bố cục nhiều cột, ngoài kĩ thuật float, cũng có thể sử dụng kĩ thuật position. Đây là kĩ thuật thiết lập vị trí tuyệt đối cho các cột. Phần này sẽ tìm hiểu cách tạo bố cục gồm ba cột kiểu fluid và kiểu fixed.

Để dễ hiểu, nhắc lại một số khái niệm liên quan,

– Với một phần tử bất kì, có hai thông số cần quan tâm, một là vị trí, hai là kích thước

– Để định vị một phần tử (position) có thể để tự nhiên như trong mã nguồn (kiểu static); có thể chuyển sang kiểu relative, absolute, fixed; hoặc cũng có thể chuyển sang dạng trôi (float)

– Để xác định kích thước của một phần tử có thể sử dụng kiểu cố định bằng px (fixed-width), kiểu tương đối theo % phần tử chứa nó (fluid), hoặc kiểu tương đối theo kích thước phông chữ (em - elastic)

­– Kết hợp giữa các kiểu định vị và các kiểu kích thước sẽ tạo ra nhiều loại bố cục khác nhau

Trong kĩ thuật này, để đặt phần footer luôn ở cuối trang khá phức tạp, cần dùng đến JavaScript, nên bố cục sẽ tạm thời không xét tới phần footer. Thực tế, mọi người thường sử dụng kĩ thuật float để tạo cột hơn là sử dụng kĩ thuật position.

Tạo ba cột, kiểu fluid

Cách làm: bọc ba cột (#main, #news, #links) bằng div #content, khi đó #content sẽ trở thành khối chứa (containing block) của ba cột. Thiết lập độ rộng và vị trí cho ba cột.

[HTML]

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

[CSS]


#content {
            position: relative;
            margin: 0;
}
#links {
            width: 20%;
            position: absolute;
            top: 0;
            right: 2.5%;
            margin: 0;
}
#main {
            width: 50%;
            position: absolute;
            top: 0;
            left: 25%;
            margin: 0;
}
#news {
            width: 20%;
            position: absolute;
            top: 0;
            left: 2.5%;
            margin: 0;
}


  
Xem hình minh họa,



Một số thông tin thêm,

– Nên để các cột trong khối chứa #content, và luôn nằm dưới vùng #header. Nếu để các cột trong khối chứa mặc định (html) thì có thể bị “vỡ” giao diện khi chiều cao của #header tăng lên. Thiết lập position: relative cho #content để nó trở thành khối chứa

– Cột #main được thiết lập độ rộng bằng 50% của #content, định vị tuyệt đối (position: absolute) trên đầu (top) và cách cạnh trái (left) của #content 25%. Khoảng trống 25% này được dùng để chứa cột bên trái 20%, cộng thêm margin 2.5% cho mỗi bên

– Cột #news được định vị tuyệt đối trên đầu và cách cạnh trái của #content 2.5% (top: 0; left: 2.5%)

– Cột #links được định vị tuyệt đối trên đầu và cách cạnh phải của #content 2.5% (top: 0; right: 2.5%)

­– Luôn chú ý để tổng chiều rộng của các cột (có tính padding và border) không được vượt quá 100%

Tạo ba cột, kiểu fixed

Cách làm: tương tự như “tạo ba cột, kiểu fluid”, chỉ khác là bọc toàn bộ trang bằng #wrapper, đơn vị được sử dụng để đo chiều rộng và định vị là px.

[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">Phần nội dung chính của trang</div>
                        <div id="news">Các mục tin tức</div>
                        <div id="links">Các liên kết</div>
            </div>
</div>

 [CSS]


#wrapper {
            width: 960px;
            margin: 0 auto;
}

#content {
            position: relative;
            margin: 0;
}
#main {
            width: 520px;
            position: absolute;
            top: 0;
            left: 220px;
            margin: 0;
}
#news {
            width: 200px;
            position: absolute;
            top: 0;
            left: 0;
            margin: 0;
}
#links {
            width: 200px;
            position: absolute;
            top: 0;
            right: 0;
            margin: 0;
}


Xem hình minh họa,



-----------
Cập nhật [29/7/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 (50) - CSS căn bản (26)

Học làm web (48) - CSS căn bản (24): Bố cục trang web (tt)

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

2.6.2       Các phương pháp tạo bố cục


Ở phần trước đã tìm hiểu về các loại bố cục, phần này sẽ tập trung vào khía cạnh thực hành, làm các bố cục gồm hai và ba cột bằng CSS. Các hướng dẫn trong phần này chỉ ở mức cơ bản, tập trung vào những vấn đề quan trọng của mỗi kĩ thuật. Để dễ dàng quan sát kết quả, nên sử dụng thuộc tính outline để tạo các đường viền xung quanh các vùng. Khác với border, thuộc tính outline không được tính vào kích thước của một phần tử, do vậy không làm ảnh hưởng đến bố cục.

Phần này đề cập tới các mẫu và các kĩ thuật sau,

– Tạo bố cục hai và ba cột bằng kĩ thuật float

– Tạo bố cục không phụ thuộc vào mã HTML bằng kĩ thuật float và margin

– Tạo bố cục nhiều cột bằng kĩ thuật position

Một số kĩ thuật khác: Column, Flexbox, Grid layout system, Regions và Exclusions

2.6.3 Tạo bố cục nhiều cột bằng kĩ thuật float

Ưu điểm của kĩ thuật float so với việc thiết lập vị trí cố định (tuyệt đối) là ngăn chặn tình trạng chồng lấn giữa các vùng nội dung, và dễ dàng thiết lập footer ở cuối trang.

Hạn chế của kĩ thuật float là nó phụ thuộc vào thứ tự xuất hiện của các phần tử trong mã nguồn. Tuy nhiên, có thể khắc phục hạn chế này bằng kĩ thuật margin với giá trị âm.

Tạo hai cột, kiểu fluid

Trong bài Lab2.5c, đã thực hành tạo bố cục hai cột, bằng cách float cột (phần tử) đầu tiên về phía trái, thiết lập margin cho cột (phần tử) thứ hai để nó hiển thị ở phía phải.

Trong ví dụ sau, sẽ thực hiện float tất cả các cột (phần tử) về cùng một phía. Có thể float về phía trái, hoặc phía phải, tùy theo thứ tự của chúng trong mã nguồn và yêu cầu thực tế.

Cách làm: thiết lập độ rộng cho các cột, float tất cả về phía trái, thiết lập thuộc tính clear cho footer để nó luôn nằm ở cuối trang.

[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]

* {
            outline: 1px dashed red;
}
#main {
            width: 60%;
            margin: 0 5%;
            float: left;
}
#extras {
            width: 25%;
            margin: 0 5% 0 0;
            float: left;
}
#footer {
            clear: left;
}

Xem hình minh họa,



Một số thông tin thêm,

– Để đơn giản, trong phần mã CSS đã lược bỏ đi rất nhiều đoạn mã định dạng, ví dụ về màu nền, padding, định dạng văn bản; bạn có thể tự thêm vào các định dạng này, để có được giao diện theo ý muốn

– Bố cục của trang gồm bốn phần (header, main, extras, footer), mỗi phần nằm trong một phần tử div, thứ tự của các phần này được thể hiện trong mã HTML

– Cả phần mainextras đều được float sang trái, tuy nhiên, cũng có thể cho một cái float sang trái, cái còn lại float sang phải cũng được kết quả tương tự. Để float, cần thiết lập độ rộng cho chúng

– Thiết lập margin phía phải và trái 5% cho phần main, phần extras chỉ cần thiết lập margin phía phải; margin phía trên của main và extras đều được thiết lập là 0 để căn đều phía trên

– Thiết lập thuộc tính clear cho vùng footer để nó không còn bị ảnh hưởng bởi thuộc tính float, và sẽ luôn nằm ở cuối trang

– Có thể sử dụng hai thuộc tính max-widthmin-width để khống chế các cột, không bị quá rộng hoặc quá hẹp

Tạo hai cột, kiểu fixed

Cách làm: bọc nội dung mỗi vùng bằng một div; thiết lập độ rộng cho từng cột, thực hiện float các cột. Bọc toàn bộ nội dung của trang bằng một div khác (#wrapper), xác định độ rộng cho div này. Độ rộng được thiết lập bằng đơn vị pixel. Clear phần footer để nó luôn nằm ở cuối trang.

[HTML]

<div id="wrapper">
            <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>
</div>

[CSS]

#wrapper {
            width: 960px;
}
#main {
            width: 650px;
            margin: 0 20px;
            float: left;
}
#extras {
            width: 250px;
            margin: 0 20px 0 0;
            float: left;
}
#footer {
            clear: left;
}

Xem hình minh họa,



Một số thông tin thêm,

– Toàn bộ nội dung của trang được bọc trong div #wrapper, độ rộng của #wrapper thường là 960px

– Không để chiều rộng của các cột (tính cả margin, border và padding của mỗi cột) vượt quá chiều rộng của wrapper, nếu vượt quá, sẽ có cột bị rơi xuống phía dưới. Đối với mỗi cột, khi tăng border và padding thì nhớ trừ vào độ rộng của vùng nội dung, để tổng kích thước của cột vẫn giữ nguyên

Tạo hai cột, kiểu fixed, căn giữa

Cách làm: tương tự như tạo hai cột, kiểu fixed, chỉ thực hiện thêm việc căn giữa div #wrapper. Để căn giữa, thiết lập margin trái/phải là auto.

[CSS]

#wrapper {
            width: 960px;
            margin: 0 auto;
}

Xem hình minh họa,



Thông tin thêm,

– Nếu muốn phần header và footer trải rộng hết cửa sổ trình duyệt, cần bỏ div #header và div #footer nằm ra ngoài div #wrapper

[HTML]

<div id="header">Phần đầu trang (menu, logo, quảng cáo, tiêu đề)</div>
            <div id="wrapper">
                        <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>

            <div id="footer">Thông tin bản quyền</div>
-----------
Cập nhật [03/12/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 (49) - CSS căn bản (25)