用CSS给健身的侣朋友做一个喝水记录本

news2025/1/20 5:50:09

前言

事情是这样的,由于七八月份的晚上时不时就坐在地摊上开始了喝酒撸串的一系列放肆的长肉肉项目。 这不,前段时间女朋友痛下决心(心血来潮)地就去报了一个健身的私教班,按照教练给的饮食计划中,其中有一项是每天需要喝 2.6L 的水来促进体内的新陈代谢。 作为伴侣肯定要十分支持的呀,不过因为平时工作也是十分费脑筋的,不会专门去记录每天喝了多少水,特别容易忘记。所以做了这个喝水记录本给她。

开发需求

整体的开发需求和前言里描述的差不多,整体功能拆分一下就非常清晰了。

一、定义变量

1.大杯子:我们需要一个总量目标,用于定义每天的计划值。
2.小杯子:一个单次目标,我们不会一次接一大桶水来喝,即使用小杯子喝水时,每个杯子的刻度值。

二、逻辑整合

1.点击每个小杯子时,从大杯子的总量中扣除小杯子的刻度并记录,对应UI水位升高。
2.首次点击小杯子时,展示百分率刻度值,提升水位。
3.当完成目标值后,隐藏剩余水量的文字。
4."清空"按钮,消除本地记录值,恢复UI水位,展示剩余量。

创建流程和主要代码

此模块代码是应用于小程序使用的,所以代码部分使用wx框架。(下面有普通代码部分)

wxml

构造整体布局,布局和制作大杯子和小杯子。

在上一段开发需求部分中提到的隐藏内容时,注意不要使用 wx:if 直接删除整个标签,这样会导致画面跳动,无法实现动画的平滑过渡。

用三元运算符隐藏文字可以实现较好的过渡

<view class="body"><text class="h1">喝水记录本</text><text class="h3">今日目标: 2.6升 </text><view class="cup"><view class="remained" style="height: {{remainedH}}px"><text class="span">{{isRemained ? liters : ''}}</text><text class="small">{{isRemained ? '剩余' : ''}}</text></view><view class="percentage" style="{{percentageH}}">{{isPercentage ? percentage : ''}}</view></view><text class="text">请选择喝水的杯子</text><view class="cups"><view class="cup cup-small" bindtap="cups" data-ml="700">700 ml</view><view class="cup cup-small" bindtap="cups" data-ml="400">400 ml</view><view class="cup cup-small" bindtap="cups" data-ml="600">600 ml</view><view class="cup cup-small" bindtap="cups" data-ml="500">500 ml</view><view class="cup cup-small" bindtap="cups" data-ml="50">50 ml</view><view class="cup cup-small" bindtap="cups" data-ml="100">100 ml</view><view class="cup cup-small" bindtap="cups" data-ml="150">150 ml</view><view class="cup cup-small" bindtap="cups" data-ml="300">300 ml</view></view><view class="cancle" bindtap="update">清空</view>
</view> 

wxss

css就是简单的画杯子和布局,值得说的就是往大杯子里加水的动画 transition 一下就可以了

.body {height: 108vh;background-color: #3494e4;color: #fff;display: flex;flex-direction: column;align-items: center;box-sizing: border-box;
}

.h1 {margin: 10px 0 0;
}

.h3 {font-weight: 400;margin: 10px 0;
}

.cup {background-color: #fff;border: 4px solid #144fc6;color: #144fc6;border-radius: 0 0 40px 40px;height: 330px;width: 150px;margin: 30px 0;display: flex;flex-direction: column;overflow: hidden;
}

.cup.cup-small {height: 95px;width: 50px;border-radius: 0 0 15px 15px;background-color: rgba(255, 255, 255, 0.9);cursor: pointer;font-size: 14px;align-items: center;justify-content: center;text-align: center;margin: 5px;transition: 0.3s ease;
}

.cup.cup-small.full {background-color: #6ab3f8;color: #fff;
}

.cups {display: flex;flex-wrap: wrap;align-items: center;justify-content: center;width: 280px;
}

.remained {display: flex;flex-direction: column;align-items: center;justify-content: center;text-align: center;flex: 1;transition: 0.3s ease;
}

.remained .span {font-size: 20px;font-weight: bold;
}

.remained .small {font-size: 12px;
}

.percentage {background-color: #6ab3f8;display: flex;align-items: center;justify-content: center;font-weight: bold;font-size: 30px;height: 0;transition: 0.3s ease;box-sizing: border-box;
}

.text {text-align: center;margin: 0 0 5px;
}

.cancle {cursor: pointer;
} 

js

逻辑注释写在了代码中

Page({data: {liters: '2.6L',isPercentage: true,isRemained: true,percentage: '',percentageH: 'height: 0',RemainedH: 0,goal: 2600},// 每次进入页面后加载记录的值,执行动画onShow() {this.setData({ goal: Number(wx.getStorageSync('goal')) })this.updateBigCup(2600 - this.data.goal)},// 点击小杯子时的触发逻辑cups(data) {const ml = Number(data.currentTarget.dataset.ml);const goal = this.data.goal - ml;const total = 2600 - goal;this.setData({ goal })wx.setStorageSync("goal", goal);this.updateBigCup(total)},// 更新 UI 数据updateBigCup(total) {const { goal } = this.data;if (goal != 2600) {this.setData({isPercentage: true,percentage: `${(total / 2600 * 100).toFixed(0)}%`,percentageH: `height: ${total / 2600 * 330}px`})}if (goal <= 0) {this.setData({remainedH: 0,isRemained: false,})} else {this.setData({isRemained: true,liters: `${goal / 1000}L`})}},// 清空记录值update() {wx.removeStorage({ key: 'goal' })this.setData({goal: 2600,isPercentage: false,isRemained: true,remainedH: 0,percentageH: 'height: 0px',liters: '2.6L'})}
}) 

码上掘金

上面的代码部分主要用于小程序使用,码上掘金可在网页中使用。

结语

感谢大家能看到这里!!本篇的代码本身没有什么技术含量,可能是比较会偏向实用性的一篇,对!是有一些的对吧!可以自己改装成Chrome插件使用会更方便更实用。啥?你问我为什么不直接写Chrome插件?有没有一种可能不是我不想,而是😭。

好啦,如果你身边有健身的朋友也可以给他做一个哦~再次谢谢大家

最后

整理了一套《前端大厂面试宝典》,包含了HTML、CSS、JavaScript、HTTP、TCP协议、浏览器、VUE、React、数据结构和算法,一共201道面试题,并对每个问题作出了回答和解析。

有需要的小伙伴,可以点击文末卡片领取这份文档,无偿分享

部分文档展示:



文章篇幅有限,后面的内容就不一一展示了

有需要的小伙伴,可以点下方卡片免费领取

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/93020.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

卵巢早衰与微生物群,营养治疗新进展

卵巢早衰 卵巢早衰&#xff08;premature ovarian insufficiency&#xff0c;简称POI&#xff09;在生殖系统疾病中位居首位&#xff0c;这些疾病可能会损害多个功能系统&#xff0c;降低生活质量&#xff0c;最终剥夺女性患者的生育能力。 目前的激素替代疗法不能改善受孕或降…

NR PDSCH(七) DL SPS

非动态调度&#xff0c;除了PUSCH configured grant type 1和2的传输&#xff0c;还有PDSCH SPS 传输&#xff0c;两者的流程基本类似&#xff0c;也有些小区别。在实网并没有见过配置DL SPS PDSCH传输的log&#xff0c;但还是按顺序理一遍相关内容。 RRC/MAC 先看下MAC 38.32…

文件上传,还存储在应用服务器?

一般项目开发中都会有文件、图片、视频等文件上传并能够访问的场景。要实现这样的场景&#xff0c;要么把文件存储在应用服务器上&#xff0c;要么搭建文件服务来存储。但是这两种方式也有不少的缺点&#xff0c;增加运维的成本。 因此&#xff0c;追求用户体验的项目可能会考…

Tomcat安装配置全解

&#x1f44c; 棒棒有言&#xff1a;也许我一直照着别人的方向飞&#xff0c;可是这次&#xff0c;我想要用我的方式飞翔一次&#xff01;人生&#xff0c;既要淡&#xff0c;又要有味。凡事不必太在意&#xff0c;一切随缘&#xff0c;缘深多聚聚&#xff0c;缘浅随它去。凡事…

数据库分库分表

文章目录为什么要分库分表&#xff1f;数据切分垂直切分水平切分&#xff08;每个表的结构相同&#xff09;范围拆分取模拆分&#xff08;一般为业务主键&#xff09;分库分表带来的问题数据倾斜问题热点问题事务问题聚合查询问题分页问题非分区业务查询分库分表实现或工具hash…

DSP篇--C6701功能调试系列之 UART串口测试

目录 1、原理 2、测试 调试的前期准备可以参考前面的博文&#xff1a;DSP篇--C6701功能调试系列之前期准备_nanke_yh的博客-CSDN博客 UART串口收发数据存在两种模式&#xff1a;通常的串口模式&#xff08;McBSP in Serial Port Mode&#xff09;和GPIO模式&#xff08;McBS…

哈希表及其与Java类集的关系

目录 1.哈希表的概念 2.哈希冲突 3.如何避免哈希冲突? 3.1哈希函数设计 3.2 负载因子的调节 4.解决哈希冲突 4.1闭散列 4.1.1线性探测 4.1.2二次探测 4.2开散列(哈希桶) 5.HashMap 6.HashSet 1.哈希表的概念 假设有一组数据,要让你去搜索其中的一个关键码,这种场…

JWT快速入门及所需依赖

目录 1.JWT 1.1什么是JWT 1.2JWT的构成 jwt的头部 payload signature 1.3JWT快速入门案例 2Jwt认证&#xff08;微服务&#xff09; 2.1微服务下统一权限认证 2.2应用认证 3.无状态的JWT令牌如何实现续签功能&#xff1f; 3.1不允许改变Token令牌实现续签 3.2允许改…

计算机毕业设计django基于python大学生多媒体学习系统

项目介绍 随着计算机多媒体技术的发展和网络的普及。采用当前流行的B/S模式以及3层架构的设计思想通过Python技术来开发此系统的目的是建立一个配合网络环境的大学生多媒体学习系统的平台,这样可以有效地解决数据学习系统混乱的局面。 本文首先介绍了大学生多媒体学习系统的发…

eslint Parsing error: The keyword ‘export‘ is reserved

报错 原因 ECMAScript modules(import/export) 是 es6 的语法。 根据 eslint 官方文档 Configure language options &#xff0c;eslint 默认使用 es5 语法&#xff1a; 解决 要让 eslint 知道我在使用 es6 的 modules 语法。有下面几种方法&#xff1a; 设置 env 为 es6&am…

喜讯 | 第三届国际科创节,企企通喜提两项大奖

近日&#xff0c;第三届国际科创节暨数服会STIF奖评选活动重磅揭晓&#xff0c;旨在向科技创新与数字化转型引领者致敬。企企通作为作为数字化采购平台领军者&#xff0c;凭借业内领先的技术实力与优秀的服务口碑&#xff0c;经过层层筛选和专业评审&#xff0c;企企通最终荣膺…

【LeetCode每日一题:1785. 构成特定和需要添加的最少元素~~~数组公式推导+防止整型溢出+向上取整+贪心】

题目描述 给你一个整数数组 nums &#xff0c;和两个整数 limit 与 goal 。数组 nums 有一条重要属性&#xff1a;abs(nums[i]) < limit 。 返回使数组元素总和等于 goal 所需要向数组中添加的 最少元素数量 &#xff0c;添加元素 不应改变 数组中 abs(nums[i]) < limi…

内存管理:虚拟地址空间和堆

准备用一个系列来总结一下内存管理涉及到的相关知识&#xff0c;范围从底层的数据结构和算法&#xff0c;到上层的API的使用&#xff0c;这里的内存管理&#xff0c;目前打算主要是侧重在堆的管理&#xff0c;本文作为一个引子&#xff0c;先粗略讲一下虚拟地址空间、堆管理、a…

​合并PDF文件什么方法很简单?看完你就明白了

想要将几个PDF文件合并到一起&#xff0c;什么方法使用起来是很简单的呢&#xff1f;PDF文件作为大家经常使用的文件之一&#xff0c;对它的编辑需求也很多&#xff0c;除了需要编辑文件的内容之外&#xff0c;还有需要将几个文件合并到一起使用的需求。那么我们如果遇到这种情…

traffic-forward

traffic-forward traffic-forward 是一款python开发的流量转发工具&#xff0c;可以使用python脚本行运行&#xff0c;也可以封装使用命令行&#xff0c;同样可以使用pyinstaller等工具进行封装成Macos&#xff0c;Linux, Windows 下的可执行文件运行&#xff0c;可用于本地流量…

简单理解HTML区块_HTML学习第七篇区块元素和内联元素

简单理解HTML区块_区块元素和内联元素HTML篇_第七章、区块一、区块元素和内联元素1.1块级元素1.2内联元素二、<div>元素三、<span>元素HTML篇_第七章、区块 一、区块元素和内联元素 HTML元素可以通过<div>和<span>元素组合起来&#xff0c;大多数 HT…

固定行数的纵向分栏

【问题】 what can ı configure the jasper report detail heapriider layout ? ı want to print datas side by side and every sides have 4 datas sub bottom 1 data1 5 data5 2 data2 6 data6 3 data3 4 data4 【回答】 整张报表纵向分栏可在 jasper 中设置分栏数&a…

性能高、上手快,实体类转换工具 MapStruct 到底有多强大

1.什么是MapStruct 1.1 JavaBean 的困扰 对于代码中 JavaBean之间的转换&#xff0c; 一直是困扰我很久的事情。在开发的时候我看到业务代码之间有很多的 JavaBean 之间的相互转化&#xff0c; 非常的影响观感&#xff0c;却又不得不存在。我后来想的一个办法就是通过反射&…

用Quasar开发Vue3+Electron跨平台应用的简单指南

1. 前言 Quasar是一个开源的vue.js基础框架&#xff0c;简单配置即可在其基础上进行SPA, SSR, PWA, 手机网站以及跨平台应用程序的开发&#xff0c;本文将简述如何基于Quasar Vue3 Vite Electron进行桌面应用开发。 2. 配置流程 2.1 框架构建 首先&#xff0c;在要存放代…

『NLP学习笔记』NER任务的CRF-layer的原理

NER任务的CRF-layer的原理 文章目录一. 预备工作二. BILSTM-CRF模型2.1. BiLSTM层输出2.2. 如果没有CRF层会怎么样2.3. CRF层可以从训练数据中学到约束三. CRF层3.1. 发射(Emission)分数3.2. 转移(Transition)分数3.3. CRF损失函数3.4. 实际路径得分3.5. 所有可能的路径的得分…