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

BNTang發表於2023-12-24

前言

  • 經過前面的文章介紹,基本上 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

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

相關文章