【商城實戰(25)】解鎖UniApp移動端適配秘籍,打造完美商城體驗

【商城實戰】專欄重磅來襲!這是一份專為開發者與電商從業者打造的超詳細指南。從項目基礎搭建,運用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用戶、商品、訂單等核心模塊開發,再到性能優化、安全加固、多端適配,乃至運營推廣策略,102 章內容層層遞進。無論是想深入鉆研技術細節,還是探尋商城運營之道,本專欄都能提供從 0 到 1 的系統講解,助力你打造獨具競爭力的電商平臺,開啟電商實戰之旅。

目錄

  • 一、UniApp 適配移動端設備原理及實現
    • 1.1 適配原理
    • 1.2 實現源碼展示
  • 二、利用響應式布局實現頁面自適應
    • 2.1 響應式布局功能介紹
    • 2.2 實現源碼示例
  • 三、解決移動端常見適配問題
    • 3.1 劉海屏適配
    • 3.2 實現源碼
    • 3.3 虛擬按鍵適配
    • 3.4 實現源碼展示


一、UniApp 適配移動端設備原理及實現

1.1 適配原理

UniApp 適配不同移動端設備的核心原理是利用條件編譯和相對單位,以及彈性布局等技術。

  • 條件編譯:UniApp 允許開發者使用特殊的注釋語法來區分不同平臺的代碼。例如,通過#ifdef和#endif指令,開發者可以編寫特定平臺的代碼塊。#ifdef APP-PLUS表示只有在 App 平臺下才會編譯該代碼塊,#ifdef H5則表示只在 H5 平臺編譯。這樣可以針對手機、平板等不同設備的特性,編寫專門的邏輯,比如調用特定設備的 API。
  • 相對單位:在處理不同屏幕尺寸時,使用相對單位如rpx(responsive pixel)至關重要。rpx會根據屏幕寬度進行自適應,規定屏幕寬度為 750rpx。在 iPhone6 上,屏幕寬度為 375px,此時 1rpx = 0.5px 。這樣,使用rpx作為單位設置元素的尺寸,能夠在不同屏幕尺寸的設備上保持相對一致的布局和顯示效果,避免因屏幕尺寸差異導致的布局錯亂 。
  • 彈性布局:采用 Flexbox 彈性布局模型,它能夠自動調整元素的大小和位置,以適應不同的屏幕尺寸和方向。通過設置display: flex,可以方便地實現水平或垂直方向的布局,并且可以控制元素的伸縮比例、對齊方式等,使得頁面在各種設備上都能呈現出合理的布局。

1.2 實現源碼展示

假設我們有一個商品列表頁面,需要從 Spring Boot 后端獲取數據并展示,同時確保在不同設備上都能正確適配。

首先,在 Spring Boot 后端定義一個獲取商品列表的接口:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;@RestController
public class ProductController {@GetMapping("/products")public List<Product> getProducts() {List<Product> productList = new ArrayList<>();// 這里可以從數據庫查詢數據,示例中簡單構造數據Product product1 = new Product(1, "商品1", "描述1", 10.0);Product product2 = new Product(2, "商品2", "描述2", 20.0);productList.add(product1);productList.add(product2);return productList;}
}class Product {private int id;private String name;private String description;private double price;public Product(int id, String name, String description, double price) {this.id = id;this.name = name;this.description = description;this.price = price;}// 省略getter和setter方法
}

在 UniApp 前端頁面中,使用uni.request獲取數據,并通過彈性布局和rpx單位進行頁面布局:

<template><view class="product-list"><view class="product-item" v-for="(product, index) in products" :key="index"><view class="product-name">{{ product.name }}</view><view class="product-description">{{ product.description }}</view><view class="product-price">價格: {{ product.price }}</view></view></view>
</template><script>
export default {data() {return {products: []};},onLoad() {this.getProducts();},methods: {getProducts() {uni.request({url: 'http://localhost:8080/products', // 根據實際情況修改method: 'GET',success: res => {this.products = res.data;},fail: err => {console.log('獲取數據失敗', err);}});}}
};
</script><style scoped>
.product-list {display: flex;flex-direction: column;padding: 20rpx;
}.product-item {background-color: #f5f5f5;border-radius: 10rpx;padding: 15rpx;margin-bottom: 15rpx;display: flex;flex-direction: column;
}.product-name {font-size: 20rpx;font-weight: bold;margin-bottom: 10rpx;
}.product-description {font-size: 16rpx;color: #666;margin-bottom: 10rpx;
}.product-price {font-size: 18rpx;color: #f00;
}
</style>

在上述代碼中,通過uni.request向 Spring Boot 后端發送請求獲取商品數據。頁面布局使用了 Flexbox 彈性布局,使商品列表以垂直方向排列,并且使用rpx作為單位設置元素的尺寸和間距,以確保在不同設備上都能有良好的顯示效果。同時,通過v-for指令循環渲染商品數據到頁面上。

二、利用響應式布局實現頁面自適應

2.1 響應式布局功能介紹

UniApp 的響應式布局功能基于 Vue.js 的響應式原理,能夠根據屏幕尺寸的變化自動調整頁面元素的位置和大小。這一功能主要通過以下幾種方式實現:

  • Flex 布局:Flexbox 布局模型是實現響應式布局的重要手段。通過設置display: flex,可以將容器內的子元素按照靈活的方式排列。例如,可以通過flex-direction屬性控制子元素是水平排列(row)還是垂直排列(column);justify-content屬性用于控制子元素在主軸上的對齊方式,如center(居中對齊)、space-between(兩端對齊)等;align-items屬性則控制子元素在交叉軸上的對齊方式。
  • 媒體查詢:雖然 UniApp 在小程序端不支持傳統的 CSS 媒體查詢,但在 H5 端可以使用。媒體查詢允許根據設備的屏幕寬度、高度、分辨率等特性來應用不同的樣式。例如,可以使用@media screen and (max-width: 600px)來針對屏幕寬度小于 600px 的設備應用特定的樣式,實現頁面在小屏幕設備上的優化布局。
  • 自適應單位:除了前面提到的rpx單位,UniApp 還支持vw(視窗寬度百分比)和vh(視窗高度百分比)等自適應單位。1vw等于視窗寬度的 1%,1vh等于視窗高度的 1%。使用這些單位可以使元素的尺寸根據視窗大小進行動態調整,從而實現響應式布局。比如,設置一個元素的寬度為50vw,那么在任何設備上,該元素都會占據視窗寬度的一半。

2.2 實現源碼示例

以下是一個利用響應式布局實現商品詳情頁面自適應的示例,該頁面從 Spring Boot 后端通過 MyBatis - Plus 獲取商品數據并展示。

首先,在 Spring Boot 后端定義獲取商品詳情的接口,假設商品實體類為Product,數據庫表名為product,使用 MyBatis - Plus 進行數據查詢:

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.demo.entity.Product;
import com.example.demo.mapper.ProductMapper;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;@RestController
public class ProductController {private final ProductMapper productMapper;public ProductController(ProductMapper productMapper) {this.productMapper = productMapper;}@GetMapping("/products/{id}")public Product getProductById(@PathVariable Integer id) {QueryWrapper<Product> queryWrapper = new QueryWrapper<>();queryWrapper.eq("id", id);return productMapper.selectOne(queryWrapper);}
}

在 UniApp 前端頁面中,使用uni.request獲取數據,并通過 Flex 布局和媒體查詢實現響應式布局:

<template><view class="product-detail"><image :src="product.imageUrl" mode="aspectFill" class="product-image"></image><view class="product-info"><view class="product-title">{{ product.name }}</view><view class="product-price">價格: {{ product.price }}</view><view class="product-description">{{ product.description }}</view></view></view>
</template><script>
export default {data() {return {product: {}};},onLoad(options) {const productId = options.id;this.getProductDetails(productId);},methods: {getProductDetails(id) {uni.request({url: `http://localhost:8080/products/${id}`, // 根據實際情況修改method: 'GET',success: res => {this.product = res.data;},fail: err => {console.log('獲取數據失敗', err);}});}}
};
</script><style scoped>
.product-detail {display: flex;flex-direction: column;
}.product-image {width: 100%;height: 300rpx;
}.product-info {padding: 20rpx;
}.product-title {font-size: 24rpx;font-weight: bold;margin-bottom: 10rpx;
}.product-price {font-size: 20rpx;color: #f00;margin-bottom: 10rpx;
}.product-description {font-size: 16rpx;color: #666;
}/* 媒體查詢,針對小屏幕設備調整布局 */
@media screen and (max-width: 480px) {.product-image {height: 200rpx;}.product-title {font-size: 20rpx;}.product-price {font-size: 18rpx;}.product-description {font-size: 14rpx;}
}
</style>

在上述代碼中,通過uni.request獲取商品詳情數據,并在頁面加載時根據商品 ID 請求數據。頁面布局使用 Flex 布局,使圖片和商品信息垂直排列。通過媒體查詢,當屏幕寬度小于 480px 時,調整圖片高度和文字大小,以適應小屏幕設備的顯示,確保在不同屏幕尺寸下都能提供良好的用戶體驗。同時,使用rpx單位保證在不同設備上的相對尺寸一致性。

三、解決移動端常見適配問題

3.1 劉海屏適配

隨著全面屏手機的普及,劉海屏手機越來越常見。劉海屏的出現給移動端應用的界面布局帶來了挑戰,因為屏幕頂部的劉海區域會遮擋頁面內容,影響用戶體驗。在 UniApp 中,適配劉海屏的關鍵在于正確處理安全區域,確保頁面內容不會被劉海遮擋 。安全區域是指屏幕上不會被劉海、圓角或虛擬按鍵等影響的區域。通過合理設置頁面元素的邊距和布局,使其在安全區域內顯示,可以有效解決劉海屏適配問題。

3.2 實現源碼

首先,在manifest.json文件的app-plus節點下進行安全區域配置:

{"app-plus": {"safearea": {"bottom": {"offset": "auto"}}}
}

上述配置中,safearea.bottom.offset設置為auto,表示自動計算底部安全區域偏移,確保頁面內容不會被底部的操作區域遮擋。

在頁面樣式中,使用安全區域變量來設置元素的內邊距,例如:

.page {padding-top: constant(safe-area-inset-top);padding-top: env(safe-area-inset-top);padding-bottom: constant(safe-area-inset-bottom);padding-bottom: env(safe-area-inset-bottom);
}

這里使用constant(safe-area-inset-top)和env(safe-area-inset-top)來設置頁面頂部的內邊距,constant(safe-area-inset-bottom)和env(safe-area-inset-bottom)來設置頁面底部的內邊距。constant用于兼容 iOS 12.0 - 12.1 版本,env用于兼容 iOS 11.0 - 11.4 版本 。通過這種方式,頁面內容在劉海屏手機上能夠正確顯示,不會被劉海或底部操作區域遮擋。

3.3 虛擬按鍵適配

虛擬按鍵的出現也會對頁面布局產生影響,尤其是當虛擬按鍵彈出或收起時,頁面元素的位置和大小可能需要動態調整,以避免被虛擬按鍵遮擋或覆蓋,保證用戶界面的完整性和可用性 。在 UniApp 中,適配虛擬按鍵主要通過監聽虛擬按鍵的狀態變化,并根據狀態動態調整頁面元素的樣式和布局。

3.4 實現源碼展示

以下是一個監聽虛擬按鍵狀態并動態調整頁面底部按鈕位置的示例代碼:

<template><view class="container"><view class="content"><!-- 頁面主體內容 --></view><view class="bottom-button" :style="{ bottom: buttonBottom + 'px' }" @click="handleClick">按鈕</view></view>
</template><script>
export default {data() {return {buttonBottom: 0};},onLoad() {this.initVirtualKeyListener();},methods: {initVirtualKeyListener() {uni.onKeyboardHeightChange(res => {if (res.height === 0) {// 虛擬按鍵隱藏this.buttonBottom = 0;} else {// 虛擬按鍵彈出this.buttonBottom = res.height;}});},handleClick() {// 按鈕點擊邏輯}}
};
</script><style scoped>
.container {position: relative;height: 100vh;
}.content {padding: 20rpx;
}.bottom-button {position: fixed;left: 0;width: 100%;height: 80rpx;line-height: 80rpx;text-align: center;background-color: #007aff;color: #fff;
}
</style>

在上述代碼中,通過uni.onKeyboardHeightChange方法監聽虛擬按鍵的高度變化。當虛擬按鍵隱藏時(res.height === 0),將按鈕的bottom樣式屬性設置為 0;當虛擬按鍵彈出時,將按鈕的bottom樣式屬性設置為虛擬按鍵的高度res.height,從而實現按鈕位置的動態調整,確保按鈕不會被虛擬按鍵遮擋,保證頁面在虛擬按鍵出現時仍能正常展示和交互。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/72297.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/72297.shtml
英文地址,請注明出處:http://en.pswp.cn/web/72297.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《C++ Primer》學習筆記(二)

第二部分&#xff1a;C標準庫 1.為了支持不同種類的IO處理操作&#xff0c;標準庫定義了以下類型的IO&#xff0c;分別定義在三個獨立的文件中&#xff1a;iostream文件中定義了用于讀寫流的基本類型&#xff1b;fstream文件中定義了讀寫命名文件的類型&#xff1b;sstream文件…

MATLAB風光柴儲微網粒子群算法

本程序實現了風光柴儲微網中的粒子群優化&#xff08;PSO&#xff09;算法&#xff0c;用于優化微網的能源調度問題。具體來說&#xff0c;程序考慮了光伏發電、風力發電、柴油機發電&#xff08;柴儲&#xff09;&#xff0c;并使用粒子群算法來優化這些能源的調度&#xff0c…

解決Windows版Redis無法遠程連接的問題

&#x1f31f; 解決Windows版Redis無法遠程連接的問題 在Windows系統下使用Redis時&#xff0c;很多用戶會遇到無法遠程連接的問題。尤其是在配置了Redis并嘗試通過工具如RedisDesktopManager連接時&#xff0c;可能會報錯“Cannot connect to ‘redisconnection’”。今天&am…

解決 HTTP 請求中的編碼問題:從亂碼到正確傳輸

文章目錄 解決 HTTP 請求中的編碼問題&#xff1a;從亂碼到正確傳輸1. **問題背景**2. **亂碼問題的原因**2.1 **客戶端編碼問題**2.2 **請求頭缺失**2.3 **服務器編碼問題** 3. **解決方案**3.1 **明確指定請求體編碼**3.2 **確保請求頭正確**3.3 **動態獲取響應編碼** 4. **調…

VS Code 配置優化指南

目錄 一、安裝與基礎設置1. 安裝 VS Code2. 中文語言包 二、插件推薦三、常見配置項與優化1. 用戶 / 工作區設置2. 全局配置 / Settings Sync3. 常用設置示例 四、性能優化五、調試與終端配置1. 調試配置2. 內置終端配置 六、快捷鍵配置七、美觀與主題八、總結 VS Code&#xf…

基于NXP+FPGA永磁同步電機牽引控制單元(單板結構/機箱結構)

永磁同步電機牽引控制單元&#xff08;單板結構/機箱結構&#xff09; 永磁同步電機牽引控制單元&#xff08;TCU-PMSM&#xff09;用于牽引逆變器-永磁同步電機構成的牽引電傳動系統&#xff0c;采用軸控方式。執行高性能永磁同步電機復矢量控制策略&#xff0c;具有響應迅速…

/etc/sysconfig/jenkins 沒有這個文件

在 CentOS 或其他基于 Red Hat 的 Linux 系統中&#xff0c;/etc/sysconfig/jenkins 文件通常用來存儲 Jenkins 的配置參數&#xff0c;例如 JENKINS_HOME 的路徑。但是&#xff0c;如果你發現沒有這個文件&#xff0c;你可以通過以下幾種方式來解決或確認&#xff1a; 檢查 J…

conda 安裝軟件報錯 Found conflicts! Looking for incompatible packages.

問題描述&#xff1a; 利用 conda 安裝某包 conda install -c "nvidia/label/cuda-11.8.0" cuda-nvcc時發現報錯&#xff1a; Collecting package metadata (current_repodata.json): done Solving environment: failed with initial frozen solve. Retrying with…

MySQL 衍生表(Derived Tables)

在SQL的查詢語句select …. from …中&#xff0c;跟在from子句后面的通常是一張擁有定義的實體表&#xff0c;而有的時候我們會用子查詢來扮演實體表的角色&#xff0c;這個在from子句中的子查詢會返回一個結果集&#xff0c;這個結果集可以像普通的實體表一樣查詢、連接&…

STM32配套程序接線圖

1 工程模板 2 LED閃爍 3LED流水燈 4蜂鳴器 5按鍵控制LED 6光敏傳感器控制蜂鳴器 7OLED顯示屏 8對射式紅外傳感器計次 9旋轉編碼器計次 10 定時器定時中斷 11定時器外部時鐘 12PWM驅動LED呼吸燈 13 PWM驅動舵機 14 PWM驅動直流電機 15輸入捕獲模式測頻率 16PWMI模式測頻率占空…

鴻蒙初級考試備忘

Module類型 Module按照使用場景可以分為兩種類型&#xff1a; Ability類型的Module&#xff1a; 用于實現應用的功能和特性。每一個Ability類型的Module編譯后&#xff0c;會生成一個以.hap為后綴的文件&#xff0c;我們稱其為HAP&#xff08;Harmony Ability Package&#x…

語音識別踩坑記錄

本來想在原來的語音識別的基礎上增加本地擴展本地詞典&#xff0c; 采用的語音識別是Vosk識別器&#xff0c;模型是 vosk-model-small-cn-0.22 // 初始化Vosk識別器 if (recognizer null) {using (Model model new Model(modelPath)){string grammar "{""…

SpringCloud 學習筆記1(Spring概述、工程搭建、注冊中心、負載均衡、 SpringCloud LoadBalancer)

文章目錄 SpringCloudSpringCloud 概述集群和分布式集群和分布式的區別和聯系 微服務什么是微服務&#xff1f;分布式架構和微服務架構的區別微服務的優缺點&#xff1f;拆分微服務原則 什么是 SpringCloud &#xff1f;核心功能與組件 工程搭建父項目的 pom 文件 注冊中心Rest…

計算機網絡-網絡規劃與設計

基本流程 需求分析—》通信規范分析—》邏輯網絡設計—》物理網絡設計—》實施階段 需求分析&#xff1a; 確定需求&#xff0c;包括&#xff1a;業務需求、用戶需求、應用需求、計算機平臺需求、網絡通信需求等。 產物&#xff1a;需求規范 通信規范分析&#xff1a; 現有…

《AI浪潮中的璀璨新星:Meta Llama、Ollama與DeepSeek的深度剖析》:此文為AI自動生成

《AI浪潮中的璀璨新星&#xff1a;Meta Llama、Ollama與DeepSeek的深度剖析》&#xff1a;此文為AI自動生成 引言&#xff1a;AI 大模型的群雄逐鹿時代 在科技飛速發展的當下&#xff0c;AI 大模型領域已成為全球矚目的焦點&#xff0c;競爭激烈程度堪稱白熱化。從 OpenAI 推出…

基礎知識《HTTP字段與狀態碼詳細說明》

HTTP 協議字段與狀態碼完整指南 一、HTTP 字段&#xff08;請求頭與響應頭&#xff09; HTTP 頭字段用于傳遞客戶端和服務器之間的元數據&#xff0c;分為 請求頭&#xff08;Request Headers&#xff09; 和 響應頭&#xff08;Response Headers&#xff09;。 1. 常見請求頭…

DeepSeek linux服務器(CentOS)部署命令筆記

Linux&#xff08;CentOS&#xff09;FinalShellOllama遠程訪問&#xff0c;本地部署deepseek 自備CentOS服務器&#xff0c;并且已經使用FinalShell連接到服務器 一、準備工作 1.更新服務器 apt-get update-y 2.下載Ollama curl -fsSL https://ollama.com/install.sh | …

C#通過API接口返回流式響應內容---分塊編碼方式

1、背景 上一篇文章《C#通過API接口返回流式響應內容—SSE方式》闡述了通過SSE&#xff08;Server Send Event&#xff09;方式&#xff0c;由服務器端推送數據到瀏覽器。本篇是通過分塊編碼的方式實現 2、效果 3、具體代碼 3.1 API端實現 [HttpGet] public async Task Chu…

SSL 原理及實驗

引言 為了實現遠程辦公或者遠程客戶訪問內網的資源 &#xff08;1&#xff09;回顧歷史&#xff1a; 起初先出現SSL(Secure Sockets Layer&#xff09;&#xff0d;安全套接層協議。 美國網景Netscape公司1994年研發&#xff0c;介于傳輸層TCP協議和應用層協議之間的一種協議…

C++ 布爾類型(bool)深度解析

引言 在 C 編程里&#xff0c;布爾類型&#xff08;bool&#xff09;是一種基礎且極為關鍵的數據類型。它專門用于表達邏輯值&#xff0c;在程序的條件判斷、循環控制等諸多方面都發揮著重要作用。接下來&#xff0c;我們將對 C 中的布爾類型展開全面且深入的探討。 一、布爾…