【UniApp】-uni-app-項目實戰頁面佈局(蘋果計算器)

来源:https://www.cnblogs.com/BNTang/archive/2023/12/24/17924091.html
-Advertisement-
Play Games

前言 經過前面的文章介紹,基本上 UniApp 的內容就介紹完畢了 那麼從本文開始,我們就開始進行一個項目的實戰 這次做的項目是蘋果計算器,這個項目的難度不是很大,但是也不是很簡單,適合練手 創建項目 打開 HBuilderX,點擊左上角 文件 -> 新建 -> 項目: 搭建基本佈局 項目創建完畢之 ...


前言

  • 經過前面的文章介紹,基本上 UniApp 的內容就介紹完畢了
  • 那麼從本文開始,我們就開始進行一個項目的實戰
  • 這次做的項目是蘋果計算器,這個項目的難度不是很大,但是也不是很簡單,適合練手

創建項目

  • 打開 HBuilderX,點擊左上角 文件 -> 新建 -> 項目

搭建基本佈局

項目創建完畢之後,首先來分析一下蘋果計算器的整體佈局結構,分為一上一下如下圖:

  • 上面的部分主要是顯示計算結果的,下麵的部分主要是顯示計算器的按鍵

搭建上半部分佈局

更改 index.vue 的內容如下:

<template>
	<view class="content">
		<view class="result-view"></view>
		<view class="btns-view"></view>
	</view>
</template>

<script>
	export default {
		data() {
			return {
			}
		},
		onLoad() {

		},
		methods: {

		}
	}
</script>

<style lang="scss">
	.content {
		width: 100%;
		height: 100%;
		background-color: black;
		padding-left: 30rpx;
		padding-right: 30rpx;
		box-sizing: border-box;
	}
</style>

運行一下,看看效果發現,背景並沒有是黑色,而是白色。

註意點:在 UniApp 中所有的元素都是放在 page 中的, 所以想要全屏,可以直接設置 page 的樣式

我們需要在 App.vue 中修改一下:

<style lang="scss">
	/*每個頁面公共css */
	page {
		width: 100%;
		height: 100%;
	}
</style>

這麼一改,就可以了,效果如下:

在改一下 index 的 navigationBarTitleText 為 計算器,更改 pages.json 如下:

"pages": [{
    "path": "pages/index/index",
    "style": {
        "navigationBarTitleText": "計算器"
    }
}],

基本上大致的容器佈局代碼就寫完了,再繼續來完善一下一上一下的佈局,更改樣式:

.result-view {
    width: 100%;
    height: 35%;
    background: red;
    
}

.btns-view {
    width: 100%;
    height: 65%;
    background: blue;
}

我這裡使用的是 scss 進行編寫,這兩個類樣式是編寫在 .content 中的,效果如下:

一上一下區分完畢了,先來完善一下上面的部分,這個部分主要是顯示計算結果的,我們需要在這個部分中放置一個文本框,用來顯示計算結果,更改代碼如下:

<template>
	<view class="content">
		<view class="result-view">
			<input class="result-box" type="text" v-model="showValue" disabled="true" style="font-size: 180rpx;" />
		</view>
		<view class="btns-view"></view>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				showValue: 0
			}
		},
		onLoad() {
		},
		methods: {
		}
	}
</script>
  • 這裡使用的是 input 標簽,因為 input 標簽可以設置 disabled 屬性,這樣就可以禁止用戶輸入了
  • 然後我們給 input 設置了一個 v-model,這樣就可以實現雙向綁定了
  • 然後我們給 input 設置了一個 style,這樣就可以設置字體大小了
  • 給 input 設置了一個 class,這樣就可以設置樣式了

.result-box 的樣式如下:

.result-box {
    height: 30%;
    text-align: right;
    color: white;
}

效果如下:

但是呢,我發現位置不對,這裡我使用子絕父相的方式來進行佈局,更改代碼如下:

.result-view {
    width: 100%;
    height: 35%;
    background: red;
    position: relative;

    .result-box {
        height: 30%;
        text-align: right;
        color: white;
        position: absolute;
        
        left: 0;
        bottom: 0;
    }
}

搭建下半部分佈局

上方的內容先到此為止,接下來完善一下下方的內容,通過我的觀察,我發現是有規律的唯一沒有規律的就是最後一行,這一行我們先不看,我先佈局,不符合的地方我在單獨處理,廢話不多說我直接上代碼。

  • 首先在下方佈局代碼當中,添加一個 view
<view class="btn-radius"></view>

在這個 view 容器當中我添加了一個 class 用來設置圓角的,因為每個按鈕都是圓角的,好,樣式代碼我先不編寫,繼續分析,那麼這麼多的按鈕難道都是 c + v 去複製出來吧,不可能,所以我這裡採用迴圈的方式來進行創建即可,這裡我就直接貼代碼:

buttons: [{
        text: 'AC',
        class: 'ft-color bg-gray ml-zero',
        func: 'operator',
        params: 'clear',
    },
    {
        text: '+/-',
        class: 'ft-color bg-gray',
        func: 'operator',
        params: 'opposite',
    },
    {
        text: '%',
        class: 'ft-color bg-gray',
        func: 'operator',
        params: 'percent',
    },
    {
        text: '÷',
        class: 'bg-orange',
        func: 'operator',
        params: 'divide',
    },
    {
        text: '7',
        class: 'bg-darkgray ml-zero',
        func: 'inputText',
        params: '7',
    },
    {
        text: '8',
        class: 'bg-darkgray',
        func: 'inputText',
        params: '8',
    },
    {
        text: '9',
        class: 'bg-darkgray',
        func: 'inputText',
        params: '9',
    },
    {
        text: '×',
        class: 'bg-orange',
        func: 'operator',
        params: 'multiply',
    },
    {
        text: '4',
        class: 'bg-darkgray ml-zero',
        func: 'inputText',
        params: '4',
    },
    {
        text: '5',
        class: 'bg-darkgray',
        func: 'inputText',
        params: '5',
    },
    {
        text: '6',
        class: 'bg-darkgray',
        func: 'inputText',
        params: '6',
    },
    {
        text: '-',
        class: 'bg-orange',
        func: 'operator',
        params: 'minus',
    },
    {
        text: '1',
        class: 'bg-darkgray ml-zero',
        func: 'inputText',
        params: '1',
    },
    {
        text: '2',
        class: ' bg-darkgray',
        func: 'inputText',
        params: '2',
    },
    {
        text: '3',
        class: ' bg-darkgray',
        func: 'inputText',
        params: '3',
    },
    {
        text: '+',
        class: 'bg-orange',
        func: 'operator',
        params: 'plus',
    },
    {
        text: '0',
        class: 'btn-size2 bg-darkgray ml-zero',
        func: 'inputText',
        params: '0',
    },
    {
        text: '.',
        class: 'bg-darkgray',
        func: 'inputText',
        params: '.',
    },
    {
        text: '=',
        class: 'bg-orange',
        func: 'operator',
        params: 'result',
    }
]
  • 這裡我定義了一個 buttons 數組,裡面存放的是每個按鈕的信息
  • text:按鈕的文本
  • class:按鈕的樣式
  • func:按鈕的功能
  • params:按鈕的參數

這個是定義在 data 中的,然後我們需要在頁面中進行迴圈,這裡我使用的是 v-for,代碼如下:

<view class="btns-view">
    <view class="btn-radius" v-for="item in buttons" :key="item.text" :class="[item.class]"
        @click="operate(item)">{{item.text}}</view>
</view>
  • 這裡我使用的是 v-for 來進行迴圈
  • 然後我給每個按鈕添加了一個 class,這個 class 是從 buttons 數組中獲取的,動態樣式
  • 然後我給每個按鈕添加了一個點擊事件,這個點擊事件調用 methods 中的 operate 方法, 傳入的參數是當前按鈕的信息
  • 然後我給每個按鈕添加了一個文本,這個文本也是從 buttons 數組中獲取的,動態文本
  • 然後我給每個按鈕添加了一個 key,這個 key 是當前按鈕的文本,這個 key 確定了每個按鈕的唯一性

運行一下,效果如下:

內容都顯示出來了,現在只需要去編寫樣式即可, 我這裡採用 flex 佈局,代碼如下:

.btns-view {
    width: 100%;
    height: 65%;
    background: blue;
    display: flex;
    flex-wrap: wrap;
    justify-content: space-evenly;

    .btn-radius {
        margin-left: 30rpx;
        width: 150rpx;
        height: 150rpx;
        line-height: 150rpx;
        border-radius: 50%;
        text-align: center;
        font-size: 60rpx;
        color: white;
    }
}

運行,效果如下圖,但是發現還是有問題的:

這個問題呢,我已經想到了,之前不是在 data 中定義了一個 buttons 數組嗎,這個數組中存放的是每個按鈕的信息,在信息中有一個 class 屬性裡面有一個 ml-zero 這個是用來設置按鈕的左邊距的,凡是添加了這個屬性就代表著沒有左邊距,直接上樣式代碼:

.ml-zero {
    margin-left: 0;
}

運行,效果如下,可以看到已經非常接近蘋果計算器的樣式了:

到這裡基本上已經完成了大部分的佈局了,接下來將對應字體的樣式寫寫本文的內容就大致完畢了,樣式代碼如下:

  • ft-color:字體顏色
.ft-color {
    color: black;
}

  • bg-orange:橙色背景
.bg-orange {
    background-color: orange;
}

  • bg-darkgray:深灰色背景
.bg-darkgray {
    background: gray;
}

  • bg-gray:灰色背景
.bg-gray {
    background-color: darkgrey;
}

  • btn-size2:按鈕大小
.btn-size2 {
    width: 300rpx;
    border-radius: 75rpx;
}

最後將不用的樣式清理掉,刪除 .result-view 中的 background: red;.btns-view 中的 background: blue;

最後我再附上一張最後的效果圖:

End

  • 如果你有任何問題或建議,歡迎在下方留言,我會儘快回覆
  • 如果你覺得本文對你有幫助,歡迎點贊、收藏,你的支持是我寫作的最大動力


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.關鍵字(keyword) 定義:被Java語言賦予了特殊含義,用做專門用途的字元串(或單詞),這些字元串(或單詞)已經被Java定義好了。 特點:全部關鍵字都是小寫字母。 關鍵字查閱的官方地址: https://docs.oracle.com/javase/tutorial/java/nutsa ...
  • 二三、編譯器 1、One Definition Rule 1)轉化單元 我們寫好的每個源文件(.cpp,.c)將其所包含的頭文件(#include <xxx.h>)合併後,稱為一個轉化單元。 編譯器單獨的將每一個轉化單元生成為對應的對象文件(.obj),對象文件包含了轉化單元的機器碼和轉化單元的引用 ...
  • Qt 是一個跨平臺C++圖形界面開發庫,利用Qt可以快速開發跨平臺窗體應用程式,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實現圖形化開發極大的方便了開發效率,本章將重點介紹`QCharts`折線圖的常用方法及靈活運用。折線圖(Line Chart)是一種常用的數據可視化圖表,用於展示隨... ...
  • Go 泛型之瞭解類型參數 目錄Go 泛型之瞭解類型參數一、Go 的泛型與其他主流編程語言的泛型差異二、返回切片中值最大的元素三、類型參數(type parameters)四、泛型函數3.1 泛型函數的結構3.2 調用泛型函數3.3 泛型函數實例化(instantiation)五、泛型類型5.1 聲明 ...
  • C語言中的布爾值 在編程中,您經常需要一種只能有兩個值的數據類型,例如: 是/否 開/關 真/假 為此,C語言有一個 bool 數據類型,稱為布爾值。 布爾變數 在C語言中,bool 類型不是內置數據類型,例如 int 或 char 它是在 C99 中引入的,您必須導入以下頭文件才能使用它: #in ...
  • 痞子衡嵌入式半月刊: 第 88 期 這裡分享嵌入式領域有用有趣的項目/工具以及一些熱點新聞,農曆年分二十四節氣,希望在每個交節之日準時發佈一期。 本期刊是開源項目(GitHub: JayHeng/pzh-mcu-bi-weekly),歡迎提交 issue,投稿或推薦你知道的嵌入式那些事兒。 上期回顧 ...
  • 一、簡介 由飛利浦主導開發的片間互聯協議。iic通信使用三線(sda scl以及gnd,不包括電源線),極大程度上減少了對ic的io口的占用。同時iic支持多主機以及多從機,方便了程式的設計。 二、協議層簡介 在iic匯流排上scl的電平決定了整條iic匯流排的有效性。 當scl出於高電平時,主機與從機 ...
  • 系統環境 ██████████████████ ████████ littleblacklb@lb-desktop ██████████████████ ████████ ██████████████████ ████████ OS: Manjaro Linux x86_64 ███████████ ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...