前言
- 經過前面的文章介紹,基本上 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
- 如果你有任何問題或建議,歡迎在下方留言,我會盡快回復
- 如果你覺得本文對你有幫助,歡迎點贊、收藏,你的支援是我寫作的最大動力