前言

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

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

【UniApp】-uni-app-项目实战页面布局(苹果计算器)的更多相关文章

  1. 07-08 Flutter仿京东商城项目 商品分类页面布局:Flutter仿京东商城项目 商品分类页面数据渲染

    Flutter实战(交流群:452892873) 本项目是一个实战项目,根据目录建文件,并复制从第一节到最新更新的文章,可以构成完整的一个请求后台数据的项目: CateModel.dart class ...

  2. 37 Flutter仿京东商城项目 结算页面布局

    加群452892873 下载对应34课文件,运行方法,建好项目,直接替换lib目录 CheckOut.dart import 'package:flutter/material.dart'; impo ...

  3. 25 Flutter仿京东商城项目 购物车页面布局

    加群452892873 下载对应25课文件,运行方法,建好项目,直接替换lib目录,在往pubspec.yaml添加上一下扩展. cupertino_icons: ^0.1.2 flutter_swi ...

  4. 15 Flutter仿京东商城项目 搜索页面布局

    Search.dart import 'package:flutter/material.dart'; import 'package:flutter_jdshop/services/ScreenAd ...

  5. 【App FrameWork】框架的页面布局

    之前主要用JqueryMobile+PhoneGap的模式开发移动应用,但JQueryMobile自身存在的硬伤太多,如加载速度缓慢,页面转场白屏.闪烁,头尾部导航浮动问题,页面滚动等等,用户体验效果 ...

  6. 第一次,触碰Web App项目,栽过的那些坑。

    此项目是一个IPad上的Web App项目,页面的滚动用了最新的IScroll 5.0 插件, 确实是挺潮的. 项目用时 1个月 完成的, 准备今天晚上上线. 这是年前的最后一篇文章了,与众位博友分享 ...

  7. Python Django CMDB项目实战之-2创建APP、建模(models.py)、数据库同步、高级URL、前端页面展示数据库中数据

    基于之前的项目代码来编写 Python Django CMDB项目实战之-1如何开启一个Django-并设置base页index页文章页面 现在我们修改一个文章列表是从数据库中获取数据, 下面我们就需 ...

  8. react抽离配置文件、配置@符号、调整src文件夹---配置scss、编写项目的页面结构、创建各个页面 src/views、开始路由、入口文件处修改代码、修改App.js布局文件、添加底部的导航布局、构建个人中心。。。声明式跳转路由、使用React UI库请求渲染首页数据、

    1.回顾 2.react项目的配置 react默认创建的项目配置文件在 node_modules/react-scripts 文件夹内部 2.1 抽离配置文件 cnpm run eject cnpm ...

  9. Redesign Your App for iOS 7 之 页面布局【转】

    前言 iOS7是目前iOS史上最颠覆的一次改版. 它的出现令人兴奋,因为它将会带我们进入一个全新的时代: 它的到来也让我们忧心,因为它颠覆了一切,包括我们过去做过的很多努力. 但是,相信大家乐意为这个 ...

  10. Python Django CMDB项目实战之-3创建form表单,并在前端页面上展示

    基于之前的项目代码 Python Django CMDB项目实战之-1如何开启一个Django-并设置base页.index页.文章页面 Python Django CMDB项目实战之-2创建APP. ...

随机推荐

  1. RabbitMQ 如何实现延迟队列?

    延迟队列是指当消息被发送以后,并不是立即执行,而是等待特定的时间后,消费者才会执行该消息. 延迟队列的使用场景有以下几种: 未按时支付的订单,30 分钟过期之后取消订单. 给活跃度比较低的用户间隔 N ...

  2. VR国标

    <软件基本要求与测试方法>

  3. SQL Server 使用C#窗体与数据库连接,制作数据库查看器

    SQL Server 使用C#窗体与数据库连接,制作数据库查看器 本文中心:讨论C#对SQL Server 的增删改查,使用Treeview制作数据库查看器. SSMS部分:确保SQL Server ...

  4. 彻底解决Chrome“请停用以开发者模式运行的扩展程序”提示(亲测整合)

    本站有大佬已写较全的解决方案(修改dll文件法) 原文链接 但是本人Chrome76版本不适用,匹配不到提示语,在知乎中找到修改注册表的方法可以解决 原文链接 最后附上一个谷歌访问助手吧 链接: ht ...

  5. AcWing - 闫氏DP分析法

    核心思想:从集合角度来分析DP问题 在我们遇到的DP问题中,一般都是求在一个有限集内的最值,但是这些方案数量一般都是指数级别的,想要一个一个查找出来不太可能.所以DP方法是用来优化这种寻找最优方案的过 ...

  6. 炫酷转换:Java实现Excel转换为图片的方法

    摘要:本文由葡萄城技术团队原创并首发.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 前言 在实际开发过程中,经常会有这样的需求:将Excel表格或特定区域 ...

  7. grafana 配置自定义dashboard

    本文为博主原创,转载请注明出处: 1.配置数据源 配置完成后,点击Save And Test,如果配置正确,页面则显示如下: 2.配置dashboard                    点击 A ...

  8. K8s之MySQL实现数据持久化

    这个是一个只写配置及验证的博文: 实现过程: 1. 搭建nfs存储 2. 创建PV 3. 确认PVC 4. 确认PV与PVC的状态 5. 创建pod+svc (service) 6. 进入MySQL数 ...

  9. seed 随机种子的作用

    在随机数生成中,种子(seed)是一个起始值,用于确定随机数生成器的初始状态.通过设置相同的种子,可以确保每次运行程序时生成的随机数序列都是相同的.这种确定性的随机数生成可以带来以下几个好处: 可复现 ...

  10. P1522 [USACO2.4] 牛的旅行 Cow Tours

    Problem 题目简述 给你两个独立的联通块,求:在两个联通块上各找一个点连起来,使得新的联通块的直径的最小值. 思路 本题主要做法:\(Floyd\). 首先,Floyd求出任意两个点之间的最短路 ...