Professional Documents
Culture Documents
Phát triển ứng dụng web: Bài giảng
Phát triển ứng dụng web: Bài giảng
Lê Đình Thanh
VNU-UET
Email: thanhld@vnu.edu.vn
Mobile: 0987.257.504
Website: https://uet.vnu.edu.vn/~thanhld
1
RWD
Responsive Web Design
2
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Thiết kế đáp ứng
Các thành phần đáp ứng
Bố cục/dàn trang (layout)
Văn bản (typography)
Hình ảnh (image)
3
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Công nghệ cần thiết
Meta viewport
display
Positioning
Float
Flexbox
Grids
Conditional CSS
Responsive Images
Responsive Typography
4
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
CSS có điều kiện
<link rel="stylesheet" type="text/css" href="file.css"
media="truy_vấn_phương_tiện">
@media truy_vấn_phương_tiện {
Các bảng định dạng
}
Ví dụ:
@media screen and (max-width: 500px) {
.gridmenu { width:100%; }
.gridmain { width:100%; }
.gridright { width:100%; }
}
@supports <điều_kiện_hỗ_trợ> {
Các bảng định dạng
}
Ví dụ
10
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Ví dụ 1
11
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Ví dụ 1
Nếu khung nhìn lớn thì ba đối tượng trên cùng hàng
với tỷ lệ là 1:2:3
Nếu khung nhìn vừa thì HAI đối tượng đầu tiên trên
cùng hàng với tỷ lệ 1:2, đối tượng còn lại trên hàng
mới rộng 100%
Nếu khung nhìn hẹp thì mỗi đối tượng trên một
hàng với độ rộng 100%
12
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Ví dụ 1 - Cấu trúc DOM
section
div
article
article
div
article
13
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Ví dụ 1 - CSS
/* Khung nhìn lớn trước */
section, div {display:flex; }
div, article {flex:1}
article:nth-of-type(2) { flex: 2;}
15
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Bài thực hành
Tạo trang tương tự như trang sau, sử dụng flexbox để
layout
https://itest.com.vn/lects/webappdev/layout/flexbox2.ht
m
Chú ý thay đổi chiều rộng cửa sổ và quan sát
16
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Ví dụ 2
17
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Ví dụ 2
Lưới gồm 3 hàng, 4 cột
header: Toàn bộ hàng 1
aside: 1 ô bên trái hàng 2
article: 3 ô bên phải hàng 2
footer: hàng 3
nửa trái: 2 ô bên trái hàng 3
nửa phải: 2 ô bên phải hàng 3
18
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Ví dụ 2 - DOM
.container
header
article
aside
footer
div
19
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Ví dụ 2 - CSS
/* Khung nhìn lớn trước */
.container {
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-gap: 20px;
}
20
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Ví dụ 2 - CSS
header { grid-column: 1 / 5; grid-row: 1;}
article { grid-column: 2 / 5; grid-row: 2; }
aside { grid-column: 1; grid-row: 2; }
footer { grid-column: 1 / 3; grid-row: 3; }
.container > div { grid-column: 3 / 5; grid-row: 3;}
21
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Ví dụ 2 - CSS
/* Khung nhìn bé */
@media (max-width:600px) {
.container {
display:block;
}
}
22
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Ví dụ 2 - Hoàn thiện
Tham khảo
https://itest.com.vn/lects/webappdev/layout/grid0.htm
Chú ý thay đổi chiều rộng cửa sổ và quan sát
23
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Ví dụ 3
24
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Ví dụ 3 - DOM
div.container
header
div.main
div.second
div.b1
div.b2
div.b3
div.b4
div.b5
dib.b6
footer
25
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Ví dụ 3 - CSS
.container {
display: grid;
grid-template-columns: repeat(12, 1fr);
grid-gap: 20px;
}
26
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Ví dụ 3 - CSS
div.main {
grid-column: 1/7;
grid-row: 2/5;
}
div.second {
grid-column: 7/11;
grid-row: 2/3;
}
27
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Ví dụ 3 - CSS
div.b1 { grid-column: 1 / 3; grid-row: 7/12; }
div.b2 { grid-column: 3 / 5; grid-row: 6/12; }
div.b3 { grid-column: 5 / 7; grid-row: 5/12; }
div.b4 { grid-column: 7 / 9; grid-row: 4/12; }
div.b5 { grid-column: 9 / 11; grid-row: 3/12; }
div.b6 { grid-column: 11 / 13; grid-row: 2/12; }
@media (max-width:600px) {
.container {display:block; }
}
28
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Ví dụ 3 - Hoàn thiện
Tham khảo
https://itest.com.vn/lects/webappdev/layout/grid1.htm
Chú ý thay đổi chiều rộng cửa sổ và quan sát
29
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Thiết kế đáp ứng
Các thành phần đáp ứng
Bố cục/dàn trang (layout)
Text (typography)
Hình ảnh
30
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Typography
Văn bản chiếm tỉ trọng cao trong nội dung website
Văn bản dễ đọc (readability of text) là UX vô cùng cần
thiết
Nội dung (từ vựng, cú pháp): ngoài phạm vi môn học
này
31
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Typography Elements
Phông chữ (typeface, font-family)
Cỡ chữ (font-size)
Số ký tự trên một dòng (line length)
Giãn/chiều cao dòng (line height)
Giãn cách ký tự trên dòng (character spacing)
32
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Phông chữ
Được khuyến cáo
Arial, Sans Serif, Serif (cho screens)
Times New Roman, Times (cho print)
33
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Cỡ chữ
Tuyệt đối
px Pixel, dùng cho màn hình điện tử
pt Point, dùng khi in
Tương đối
% Tỉ lệ theo cỡ chữ của đối tượng cha
em Độ rộng ký tự M viết hoa theo cỡ chữ của đối tượng
cha
rem Độ rộng ký tự M viết hoa theo cỡ chữ của đối tượng
gốc DOM (<html>) (base size)
vw 1vw = 1% chiều rộng viewport
vh 1vh = 1% chiều cao viewport
34
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
No one-
%, vh,
Đơn vị px, pt rem
em vw
Biết chính xác cỡ chữ là bao
x
nhiêu
Zoom được x x x
37
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Giãn dòng và Giãn cách ký tự
Gần quá hoặc xa quá đều khó đọc
Có thể đặt độc lập với cỡ chữ
Nhưng nên đặt tỉ lệ thuận với cỡ chữ để tạo nên sự
cân đối và dễ đọc
38
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Thực hành tốt nhất
Cỡ chữ
Thành phần cơ sở, điều khiển
các thành phần còn lại
40
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Mức 1 - Stepped Typography
rem (cùng các thành phần phụ thuộc) thay đổi theo
bậc thang
Mỗi bậc thang cho một viewport width
Tham khảo
https://itest.com.vn/lects/webappdev/typo/typo1.htm
41
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Mức 1 - Stepped Typography
Dùng rem và thay đổi rem theo viewport
@media screen and (min-width:360px) { :root {font-size:
16px} }
@media screen and (min-width:768px) { :root {font-size:
18px;} }
div.page h1 {font-size: 1.5rem;}
Giãn dòng, giãn cách ký tự, độ dài dòng tối đa phụ
thuộc rem
line-height: 1.5;
div.page {max-width:35rem;}
42
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Mức 1 - Stepped Typography
Tạo các media query theo các breakpoints là chiều
rộng của các thiết bị hiện hành
Galaxy S9: 360 x 740
iPad: 768 x 1024
Kindle: 800 x 1280
Desktop: 1366 x 768
...
Là giải pháp chấp nhận được
Hơn nữa, tối ưu cho từng thiết bị đã biết
43
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Mức 2 - Fluid Typography
Cải tiến Stepped Typography nhằm
Tối ưu cho từng thiết bị đã biết biết giống như Stepped
Tối ưu cho cả thiết bị chưa biết/sẽ có trong tương lai
Tham khảo
https://itest.com.vn/lects/webappdev/typo/typo2.htm
44
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Mức 2 - Fluid Typography
Với viewport width không thuộc Stepped
Đặt rem nằm giữa nấc dưới và nấc trên
45
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Mức 2 - Fluid Typography
@media screen and (min-width:768px) {
:root {font-size: calc(18px + 2 * ((100vw - 768px) / 598));}
}
@media screen and (min-width:1366px) {
:root {font-size:20px;}
}
46
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Thiết kế đáp ứng
Các thành phần đáp ứng
Bố cục (layout)
Text (typography)
Hình ảnh (image)
47
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Responsive image
Thay đổi kích thước
hiển thị (resizing)
một ảnh hoặc/và thay
một ảnh (source)
bằng ảnh khác tùy
theo đặc tính khung
hiển thị và tùy chọn
của người dùng thị
nhằm
Tối ưu hóa trải
nghiệm người dùng
Tối ưu hóa băng
thông
48
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Case 1. Resolution Switching
Thay đổi kích thước hiển thị (resizing) ảnh mà không
thay đổi nội dung hay tỉ lệ rộng/cao của ảnh (cùng
một ảnh, có thể /nên thay đổi nguồn/URL ảnh)
Chiếm phần lớn các tình huống thực tế
49
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Case 2. Art Direction
Thay đổi nội dung và tỉ lệ cao/rộng của ảnh (ảnh khác,
thay đổi nguồn ảnh)
Tập trung vào 1 chi tiết quan
trọng nào đó khi xem ở
khung nhìn hẹp.
50
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Các giải pháp công nghệ
<img> fit container
<img srcset/sizes>
<picture>
CSS image
JavaScript
51
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
<img> fit container
Mỗi <img> có một nguồn/URL duy nhất
Chỉ thay đổi kích thước hiển thị (resizing)
Đặt <img> trong container
img width = 100% (fit)
container thay đổi vị trí và chiều rộng theo responsive
layout
Ví dụ: https://alistapart.github.io/code-
samples/responsive-web-design/ex/ex-site-FINAL.html
52
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
<img> fit container
Ưu điểm
Ảnh được resize theo toàn cục của layout
Hạn chế
Không giải quyết vấn đề art direction
Sử dụng ảnh lớn không cần thiết
=> Tốn băng thông và thời gian tải
53
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
<img srcset>
Trình duyệt tự chọn nguồn ảnh phù hợp nhất với độ
phân giải (resolution) của màn hình.
54
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
<img srcset sizes>
Trình duyệt tự chọn nguồn ảnh phù hợp nhất với độ
phân giải của màn hình và kích thước hiển thị.
55
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
<img srcset/sizes>
Ưu điểm
Cung cấp nguồn ành và miêu tả ảnh (x hoặc w) để trình
duyệt tự chọn ảnh phù hợp nhất (linh động)
Hạn chế
Không tách biệt nội dung với trình diễn
sizes là danh sách các chuỗi truy vấn phương tiện(CSS)
1000 ảnh có khai báo sizes (CSS) như nhau?
Khó đặt sizes theo layout toàn cục
56
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
<picture>
<source> cung cấp danh sách các nguồn và điều kiện
để chọn nguồn
57
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Ví dụ <img srcset>, <picture>
Tham khảo:
https://mdn.github.io/learning-area/html/multimedia-
and-embedding/responsive-images/responsive.html
58
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
<picture>
Ưu điểm
Cung cấp nhiều cách chọn nguồn ảnh hơn
Hạn chế
srcset, sizes của <source> tương tự của <img>, cú pháp
<picture> gần giống <video>, <audio>, chức năng
<picture> như <img>: Reinvent the wheel?!
Không tách biệt nội dung với trình diễn
1000 ảnh có khai báo sizes (CSS) như nhau?
Khó đặt sizes theo layout toàn cục
Không nên dùng <picture> trong hầu hết các tình
huống
https://cloudfour.com/thinks/dont-use-picture-most-of-
the-time/ 59
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
CSS image
image-set
Ra đời trước và là mô hình cho srcset
Nhưng bị lãng quên, các trình duyệt chưa/không hỗ trợ đầy
đủ
60
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
CSS image
Resolution media query
61
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
CSS image
Ưu điểm
Tách biệt nội dung với trình diễn
Là tiếp cận đúng đắn cho responsive image (cần W3C định
hướng lại)
https://cloudfour.com/thinks/responsive-images-101-part-8-
css-images/
Hạn chế
Bị lãng quên. Các trình duyệt hỗ trợ không đầy đủ
Hiện tại chỉ làm tốt với ảnh nền nhưng phải giải quyết
vấn đề double loads
https://timkadlec.com/2012/04/media-query-asset-
downloading-results/
62
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Tiếp cận đúng
Không nên dùng <picture> (vì tương lai của web).
Ảnh nền
Sử dụng CSS image
Ít content image
Có thể sử dụng <img srcset>
Ít hoặc nhiều content image
Dùng <img> fit container
Sử dụng JavaScript để tự động tải ảnh phù hợp nhất.
63
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Sử dụng img container
Bước 1. Khai báo img container
Bước 2. Cho img container responsive theo layout của
trang
Bước 3. Bao hàm JavaScript tự động tải ảnh phù hợp
nhất vào các img container.
Ví dụ
https://itest.com.vn/lects/webappdev/responsive-image/
64
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Bước 1. Khai báo img
container
HMTL
Container chứa danh sách các nguồn ảnh kèm width
descriptor
<div class="image-box">
<input type="hidden" value=" small.jpg 140, large.jpg 380 ">
</div>
CSS
Ảnh chiếm 100% width của container
div.image-box img {width:100%;}
65
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Bước 2. Cho img container
responsive theo layout
DOM (example)
div.headline
div.news
div.image-box
h3
p
div.news
div.image-box
h3
p
...
66
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Bước 2. Cho img container
responsive theo layout
CSS (example)
img container sẽ tự động thay đổi vị trí và resize theo
layout. <img> sẽ tự động resize 100% width theo img
container.
68
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
respimg.js
Tạo một đối tượng <img> trong mỗi img container
function createImg() {
let imgbox = document.querySelectorAll("div.image-box");
for (let i = 0; i < imgbox.length; i++) {
let img = document.createElement("img");
img.src = "";
imgbox[i].insertBefore(img, imgbox[i].firstChild);
}
}
69
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
respimg.js
Lần lượt tải ảnh cho từng đối tượng <img>
function loadImg() {
let box = document.querySelectorAll("div.image-box");
let img = document.querySelectorAll("div.image-box img");
let src = document.querySelectorAll("div.image-box
input[type=hidden]");
for (let i = 0; i < box.length; i++) {
loadI(box[i], img[i], src[i].value);
}
}
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
70
respimg.js
Tải ảnh phù hợp nhất cho <img>
Input
box là img container
img là đối tượng <img> cần tải ảnh, đã được tạo và đưa vào img
container bằng creatImg()
src là danh sách các nguồn ảnh
Output
img tải ảnh phù hợp nhất có nguồn có trong src
Phù hợp nhất = tỉ lệ co giãn khi hiển thị nhỏ nhất
73
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.