【UniApp】-uni-app-项目实战页面布局(苹果计算器)

前言

  • 经过前面的文章介绍,基本上 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

  • 如果你有任何问题或建议,欢迎在下方留言,我会尽快回复
  • 如果你觉得本文对你有帮助,欢迎点赞、收藏,你的支持是我写作的最大动力

posted @   BNTang  阅读(1075)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
  1. 1 总会有人离开 王巨星
  2. 2 月亮 孟凡明
  3. 3 迟里乌布
  4. 4 我只能离开 颜人中
  5. 5 达尔文 蔡健雅
  6. 6 夜色滚烫 叶明净
  7. 7 你的星环 路飞文
  8. 8 不再说话 三块木头
  9. 9 黄昏 粥粥和小伙/粥粥
  10. 10 爱不单行 刘大拿
  11. 11 心动贩卖机 PIggy
  12. 12 别来无恙 苏星婕
  13. 13 我们的歌 刘大拿
  14. 14 一直很安静 王贰浪
  15. 15 去有风的地方 清音
  16. 16 雪 Distance Capper/罗言
  17. 17 坏女孩 徐良/小凌
  18. 18 乐园 沧桑Cang333/虎皮蛋/曲甲
  19. 19 Ayo(Explicit) Chris Brown/Tyga
  20. 20 我的美丽feat.海洋Bo 海洋Bo/高睿
  21. 21 世事可爱 粥粥和小伙/粥粥
  22. 22 我记得 赵雷
  23. 23 我想牵着你的手 许嵩
  24. 24 人们都不懂 刘诺然
  25. 25 寻一个你(电视剧《苍兰诀》温情主题曲) TTTTTeehom
  26. 26 子莫格尼 杉和
  27. 27 Cat Cafe Shoffy
  28. 28 风停了雨停了我们还拥抱着 Superluckyqi
  29. 29 寂寞沙洲冷 于潼
  30. 30 三国恋 王巨星
  31. 31 达尔文 林俊杰
  32. 32 有些 颜人中
  33. 33 小模样 张小只ya
  34. 34 是否 程响
  35. 35 楼顶上的小斑鸠 队长
  36. 36 笑场 薛之谦
  37. 37 还是分开 张叶蕾
  38. 38 修炼爱情 林俊杰
  39. 39 二零三 毛不易
  40. 40 雅俗共赏 许嵩
  41. 41 Serendipity 古瑞斯Graps/Zakiya晴子
  42. 42 就让这大雨全都落下·2023 刘大拿
  43. 43 老男孩 筷子兄弟
  44. 44 有何不可 许嵩
  45. 45 缓缓 杜宣达
  46. 46 好久不见 陈奕迅
  47. 47 爱的魔法(Cover 金莎) 封茗囧菌
  48. 48 在你的身边 盛哲
  49. 49 带我去找夜生活 告五人
  50. 50 假面舞会 很美味
  51. 51 STAY The Kid LAROI/Justin Bieber
  52. 52 我好想睡觉的 无敌西红柿
  53. 53 日不落(温柔版)
  54. 54 恋爱画板 锦零
  55. 55 7710 好乐无荒/尹露浠
  56. 56 给你呀(又名:for ya) 蒋小呢
  57. 57 Love Story Taylor Swift
  58. 58 Plain Jane(Remix 13z) 鱼幼微
  59. 59 晚风 7opy/BT07
  60. 60 拜托 孙晨
  61. 61 乌梅子酱 李荣浩
  62. 62 南半球与北海道 范倪Liu
  63. 63 星河万里 Rom邢锐
恋爱画板 - 锦零
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

作词 : 李师珏

作曲 : 李师珏

词:李师珏

曲:李师珏

音乐制作人:张博文Bryan Z

编曲:李师珏

吉他:齐成刚

和音编写:金钊

和音:王超

混音/母带工程:李晨曦

录音师:丁有钱

录音棚:KG音乐工厂

混音/母带工作室:Bryan Z Music Studio

制作助理:宋子楚/刘哲/袁永达

音乐制作:华昇音乐(天津)有限公司

封面设计:Zisswn

音乐项目总监:宫尹琳Rainie

监制:张博文Bryan Z

总企划:马越/陈钰彬

企划营销:Hot Cake Studio

OP:天津华昇集团有限公司

出品:Hot Cake Studio

业务联系:hotcakestudio@sina.com

SP:Hot Cake Studio

(未经许可 不得翻唱翻录或使用)

爱情有紫色红色蓝色白色四种颜色

绘画出恋爱中绚烂的世界

开始的时候

牵你的手都会颤抖

我把这种感觉叫做紫色

终于慢慢的熟悉了

世界只剩你和我

只有红色表达的透彻

有时我也会有蓝色的小脾气

只要你能接受这点小情绪

我愿为你穿上永恒的白色婚纱

爱情有紫色红色蓝色白色四种颜色

绘画出恋爱中绚烂的世界

紫色是美好的

红色热烈

蓝色不可避免

白色可否能长一些

爱情有紫色红色蓝色白色四种颜色

每种都代表我对你的感觉

也许我们有与生俱来的差别

但你的一切我了解

有时我也会有蓝色的小脾气

只要你能接受这点小情绪

我愿为你穿上永恒的白色婚纱

爱情有紫色红色蓝色白色四种颜色

绘画出恋爱中绚烂的世界

紫色是美好的

红色热烈

蓝色不可避免

白色可否能长一些

爱情有紫色红色蓝色白色四种颜色

每种都代表我对你的感觉

也许我们有与生俱来的差别

但你的一切我了解

但你的一切我了解

点击右上角即可分享
微信分享提示