เผยแพร่: 28 กุมภาพันธ์ 2014
คุณมีตัวเลือกมากมายในการสร้างอินเทอร์เฟซที่สมบูรณ์แบบสําหรับ WebView
ตั้งค่าเมตาแท็ก Viewport
เมตาแท็กวิวพอร์ตเป็นแท็กที่สําคัญที่สุดในการเพิ่มลงในเว็บแอป หากไม่มี WebView อาจทํางานราวกับว่าเว็บไซต์ของคุณออกแบบมาสําหรับเบราว์เซอร์เดสก์ท็อป ซึ่งจะทำให้หน้าเว็บมีความกว้างมากขึ้น (โดยปกติคือ 980 พิกเซล) และปรับขนาดให้พอดีกับความกว้างของ WebView ในกรณีส่วนใหญ่ การดำเนินการนี้จะส่งผลให้หน้าเว็บแสดงเป็นภาพรวมเวอร์ชันเล็กจิ๋วที่ผู้ใช้ต้องเลื่อนและซูมเพื่ออ่านเนื้อหาจริงๆ
หากต้องการให้ความกว้างของเว็บไซต์เท่ากับ 100% ของความกว้างของ WebView ให้ตั้งค่าเมตาแท็กวิวพอร์ต ดังนี้
<meta name="viewport" content="width=device-width, initial-scale=1">
ตั้งค่าความกว้างเป็นค่าพิเศษ device-width เพื่อให้ควบคุมเลย์เอาต์หน้าเว็บได้มากขึ้น
โดยค่าเริ่มต้น WebView จะตั้งค่าวิวพอร์ตเป็น "ความกว้างของอุปกรณ์" แทนที่จะตั้งค่าเป็นวิวพอร์ตเดสก์ท็อป อย่างไรก็ตาม แนวทางปฏิบัติแนะนำคือให้ใส่เมตาแท็กวิวพอร์ตเพื่อให้การทำงานมีความน่าเชื่อถือและควบคุมได้
แสดงเว็บไซต์เวอร์ชันเดสก์ท็อป
ในบางกรณี คุณอาจต้องแสดงเนื้อหาที่ไม่ได้ออกแบบมาสำหรับอุปกรณ์เคลื่อนที่ เช่น คุณอาจแสดงเนื้อหาที่ไม่ได้ควบคุม ในกรณีนี้ คุณบังคับให้ WebView ใช้วิวพอร์ตขนาดเดสก์ท็อปได้โดยทำดังนี้
หากไม่ได้ตั้งค่าวิธีการเหล่านี้และไม่ได้ระบุวิวพอร์ต WebView จะพยายามตั้งค่าความกว้างของวิวพอร์ตตามขนาดเนื้อหา
นอกจากนี้ คุณอาจต้องใช้อัลกอริทึมการจัดวาง TEXT_AUTOSIZING
ซึ่งจะเพิ่มขนาดแบบอักษรเพื่อให้อ่านได้ง่ายขึ้นบนอุปกรณ์เคลื่อนที่ ดูsetLayoutAlgorithm
ใช้การออกแบบที่ปรับเปลี่ยนตามอุปกรณ์
การออกแบบที่ปรับเปลี่ยนตามอุปกรณ์เป็นแนวทางการออกแบบอินเทอร์เฟซที่เปลี่ยนแปลงตามขนาดหน้าจอ
การออกแบบที่ตอบสนองตามอุปกรณ์ใช้งานได้หลายวิธี หนึ่งในคำค้นหาที่ใช้กันมากที่สุดคือคำค้นหา @media
ซึ่งจะใช้ CSS กับองค์ประกอบตามลักษณะของอุปกรณ์
เช่น สมมติว่าคุณต้องการเปลี่ยนจากเลย์เอาต์แนวตั้งเป็นเลย์เอาต์แนวนอนตามการวางแนว ตั้งค่าพร็อพเพอร์ตี้ CSS เป็นแนวตั้งโดยค่าเริ่มต้น
.page-container {
display: -webkit-box;
display: flex;
-webkit-box-orient: vertical;
flex-direction: column;
padding: 20px;
box-sizing: border-box;
}
หากต้องการเปลี่ยนเป็นเลย์เอาต์แนวนอน ให้เปลี่ยนพร็อพเพอร์ตี้ flex-direction ตามการวางแนว ดังนี้
@media screen and (orientation: landscape) {
.page-container.notification-opened {
-webkit-box-orient: horizontal;
flex-direction: row;
}
.page-container.notification-opened > .notification-arrow {
margin-right: 20px;
}
}
นอกจากนี้ คุณยังเปลี่ยนเลย์เอาต์ตามความกว้างของหน้าจอได้ด้วย
เช่น การปรับขนาดความกว้างของปุ่มจาก 100% ให้เล็กลงเมื่อขนาดหน้าจอจริงมีขนาดใหญ่ขึ้น
button {
display: block;
width: 100%;
...
}
@media screen and (min-width: 500px) {
button {
width: 60%;
}
}
@media screen and (min-width: 750px) {
button {
width: 40%;
max-width: 400px;
}
}
การเปลี่ยนแปลงเหล่านี้เป็นการเปลี่ยนแปลงเล็กน้อย แต่ Media Query จะช่วยให้คุณเปลี่ยนแปลงลักษณะที่ปรากฏของแอปพลิเคชันได้มากกว่าเดิม โดยไม่ทำให้ HTML เหมือนเดิม ทั้งนี้ขึ้นอยู่กับ UI ของคุณ
รูปภาพคมชัด
ขนาดและความหนาแน่นของหน้าจอที่หลากหลายก็สร้างปัญหาให้กับรูปภาพด้วย รูปภาพขนาดเล็กต้องใช้หน่วยความจำน้อยกว่าและโหลดได้เร็วกว่า แต่ภาพจะเบลอหากคุณปรับขนาดให้ใหญ่ขึ้น
เคล็ดลับและคำแนะนำบางส่วนที่จะช่วยให้รูปภาพคมชัดบนหน้าจอทุกประเภทมีดังนี้
- ใช้ CSS สําหรับเอฟเฟกต์ที่ปรับขนาดได้
- ใช้กราฟิกเวกเตอร์
- ระบุรูปภาพที่มีความละเอียดสูง
ใช้ CSS สําหรับเอฟเฟกต์ที่ปรับขนาดได้
ใช้ CSS แทนรูปภาพทุกครั้งที่ทำได้ เป็นไปได้ว่าการแสดงผลของบางชุดค่าผสมของพร็อพเพอร์ตี้ CSS อาจใช้ทรัพยากรมาก ทดสอบชุดค่าผสมที่เฉพาะเจาะจงที่คุณใช้อยู่เสมอ
ดูข้อมูลเพิ่มเติมเกี่ยวกับ First Contentful Paint (FCP) ซึ่งจะวัดเวลาตั้งแต่ที่ผู้ใช้ไปยังหน้าเว็บเป็นครั้งแรกจนถึงเวลาที่เนื้อหาส่วนใดส่วนหนึ่งของหน้าแสดงบนหน้าจอ "เนื้อหา" หมายถึงข้อความ รูปภาพ (รวมถึงภาพพื้นหลัง) องค์ประกอบ <svg>
และองค์ประกอบ <canvas>
ที่ไม่ใช่สีขาว
ใช้ภาพกราฟิกเวกเตอร์
กราฟิกเวกเตอร์ที่ปรับขนาดได้ (SVG) เป็นวิธีที่ยอดเยี่ยมในการนำเสนอรูปภาพที่ปรับขนาดได้ สำหรับรูปภาพที่เหมาะกับกราฟิกเวกเตอร์ SVG จะแสดงรูปภาพคุณภาพสูงที่มีขนาดไฟล์เล็กมาก
ระบุรูปภาพที่มีความละเอียดสูง
ใช้รูปภาพที่เหมาะกับอุปกรณ์ที่มี DPI สูงและปรับขนาดรูปภาพโดยใช้ CSS วิธีนี้จะช่วยให้รูปภาพแสดงผลในคุณภาพสูงในอุปกรณ์ต่างๆ ได้ หากใช้การบีบอัดสูง (การตั้งค่าคุณภาพต่ำ) เมื่อสร้างรูปภาพ คุณอาจได้ผลลัพธ์ภาพที่ดีในขนาดไฟล์ที่เหมาะสม
แนวทางนี้มีข้อเสียอยู่ 2 อย่างคือ รูปภาพที่บีบอัดมากอาจแสดงอาร์ติแฟกต์ภาพ ดังนั้นคุณจึงต้องทดสอบเพื่อดูระดับการบีบอัดที่ยอมรับได้ และการปรับขนาดรูปภาพใน CSS อาจทําให้ระบบทำงานหนัก
หากการบีบอัดสูงไม่เหมาะกับความต้องการของคุณ ให้ลองใช้รูปแบบ WebP ซึ่งจะให้รูปภาพคุณภาพสูงที่มีขนาดไฟล์ค่อนข้างเล็ก อย่าลืมระบุทางเลือกสำหรับ Android เวอร์ชันที่ไม่รองรับ WebP
การควบคุมแบบละเอียด
ในหลายกรณี คุณจะใช้รูปภาพเดียวกับอุปกรณ์ทั้งหมดไม่ได้ ในกรณีนี้ คุณจะเลือกรูปภาพที่แตกต่างกันตามขนาดและความหนาแน่นของหน้าจอได้ ใช้ Media Query เพื่อเลือกภาพพื้นหลังตามขนาดและความหนาแน่นของหน้าจอ
คุณสามารถใช้ JavaScript เพื่อควบคุมวิธีโหลดรูปภาพได้ แต่วิธีนี้จะทำให้เกิดความซับซ้อน
การค้นหาสื่อและความหนาแน่นของหน้าจอ
หากต้องการเลือกรูปภาพตามความหนาแน่นของหน้าจอ คุณต้องใช้หน่วย dpi
หรือ dppx
ใน Media Query หน่วย dpi
แสดงถึงจุดต่อนิ้ว CSS และ dppx
แสดงถึงจุดต่อพิกเซล CSS
คุณจะเห็นความสัมพันธ์ระหว่าง dpi
กับ dppx
ในตารางต่อไปนี้
อัตราส่วนพิกเซลของอุปกรณ์ | ความหนาแน่นของหน้าจอทั่วไป | จุดต่อนิ้ว CSS (dpi ) |
จุดต่อพิกเซล CSS (dppx ) |
---|---|---|---|
1 เท่า | MDPI | 96dpi |
1dppx |
1.5x | HDPI | 144dpi |
1.5dppx |
2 | XHDPI | 192dpi |
2dppx |
Android จะกำหนดกลุ่มความหนาแน่นของหน้าจอทั่วไปและใช้ที่อื่นๆ เพื่อแสดงความหนาแน่นของหน้าจอ (เช่น https://screensiz.es)
ภาพพื้นหลัง
คุณสามารถใช้ Media Query เพื่อกำหนดรูปภาพพื้นหลังให้กับองค์ประกอบได้ ตัวอย่างเช่น หากคุณมีรูปภาพโลโก้ขนาด 256 x 256 พิกเซลในอุปกรณ์ที่มีสัดส่วนพิกเซล 1.0 คุณอาจใช้กฎ CSS ต่อไปนี้
.welcome-header > h1 {
flex: 1;
width: 100%;
max-height: 256px;
max-width: 256px;
background-image: url('../images/html5_256x256.png');
background-repeat: no-repeat;
background-position: center;
background-size: contain;
}
หากต้องการเปลี่ยนรูปภาพนี้เป็นรูปภาพขนาดใหญ่ขึ้นในอุปกรณ์ที่มีอัตราส่วนพิกเซลของอุปกรณ์ 1.5 (hdpi) และ 2.0 (xhdpi) ให้เพิ่มกฎต่อไปนี้
@media screen and (min-resolution: 1.5dppx) {
.welcome-header > h1{
background-image: url('../images/html5_384x384.png');
}
}
@media screen and (min-resolution: 2dppx) {
.welcome-header > h1{
background-image: url('../images/html5_512x512.png');
}
}
จากนั้นคุณสามารถผสานเทคนิคนี้เข้ากับการค้นหาสื่ออื่นๆ เช่น min-width
ซึ่งมีประโยชน์เมื่อคุณพิจารณาถึงรูปแบบต่างๆ
@media screen and (min-resolution: 2dppx) {
.welcome-header > h1{
background-image: url('../images/html5_512x512.png');
}
}
@media screen and (min-resolution: 2dppx) and (min-width: 1000px) {
.welcome-header > h1{
background-image: url('../images/html5_1024x1024.png');
max-height: 512px;
max-width: 512px;
}
}
คุณอาจสังเกตเห็นว่า max-height
และ max-width
มีการตั้งค่าเป็น 512 พิกเซลสำหรับความละเอียด 2ddpx
โดยมีรูปภาพขนาด 1024x1024 พิกเซล เนื่องจาก "พิกเซล" ของ CSS จะพิจารณาสัดส่วนพิกเซลของอุปกรณ์ (512 พิกเซล * 2 = 1024 พิกเซล)
แล้ว <img/>
ล่ะ
เว็บในปัจจุบันยังไม่มีวิธีแก้ปัญหานี้ มีคำเสนอบางอย่าง แต่คำเสนอเหล่านั้นไม่พร้อมใช้งานในเบราว์เซอร์ปัจจุบันหรือใน WebView
ในระหว่างนี้ หากคุณสร้าง DOM ใน JavaScript คุณสามารถสร้างแหล่งข้อมูลรูปภาพได้หลายรายการในโครงสร้างไดเรกทอรีที่รอบคอบ ดังนี้
images/
mdpi/
imagename.png
hdpi/
imagename.png
xhdpi/
imagename.png
จากนั้นใช้อัตราส่วนพิกเซลเพื่อพยายามดึงรูปภาพที่เหมาะสมที่สุด
function getDensityDirectoryName() {
if(!window.devicePixelRatio) {
return 'mdpi';
}
if(window.devicePixelRatio > 1.5) {
return 'xhdpi';
} else if(window.devicePixelRatio > 1.0) {
return 'hdpi';
}
return 'mdpi';
}
หรือจะเปลี่ยน URL พื้นฐานของหน้าเว็บเพื่อกำหนด URL แบบสัมพัทธ์สำหรับรูปภาพก็ได้
<!doctype html>
<html class="no-js">
<head>
<script>
function getDensityDirectoryName() {
if(!window.devicePixelRatio) {
return 'mdpi';
}
if(window.devicePixelRatio > 1.5) {
return 'xhdpi';
} else if(window.devicePixelRatio > 1.0) {
return 'hdpi';
}
return 'mdpi';
}
var baseUrl =
'file:///android_asset/www/img-js-diff/ratiores/'+getDensityDirectoryName()+'/';
document.write('<base href="'+baseUrl+'">');
</script>
...
</head>
<body>
...
</body>
</html>
แนวทางนี้จะบล็อกการโหลดหน้าเว็บและบังคับให้ใช้เส้นทางแบบสัมบูรณ์สำหรับทรัพยากรทั้งหมด เช่น รูปภาพ สคริปต์ และไฟล์ CSS เนื่องจาก URL พื้นฐานชี้ไปยังไดเรกทอรีเฉพาะความหนาแน่น