Học làm web (60) - JS căn bản (2)

Tiếp theo của: Học làm web (59) - JS căn bản (1)
----

2.2.3       Sử dụng console.log()


Các trình duyệt web hiện đại, Node.js, cũng như các môi trường phát triển JavaScript khác (mà có hỗ trợ việc ghi dữ liệu ra console) đều đang sử dụng rất nhiều các phương thức để ghi log (ghi vết), trong đó phổ biến nhất là phương thức console.log().

Trong các trình duyệt, phương thức console.log() chủ yếu được sử dụng trong việc tìm và sửa lỗi (debug).

Trong cửa sổ console của JavaScript (Developer tool), gõ lệnh sau và gõ Enter,

console.log(‘Hello wordl’);

Kết quả của lệnh trên sẽ ghi ra console thông tin sau :


Ở ví dụ trên, hàm console.log() đã in ra dòng chữ “hello world” và trả về giá trị undefined. Lý do là hàm console.log() không trả về một giá trị tường minh.

Quan sát giá trị của biến

Có thể sử dụng console.log() để quan sát giá trị của biến thuộc kiểu bất kì. Chỉ việc đưa tên biến vào làm đối số của hàm console.log().

Ví dụ, nhập vào cửa sổ console đoạn lệnh sau, (bấm shift + Enter để xuống hàng), bấm Enter để thực thi đoạn mã,

var foo='bar';
console.log(foo);

Kết quả của đoạn mã trên sẽ ghi ra console thông tin sau:


Nếu muốn xuất nhiều giá trị, đơn giản chỉ việc sử dụng dấu phẩy để ngăn cách giữa các giá trị.

Ví dụ,

var thisVar = 'first value';
var thatVar = 'second value';
console.log('thisVar:', thisVar, 'thatVar:',thatVar);

Kết quả của đoạn mã trên sẽ ghi ra console thông tin sau:


Khi xuất kết quả, giữa các giá trị sẽ được tự động thêm một khoảng trắng.

Placeholders

Có thể xuất ra console theo kiểu “đặt chỗ trước” (placeholders).

Ví dụ,

var greet = 'Hello';
var who = 'World';
console.log('%s, %s', greet, who);

[Kết quả xuất ra cửa sổ console là]

Hello, World

Xuất một đối tượng

Có thể sử dụng console.log() để xuất một đối tượng, cách này thường được sử dụng để xuất một kết quả trả về dưới dạng JSON của một lời gọi API.

Ví dụ,

console.log({
'Email': '',
'Groups': {},
'Id': 33,
'IsHiddenInUI': false,
'IsSiteAdmin': false,
'LoginName': 'i:0#.w|virtualdomain\\user2',
'PrincipalType': 1,
'Title': 'user2'
});

[Kết quả]


Xuất phần tử HTML

Có thể sử dụng console.log() để xuất phần tử bất kì có trong cây DOM.

Ví dụ,



Đọc thêm về chủ đề Console để tìm hiểu các khả năng khác của nó.

2.2.4       Sử dụng DOM API


Có thể sử dụng thuộc tính textContent để xuất nội dung văn bản ra giao diện trang web. Tương tự chức năng của thuộc tính innerHTML.

Ví dụ,

[HTML]

<p id="paragraph"></p>

Sử dụng đoạn mã JS sau để chèn phần nội dung cho phần tử p, và nội dung này sẽ được hiển thị trên giao diện trình duyệt.

[JS]

document.getElementById('paragraph').textContent = 'Hello World';

Ví dụ sau sẽ tạo thêm một phần tử (p), gán nội dung cho phần tử p, và gắn phần tử p vào cuối trang web,

[HTML]

<body>
            <h1>Thêm phần tử vào trang web</h1>
</body>

[JS]

var element = document.createElement('p');
element.textContent = 'Hello World';
document.body.appendChild(element);

2.2.5       Sử dụng window.alert()


Phương thức window.alert() được sử dụng để xuất nội dung ra cửa sổ trình duyệt dưới dạng một cửa sổ thông báo. Đối số của hàm chính là nội dung cần xuất.

Vì window là đối tượng kiểu toàn cục (global object), nên có thể sử dụng ở dạng viết rút gọn là alert(). Hai cách viết sau là tương đương,

window.alert(message);

alert(message);

Ví dụ,

window.alert('hello');
alert('hello');

Lưu ý: vì alert() hoạt động theo kiểu hộp thoại modal (modal prompt), nên đoạn mã gọi phương thức này sẽ bị dừng để đợi tương tác từ người dùng. Hộp thoại kiểu modal là hộp thoại do chương trình chính gọi ra, và nó phải được đóng trước khi có thể thực thi các lệnh tiếp theo của chương trình, mục đích để đảm bảo chương trình không bị rơi vào trạng thái mất kiểm soát.

Ví dụ,

alert('Dừng!');
console.log('Alert đã được đóng!');

Tuy nhiên, trong đặc tả thực tế vẫn cho phép các đoạn mã được kích hoạt bởi các sự kiện khác thực thi ngay cả khi hộp thoại modal chưa được đóng.

Trong thực tế, phương thức alert() không được khuyến khích sử dụng vì nó ảnh hưởng không tốt đến trải nghiệm người dùng. Phương thức alert() chỉ nên sử dụng trong quá trình tìm và sửa lỗi.

Trình duyệt Chrome 46.0 không cho phép chạy phương thức alert() trong phần tử iframe. Ví dụ,

<body>
            <iframe src="" frameborder="0">
                        <script>
                                     alert('inside iframe');
                        </script>
            </iframe>
           
<script>
                        alert('outside iframe');
               </script>
</body>


2.2.6       Sử dụng window.prompt()


Cách đơn giản nhất để lấy được dữ liệu do người dùng nhập vào là sử dụng phương thức window.prompt().

Cú pháp,

window.prompt(text, [default]);

text: nội dung được hiển thị trong hộp thoại

default: giá trị mặc định cho ô nhập liệu

Ví dụ,

var age = window.prompt('How old are you?');
console.log(age); //in giá trị do người dùng nhập vào

[Kết quả]



Nếu người dùng nhập một giá trị, rồi bấm nút OK, giá trị sẽ được trả về. Ngược lại, nếu người dùng bấm Cancel, giá trị null sẽ được trả về.

Giá trị trả về của phương thức prompt() luôn là kiểu chuỗi (string), trừ khi người dùng bấm nút Cancel, giá trị trả về sẽ là null. Với trình duyệt Safari, khi người dùng bấm nút Cancel, giá trị trả về sẽ là một chuỗi rỗng (empty string). Từ giá trị trả về kiểu chuỗi, lập trình viên có thể chuyển qua các dạng dữ liệu khác để xử lý.

Chú ý:

– Trong khi cửa sổ prompt đang hiển thị, người dùng không thể truy cập các vùng khác của trang web, vì cửa sổ prompt thuộc kiểu modal.


– Từ Chrome 46.0, phần tử iframe không cho phép chạy phương thức prompt, trừ trường hợp thuộc tính sandbox được thiết lập là cho phép modal được chạy.
-----------
Cập nhật [28/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 (61) - JS căn bản (3)

Học làm web (58) - CSS căn bản (34)

Tiếp theo của: Học làm web (57) - CSS căn bản (33)
----
CSS dựa trên môi trường hiển thị

CSS dựa trên môi trường hiển thị (media queries) cho phép lập trình viên tạo ra mã CSS cho từng loại môi trường (hay thiết bị) hiển thị khác nhau. Các môi trường hiển thị gồm: in (print), màn hình máy tính (screen), thiết bị cầm tay (handheld), thiết bị liên quan đến hệ thống chữ nổi (braille), màn chiếu (screen projection), thiết bị xử lý văn bản qua đường điện thoại (tty), Ti vi (TV). Sử dụng từ khóa all nếu muốn áp dụng định dạng CSS cho toàn bộ các loại môi trường. Media queries cũng xét đến các đặc trưng khác như: độ rộng của thiết bị (device-width), hướng (ngang, dọc) của màn hình (orientation) và độ phân giải (resolution).

Đây là danh sách các thuộc tính có thể kiểm tra trong chế độ media queries: width, height, device-width, device-height, orientation, aspect-ratio, device-aspect-ratio, color, color-index, monochrome, resolution, scan, grid. Có thể kiểm tra giá trị nhỏ nhất hoặc lớn nhất của hầu hết các thuộc tính bằng tiếp đầu ngữ min- hoặc max- tương ứng. Ví dụ: min-width: 480px dùng để kiểm tra kích thước màn hình có lớn hơn hoặc bằng 480px hay không? Như vậy, màn hình kích thước 768px sẽ thỏa điều kiện này và được áp dụng CSS, trong khi màn hình kích thước 320px sẽ không thỏa điều kiện.

Đoạn mã của media queries được viết trong tập tin CSS như các luật CSS thông thường khác. Ví dụ,

@media screen and (min-width: 480px;) {
/* các luật CSS được đặt tại đây */
}

Đoạn mã trên sẽ kiểm tra xem môi trường hiển thị có phải là screen không và kích thước có phải từ 480px trở lên hay không?

Cú pháp của câu lệnh truy vấn môi trường bắt đầu bằng @media, tiếp theo là “tên thiết bị”, sau đó là các đặc trưng và các giá trị cần kiểm tra được đặt trong ngoặc đơn (), cuối cùng, các luật CSS được đặt trong dấu ngoặc nhọn {}.

Từ khóa “and” là toán tử logic, được dùng để nối các điều kiện kiểm tra. Như ở ví dụ trên, câu lệnh truy vấn sẽ trả về kết quả là “true” nếu môi trường hiển thị là screen và có độ rộng tử 480px trở lên.

Ví dụ câu lệnh truy vấn sau kiểm tra cùng lúc ba điều kiện: là screen, độ rộng từ 700px trở lên, và màn hình xoay ngang (landscape).

@media screen and (min-width: 700px;) and (orientation: landscape) {
/* các luật CSS được đặt tại đây */
}

Đặt lệnh truy vấn trong thẻ link

Lệnh @media ngoài việc đặt trong một tập tin CSS, còn có thể đặt trong thẻ link của tài liệu HTML. Mục đích là để tải tập tin CSS nếu thỏa điều kiện cho trước.

Ví dụ, đoạn mã dưới đây sẽ tải tập tin định dạng cơ bản trước (styles.css), nếu màn hình có độ rộng từ 780px trở lên thì tải thêm tập tin định dạng mở rộng (2column-styles.css).

<head>
<link rel="stylesheet" href="styles.css">
<link rel="stylesheet" href="2column-styles.css" media="screen and
(min-width:780px)">
</head>

Lưu ý: Việc đặt lệnh truy vấn trong thể link cũng có nhược điểm là cần thêm một request về server, do vậy có thể ảnh hưởng đến tốc độ hiển thị trang web.

Mobile First

Trong kĩ thuật responsive, phương pháp được sử dụng nhiều là ưu tiên thiết bị di động trước (mobile first). Nghĩa là, thực hiện định dạng cho thiết bị nhỏ nhất, đơn giản nhất trước, sau đó sử dụng media queries để thiết lập riêng cho các trường hợp còn lại (trường hợp có màn hình lớn hơn, có thêm nhiều đặc trưng hơn).

Theo phương pháp mobile-first, người ta thường sử dụng từ khóa min- trong các câu truy vấn kích thước màn hình, nghĩa là nếu thiết bị có độ rộng ít nhất là xyz hoặc lớn hơn thì sẽ áp dụng thêm những CSS tương ứng. Điều này đảm bảo tính kế thừa của định dạng CSS, các định dạng sau sẽ dựa trên các định dạng trước đó.

Cần lưu ý đến thứ tự ưu tiên khi thực thi mã CSS để đặt các tập tin CSS cho phù hợp, cụ thể, các tập tin định dạng cơ bản sẽ áp dụng trước, sau đó đến CSS cho màn hình nhỏ và cuối cùng là CSS cho màn hình lớn.

Lab 2.8 (tt) (exercise 18-3, p.450, [3])

Một số kích thước màn hình

Một câu hỏi được đặt ra là: với kích thước màn hình bao nhiêu thì nên thiết lập một định dạng CSS riêng?

Như đã biết, các thiết bị duyệt web có kích thước rất đa dạng, có thể xoay đứng hoặc xoay ngang. Do vậy, làm định dạng CSS cho từng trường hợp như vậy là không thể. Trong thực tế, thường tạo ba thiết kế CSS cho ba loại màn hình chính (mobile phone, tablet và desktop). Hình sau liệt kê các kích thước của mỗi loại thiết bị, dựa vào thông tin này để quyết định chọn kích thước cho mỗi media queries.



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


1. Mục đích của reset CSS là gì?

a. Ghi đè các định dạng mặc định của trình duyệt

b. Để lập trình viên luôn kiểm soát được định dạng CSS của họ

c. Ngăn ngừa phần tử kế thừa các định dạng CSS không mong muốn

d. Tất cả đáp án trên

2. Mục đích của CSS sprites là gì?

a. Tăng tốc độ tải và hiển thị trang web

b. Gom nhiều ảnh nhỏ vào một ảnh lớn để giảm kích thước tập tin

c. Giảm số lượng HTTP request về server

d. a và c

e. Tất cả đáp án trên

3. Mục đích của kĩ thuật “dùng hình ảnh thay thế chữ” là gì?

a. Để thụt đầu hàng cho các văn bản có kích thước lớn

b. Sử dụng đối tượng đồ họa thay thế cho văn bản

c. Gỡ bỏ nội dung văn bản, thay vào đó là một hình ảnh

d. Giúp duy trì nội dung và ngữ nghĩa của tài liệu

e. b và d

f. Tất cả đáp án trên

4. Ứng với mỗi câu lệnh truy vấn (cột trái), chọn ngữ nghĩa tương ứng (cột phải)

a. @media screen and (max-width: 800px) { }
Áp dụng định dạng này khi in trên trang giấy xoay đứng
b. @media screen and (min-device-width: 800px) { }
Áp dụng định dạng này cho tất cả thiết bị hiển thị đen-trắng
c. @media print and (orientation: portrait) { }
Áp dụng tập tin CSS mở rộng này khi màn hình hiển thị có kích thước 800px trở lên
d. <link rel="stylesheet" href="special.css"
media="screen and (min-width: 800px)">
Áp dụng định dạng này khi thiết bị hiển thị có độ rộng nhỏ hơn 800px
e. @media all and (monochrome) { }
Áp dụng định dạng này khi thiết bị hiển thị có độ rộng tử 800px trở lên

5. Ứng với mỗi đoạn mã, hãy chọn hình kết quả tương ứng.


(1.) table { border-collapse: collapse;}
td { border: 2px black solid; }

(2.) table { border-collapse: separate; }
td { border: 2px black solid; }

(3.) table {
border-collapse: separate;
border-spacing: 2px 12px; }
td { border: 2px black solid; }

(4.) table {
border-collapse: separate;
border-spacing: 5px;
border: 2px black solid; }
td { background-color: #99f; }

(5.) table {
border-collapse: separate;
border-spacing: 5px; }
td {
background-color: #99f;
border: 2px black solid; }





3         Tài liệu tham khảo chính


[1] Jon Duckett, HTML&CSS design and build websites, John Wiley & Son, 2011

[2] Tutorials Point, HTML hypertext markup language, ebook, 2015

[3] Jennifer Niederst Robbins, Learning web design, O’Reilly, 2012



-----------
Cập nhật [19/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 (58_1) - Mini project (hosting, domain, git, html, css)

Học làm web (57) - CSS căn bản (33)

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

2.8.5       Kĩ thuật định dạng bảng


Ở các phần trước đã tìm hiểu hầu hết các thuộc tính quan trọng của CSS, với các thuộc tính này, lập trình viên có thể thực hiện định dạng phần nội dung của bảng. Cụ thể, lập trình viên có thể thay đổi cách hiển thị và căn chỉnh nội dung bên trong mỗi ô (cell) bằng các thuộc tính liên quan đến font, text, background và các thuộc tính khác. Ngoài ra, cũng có thể định dạng bảng và các ô bằng padding, margin và border.

Phần này sẽ chỉ tập trung tìm hiểu một số thuộc tính có ảnh hưởng trực tiếp đến việc hiển thị của bảng, đặc biệt là các đường viền.

Đường viền kiểu separated và kiểu collapsed

CSS cung cấp hai kiểu để hiển thị đường viền của các ô trong bảng, đó là separated và collapsed. Với kiểu separated (tách rời), cả bốn cạnh của mỗi ô đều được vẽ đường viền, và có thể thiết lập khoảng cách (khoảng trắng) giữa các đường viền. Với kiểu collapsed (thu gọn), khi có hai đường viền nằm cạnh nhau, chúng sẽ được thu gọn lại, chỉ hiển thị một đường, khoảng trắng giữa hai đường viền sẽ bị gỡ bỏ.

Xem hình minh họa,



Để chọn kiểu đường viền cho các ô, sử dụng thuộc tính border-collapse. Dưới đây là các đặc tính của border-collapse,

– Giá trị (values): separate | collapse | inherit

– Mặc định: separate

– Áp dụng: các phần tử table và inline-table

– Kế thừa:

Kiểu hiển thị separated là kiểu mặc định, ở kiểu này, có thể thiết lập khoảng cách giữa các ô bằng thuộc tính border-spacing. Dưới đây là các đặc tính của border-spacing,

– Giá trị (values): đơn vị đo chiều dài | inherit

– Mặc định: 0

– Áp dụng: các phần tử table và inline-table

– Kế thừa:

Border-spacing gồm hai giá trị, giá trị đầu tiên là khoảng cách giữa các cột, giá trị thứ hai là khoảng cách giữa các hàng. Nếu chỉ cung cấp một giá trị thì giá trị đó sẽ được dùng cho cả cột và hàng. Giá trị mặc định là 0, do vậy sẽ thấy đường viền giữa các ô có độ dày tăng gấp đôi.

Ví dụ, đoạn mã CSS sau sẽ tạo ra đường viền kiểu separated ở hình minh họa phía trên,

table {
            border-collapse: separate;
            border-spacing: 15px 3px;
            border: none; /*bỏ viền xung quanh bảng*/
}
td {
            border: 2px solid red; /*đường viền của các ô*/
}

Khi kiểu hiển thị là collapse, sẽ chỉ có một đường viền giữa các ô. Ví dụ , đoạn mã CSS sau sẽ tạo ra đường viền kiểu collapse ở hình minh họa phía trên,

table {
            border-collapse: collapse;
            border: none; /*bỏ viền xung quanh bảng*/
}
td {
            border: 2px solid red; /*đường viền của các ô*/
}

Chú ý: với kiểu collapsed, mặc dù trong mã CSS, đường viền của mỗi ô được thiết lập là 2px, tuy nhiên, trên giao diện, đường viền giữa hai ô cạnh nhau vẫn chỉ là 2px chứ không phải là 4px. Và đường viền sẽ nằm giữa hai ô.

Định dạng hiển thị ô trống

Đối với kiểu hiển thị separated, với các ô trống (không có dữ liệu), có thể sử dụng thuộc tính empty-cell để quyết định có cho ô đó hiển thị hay không. Nếu được hiển thị, ô đó sẽ chỉ gồm background và border.

Dưới đây là các đặc tính của empty-cell,

– Giá trị (values): show | hide | inherit

– Mặc định: show

– Áp dụng: các ô của bảng

– Kế thừa:


2.8.6       Kĩ thuật responsive


Responsive nghĩa là tùy chỉnh, tự động điều chỉnh. Trong thiết kế web, responsive là kĩ thuật sử dụng CSS để tùy chỉnh bố cục (layout) của trang web theo kích thước màn hình. Đây chỉ là một trong nhiều cách để thích ứng với việc người dùng sử dụng các màn hình có kích thước khác nhau để duyệt web.

Để dễ hiểu, sẽ làm một ví dụ về kĩ thuật responsive. Hình dưới đây là giao diện của một trang web, thiết kế theo kiểu responsive, được hiển thị ở các màn hình có kích thước khác nhau.



Ở màn hình smartphone, trang web chỉ gồm một cột, với margin rất nhỏ. Ở màn hình tablet, trang web vẫn chỉ có một cột, với margin rộng hơn. Ở màn hình lớn (1024px), trang web gồm hai cột. Ở màn hình lớn hơn 1024px, trang web gồm hai cột và có áp dụng max-width để khống chế chiều rộng, nhằm tránh vỡ giao diện.

Responsive gồm những gì?

Theo đề xuất của Mr. Marcotte, responsive gồm 3 thành phần, gồm: bố cục kiểu fluid (fluid layout), hình ảnh co dãn (flexible images) và thực hiện CSS dựa trên môi trường hiển thị (CSS media queries).

Bố cục kiểu fluid đã tìm hiểu ở phần 2.6.1 Các loại bố cục. Đặc điểm quan trọng nhất của loại bố cục fluid là sử dụng đơn vị % để thiết lập kích thước của các thành phần.
Hình ảnh co dãn: nghĩa là khi kích thước màn hình nhỏ lại thì hình ảnh hoặc các đối tương media khác cũng phải nhỏ theo, nhằm tránh bị tràn ra ngoài giao diện.

CSS dựa trên môi trường hiển thị: là kĩ thuật CSS dựa trên việc kiểm tra trước, xem môi trường sẽ hiển thị là gì? Trang web sẽ được in ra, hay được hiển thị trên màn hình? Nếu là màn hình, thì kích thước là bao nhiêu? Tùy theo môi trường hiển thị, sẽ có các định dạng CSS riêng.

Thiết lập viewport

Để có thể hiển thị một trang web trên các màn hình nhỏ, trình duyệt trên các thiết bị di động sẽ kết xuất trang web ra một khung tạm (canvas), gọi là viewport. Sau đó trình duyệt sẽ thu nhỏ viewport lại cho vừa với chiều rộng màn hình (device width). Ví dụ, trên iPhone, trình duyệt Mobile Safari sẽ thiết lập kích thước của viewport là 960px, và trang web sẽ được kết xuất ra canvas kích thước 960px. Tuy nhiên, khi hiển thị lên màn hình iPhone rộng 320px thì rất nhiều thông tin sẽ bị thu nhỏ lại, rất khó đọc.

Để khắc phục tình trạng trên, các trình duyệt trên thiết bị di động sẽ sử dụng thẻ meta để thiết lập viewport bằng đúng kích thước của thiết bị. Thẻ này được đặt trong vùng head của tài liệu HTML. Đây là công việc đầu tiên cần thực hiện của kĩ thuật responsive.

<meta name="viewport" content="width=device-width, initial-scale=1">

Đoạn mã trên có nghĩa là độ rộng của viewport đúng bằng độ rộng của thiết bị (width=device-width), và tỉ lệ phóng to (initial-scale) là 1 (100%).

Lab 2.8 (exercise 18-1, p.446, [3])

Tạo bố cục kiểu fluid

Tạo bố cục kiểu fluid là công việc thứ hai cần thực hiện của kĩ thuật responsive. Bố cục kiểu fluid được thiết kế dựa trên đơn vị đo là %, do vậy các thành phần của trang web có thể tự thay đổi kích thước sao cho vừa với màn hình hoặc cửa sổ trình duyệt.

Sẽ không thực tế, nếu tạo ra bố cục cho từng kích thước màn hình. Thông thường, người lập trình chỉ tạo ra hai hoặc ba bố cục cho một số loại màn hình chính (ví dụ smartphone, tablet, desktop). Sau đó, nhờ vào tính co dãn của bố cục fluid, nên trang web có thể tùy chỉnh để phù hợp với các kích thước màn hình còn lại. Bố cục kiểu fluid sẽ đảm bảo cho giao diện trang web không bị dư thừa vùng trắng bên trái và bị cắt xén nội dung bên phải.

Giao diện trong bài Lab 2.8 ở trên đã được thiết kế theo bố cục kiểu fluid. Để ý trong tập tin CSS sẽ thấy các thành phần được tính bằng đơn vị % em.

Tạo hình ảnh co dãn

Để thiết lập một hình ảnh có tính chất co dãn, sử dụng thuộc tính max-width. Ví dụ,

img {
            max-width: 100%;
}

Với max-width=100%, nếu “phần tử chứa” nhỏ lại thì hình ảnh sẽ được thu nhỏ, nếu phần tử chứa lớn hơn hình ảnh thì hình ảnh sẽ không thể lớn hơn, mà nó sẽ đạt 100% kích thước gốc. Khi thiết lập thuộc tính max-width thì không được thiết lập thuộc tính widthheight cho phần tử img trong mã HTML, nếu không, hình ảnh sẽ không thể co dãn. Có thể áp dụng thuộc tính max-width cho các đối tượng khác như object, embed, video.

Tuy nhiên, thực tế không phải đơn giản như vậy. Vấn đề là màn hình của thiết bị di động thường rất nhỏ, và cần phải tối giản kích trước của hình ảnh để tăng tốc độ của trang web. Do vậy, cần tìm hiểu kĩ hơn liên quan đến hình ảnh co dãn.


Lab 2.8 (tt) (exercise 18-2, p.447, [3])
-----------
Cập nhật [19/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 (58) - CSS căn bản (34)