房屋水电费:重新布局,重构JS代码

news2024/11/18 5:58:38

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>房租水电费</title>
    <script type="text/javascript">
        document.addEventListener('plusready', function () {
            //console.log("所有plus api都应该在此事件发生后调用,否则会出现plus is undefined。")
        });
    </script>
    <style>
        /* 全局样式 共享样式*/
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        /* position: sticky;固定 */
        caption,
        .date-row {
            position: sticky;
            top: 0;
            left: 0;
            width: 100%;
            z-index: 9999;
            background-color: #144756;
        }
        .date-column,
        .deposit,
        .rent,
        .total-amount,
        .water-electricity-usage,
        .water-electricity-fees,
        .remarks {
            border: 5px solid #333;
            margin: 0 10px;
            background-color: #28a745;
            color: white;
            border-radius: 10px;
        }
        /* 全局样式 共享样式 结束*/
        body {
            background-color: #0a1f19;
            color: #ffffff;
            text-shadow: 1px 1px 1px #000000;
            text-align: center;
        }
        .card-container {
            box-shadow: 0 0 10px 2px rgba(0, 0, 0, 0.2),
                0 0 1px 2px black,
                inset 0 2px 2px -2px white,
                inset 0 0 2px 9px #47434c,
                inset 0 0 2px 12px #f6ff00;
            border-radius: 5px;
            width: 100%;
            margin: 0 auto;
            min-width: 420px;
            max-width: 600px;
            padding: 10px;
            ;
        }
        table {
            width: 100%;
            min-width: 380px;
        }
        /* 标题*/
        caption {
            font-size: 25px;
            background-color: #144756;
        }
        /* 主体 */
        .date-row,
        tbody {
            padding: 12px;
            border-radius: 30px;
            box-shadow: 0 0 10px 2px rgba(0, 0, 0, 0.2),
                0 0 1px 2px black,
                inset 0 2px 2px -2px white,
                inset 0 0 2px 9px #47434c,
                inset 0 0 2px 10px #ff0000;
        }
        /* 日期行 */
        .date-row {
            top: 38px;
            z-index: 99;
            border-radius: 30px 30px 0 0px;
        }
        .date-column {
            display: flex;
            align-items: center;
            justify-content: space-evenly;
            background-color: #144756;
            margin: 0 10px;
        }
        /*日期标题 */
        .date {
            transform: scale(1);
            margin: -180px 10px 0px -95px;
        }
        .year {
            position: relative;
            top: 35px;
            left: 6px;
            padding: 15px 16px 25px 12px;
            border-radius: 10px 10px 0 0;
            color: rgb(234, 255, 0);
            background-color: #ff0000;
        }
        h1 {
            position: absolute;
            border: 5px solid #333;
            width: 135px;
            line-height: 115px;
            font-size: 60px;
            letter-spacing: -3px;
            -webkit-text-fill-color: transparent;
            border-radius: 20px 10px 10px 10px;
            box-shadow: inset 4px 4px 4px rgba(255, 255, 255, 0.6), inset -4px -4px 5px rgba(0, 0, 0, 0.6);
        }
        .month1 {
            clip-path: polygon(0% 0%, 100% 0%, 100% 50%, 0% 50%);
            text-shadow: 1px 1px 1px #d1ec04;
            -webkit-text-stroke: #fffbfb 1px;
        }
        .month2 {
            clip-path: polygon(0% 50%, 100% 50%, 100% 100%, 0% 100%);
            transform: translateY(1px);
            z-index: 20;
            text-shadow: 1px 1px 1px #ff0303;
            -webkit-text-stroke: #ffffff 1px;
        }
        /*日期标题 结束*/
        /* 公共样式 */
        .common-span {
            color: #ffff00;
            position: relative;
            border-radius: 3px;
            font-size: 30px;
            padding: 0 5px;
            font-weight: bold;
            box-shadow: inset -2px -2px 3px rgba(255, 255, 255, 0.589), inset 2px 2px 3px rgba(0, 0, 0, 0.6);
        }
        .common-span::before {
            content: "";
            background: linear-gradient(white, transparent 3%) 50% 50%/97% 97%,
                linear-gradient(rgba(255, 255, 255, 0.5), transparent 50%, transparent 80%, rgba(255, 255, 255, 0.5)) 50% 50%/97% 97%;
            width: 100%;
            height: 100%;
            position: absolute;
            top: 0;
            left: 0;
            border-radius: 5px;
            transform: scale(0.9);
        }
        .common-h2 {
            background-color: #28a7462e;
            color: white;
            border-radius: 0 0 2px 2px;
        }
        /* 水表 */
        .water-meter {
            width: 90px;
            height: 90px;
            margin: 0 10px;
            border-radius: 75px;
            background: #e0f7fa;
            border: 5px solid #0288d1;
            position: relative;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.5);
        }
        .water-meter h2 {
            color: white;
            background: linear-gradient(to top, #0091ea, #00bcd4);
            border-radius: 0 0 75px 75px;
        }
        .water-meter p {
            animation: backgroundChange2 10s infinite;
            margin: 4px;
            font-size: 25px;
            font-weight: bold;
            padding: 0 7px 3px 5px;
        }
        /* 电表 */
        .electric-meter {
            border: 5px solid #333;
            border-radius: 10px;
            background: #fff;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.5);
        }
        .electric-meter h2 {
            background-color: #28a745;
            color: white;
            border-radius: 0 0 2px 2px;
        }
        .electric-meter p {
            margin: 4px;
            font-size: 25px;
            font-weight: bold;
            padding: 0 7px 3px 5px;
        }
        /* 房租 */
        .rent {
            background: #f30000;
            margin: 0 0 0 10px;
        }
        /* 总金额 */
        .total-amount {
            background: #f30000;
            margin: 0 10px 0 0;
        }
        .total-amount b {
            color: #f3f3f3;
        }
        /* 水电量 */
        .water-electricity-usage {
            background-color: #144756;
        }
        /* 水电费 */
        .water-electricity-fees {
            background-color: #144756;
        }
        /* 备注 */
        .remarks {
            margin: 0 10px 10px 10px;
            border-radius: 0 0 30px 30px;
        }
        .remarks b {
            color: #ffff00;
        }
        /* 备注 结束 */
        .total-cost {
            background-color: #28a745;
            border-radius: 30px 30px 0 0;
            margin: 10px 10px 0 10px;
            padding-left: 50px;
        }
        .total-cost sub {
            background-color: #285ba79d;
            border-radius: 3px;
        }
        .center-text {
            text-align: center;
        }
        .water-meter p {
            animation: backgroundChange2 10s infinite;
        }
        .electric-meter p {
            animation: backgroundChange 10s infinite;
        }
        @keyframes backgroundChange2 {
            0%,
            10%,
            20%,
            30%,
            40%,
            50%,
            60%,
            70%,
            80%,
            90%,
            100% {
                box-shadow: 0 0 10px 2px rgba(0, 0, 0, 0.2), 0 0 1px 2px black,
                    inset 0 2px 2px -2px white, inset 0 0 2px 7px #47434c,
                    inset 0 0 2px 22px #ff0000;
                color: #cfd601;
                border-radius: 33px 33px 0 0;
            }
            5%,
            15%,
            25%,
            35%,
            45%,
            55%,
            65%,
            75%,
            85%,
            95% {
                box-shadow: 0 0 10px 2px rgba(0, 0, 0, 0.2), 0 0 1px 2px black,
                    inset 0 2px 2px -2px white, inset 0 0 2px 7px #47434c,
                    inset 0 0 2px 22px #f6ff00;
                color: #ffffff;
                border-radius: 30px 30px 0 0;
            }
        }
        @keyframes backgroundChange {
            0%,
            10%,
            20%,
            30%,
            40%,
            50%,
            60%,
            70%,
            80%,
            90%,
            100% {
                box-shadow: 0 0 10px 2px rgba(0, 0, 0, 0.2), 0 0 1px 2px black,
                    inset 0 2px 2px -2px white, inset 0 0 2px 7px #47434c,
                    inset 0 0 2px 22px #ff0000;
                color: #cfd601;
                border-radius: 2px;
            }
            5%,
            15%,
            25%,
            35%,
            45%,
            55%,
            65%,
            75%,
            85%,
            95% {
                box-shadow: 0 0 10px 2px rgba(0, 0, 0, 0.2), 0 0 1px 2px black,
                    inset 0 2px 2px -2px white, inset 0 0 2px 7px #47434c,
                    inset 0 0 2px 22px #f6ff00;
                color: #ffffff;
                border-radius: 5px;
            }
        }
        @media screen and (max-width: 600px) {
            .card-container {
                width: 100%;
                margin: 0px auto;
                transform: translateY(-25px) scale(0.95);
            }
            .date {
                transform: scale(1);
                margin: -115px 10px 0px -43px;
            }
            h1 {
                font-size: 40px;
                line-height: 80px;
                width: 140%;
            }
        }
    </style>
</head>
<body>
    <div class="card-container">
        <table id="dataTable" class="table">
        </table>
    </div>
</body>
<script>
    // 房租资料
    const rentRecords = [
        {
            "日期": "2024年9月30日",
            "房租": 0, "水表": 71, "电表": 2600, "备注": "哔哩吧啦哔哩吧啦"
        },
        {
            "日期": "2024年8月25日",
            "房租": 1500, "水表": 68, "电表": 2537, "备注": "3个月房租,8月25日-11月25日"
        },
        {
            "日期": "2024年7月25日",
            "房租": 1000, "水表": 66, "电表": 2316, "备注": "房租500元,押金100元"
        }
    ];
    // 计算函数
    function calcCosts(curr, prev) {
        const waterUsage = prev ? curr.水表 - prev.水表 : 0;
        const electricityUsage = prev ? curr.电表 - prev.电表 : 0;
        const waterFee = waterUsage > 0 ? waterUsage * 5 : 0; // 水费计算
        const electricityFee = electricityUsage > 0 ? electricityUsage * 1 : 0; // 电费计算
        const total = curr.房租 + waterFee + electricityFee; // 本月总金额计算
        return {
            waterUsage,
            electricityUsage,
            waterFee,
            electricityFee,
            total,
            waterUsageCalc: `${curr.水表} - ${prev ? prev.水表 : curr.水表} = ${waterUsage} `,
            electricityUsageCalc: `${curr.电表} - ${prev ? prev.电表 : curr.电表} = ${electricityUsage} `,
            waterFeeCalc: `${waterUsage} * 5 = ${waterFee}`,
            electricityFeeCalc: `${electricityUsage} * 1 = ${electricityFee}`,
            totalCalc: `${curr.房租} + ${waterFee} + ${electricityFee} = ${total}`,
        };
    }
    function renderData() {
        const sortedRentRecords = [...rentRecords].sort((a, b) => new Date(b.日期) - new Date(a.日期));
        let totalRent = 0, totalWaterFee = 0, totalElectricityFee = 0;
        const contentArea = document.getElementById('dataTable');
        let content = '';
        // 反向遍历
        for (let index = sortedRentRecords.length - 1; index >= 0; index--) {
            const record = sortedRentRecords[index];
            totalRent += record.房租; // 累加房租
            const prevRecord = index < sortedRentRecords.length - 1 ? sortedRentRecords[index + 1] : null; // 前一条记录
            const { waterUsage, electricityUsage, waterFee, electricityFee,
                waterUsageCalc, electricityUsageCalc, total,
                waterFeeCalc, electricityFeeCalc, totalCalc } = calcCosts(record, prevRecord);
            totalWaterFee += waterFee; // 累加水费
            totalElectricityFee += electricityFee; // 累加电费
            const month = String(parseInt(record.日期.substring(5, 7), 10)).padStart(2, '0');
            // 拼接每一行数据到 content
            content += `
             <thead>
        </thead>
             <tbody>
                <tr class="date-row">
                    <td colspan="2">
                           <div class="total-cost">
                    <sub>总房租 ${totalRent}元</sub>
                    <sub>总水费 ${totalWaterFee}元</sub>
                    <sub>总电费 ${totalElectricityFee}元</sub>
                    <sub>总合计 ${totalRent + totalWaterFee + totalElectricityFee}元</sub>
                </div>
                           <div class="date-column">
                            <div class="date">
                                <div class="year-month">
                                    <sub class="year">${record.日期.substring(0, 5)}</sub>
                                    <h1 class="month1">${month}月</h1>
                                </div>
                                <h1 class="month2">${month}月</h1>
                            </div>
                            <div class="water-meter">
                                <p>${record.水表}</p>
                                <h2>水表</h2>
                            </div>
                            <div class="electric-meter">
                                <p>${record.电表}</p>
                                <h2>电表</h2>
                            </div>
                        </div>
                    </td>
                </tr>
                <tr class="rent-row">
                    <td>
                        <div class="rent">
                            <p>${record.房租}元/月</p>
                            <span class="common-span">${record.房租}元</span>
                            <h2 class="common-h2">房租</h2>
                        </div>
                    </td>
                    <td>
                        <div class="total-amount">
                            <p>${totalCalc}</p>
                            <b class="common-span">${total}元</b>
                            <h2 class="common-h2">总金额</h2>
                        </div>
                    </td>
                </tr>
                <tr class="usage-row">
                    <td>
                        <div class="water-electricity-usage">
                            <h2 class="common-h2">水电量</h2>
                            <div class="water-electricity-usage-column">
                                <div>
                                    <p>水${waterUsageCalc}</p>
                                    <span class="common-span">${waterUsage}吨</span>
                                </div>
                                <div>
                                    <p>电${electricityUsageCalc}</p>
                                    <span class="common-span">${electricityUsage}度</span>
                                </div>
                            </div>
                        </div>
                    </td>
                    <td>
                        <div class="water-electricity-fees">
                            <h2 class="common-h2">水电费</h2>
                            <div class="water-electricity-usage-column">
                                <div>
                                    <p>水${waterFeeCalc}</p>
                                    <span class="common-span">${waterFee}元</span>
                                </div>
                                <div>
                                    <p>电${electricityFeeCalc}</p>
                                    <span class="common-span">${electricityFee}元</span>
                                </div>
                            </div>
                        </div>
                    </td>
                </tr>
                <tr class="remarks-row">
                    <td colspan="2">
                        <div class="remarks"><b>备注:</b><span>${record.备注}</span></div>
                    </td>
                </tr>
            </tbody>
        `;
        }
        // 设置整个表格内容
        contentArea.innerHTML = `
        <caption>
            <b>房租水电费记账本</b>
        </caption>
<tfoot>
    <tr><td class="center-text">到底了,没有更多了!</td></tr>
</tfoot>
        <tbody>
            ${content}
        </tbody>
    `;
    }
    renderData();
</script>
</html>

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

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

相关文章

Windows 环境安装配置 Python 保姆级教程

Python Python 是一种解释型、高级、通用的编程语言。它由 Guido van Rossum 于 1989 年底发明&#xff0c;并于 1991 年首次发布。Python 的设计哲学强调代码的可读性和简洁的语法&#xff08;尤其是使用空格缩进来表示代码块&#xff0c;而非使用大括号或关键词&#xff09;。…

利用PDLP扩展线性规划求解能力

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

智慧产业城智能化总体解决方案

1. 智慧产业城项目概述 智慧产业城项目位于中国武汉高新区&#xff0c;旨在打造一个集高端住宅和商业写字楼于一体的智能化区域。项目规划净用地面积广阔&#xff0c;包含多栋超高层大楼、办公楼、酒店和公寓楼&#xff0c;预计引进众多企业&#xff0c;推动区域经济发展。 2…

搭建帮助中心:8款优质工具分享【2024年最新】

在当今数字化时代&#xff0c;优秀的客户服务已成为企业成功的关键因素之一。一个高效、易用的帮助中心不仅能够提升用户体验&#xff0c;还能有效降低客服成本&#xff0c;增强品牌忠诚度。为了帮助您搭建一个功能强大、内容丰富的帮助中心&#xff0c;我们精心挑选了8款优质工…

「重构:改善既有代码的设计」实战篇

前言 在软件开发的世界里&#xff0c;代码重构是提升项目质量、适应业务变化的关键步骤。最近&#xff0c;我重新翻阅了《重构&#xff1a;改善既有代码的设计 第二版》&#xff0c;这本书不仅重新点燃了我对重构的热情&#xff0c;还深化了我的理解&#xff1a;重构不仅仅是代…

ROM、RAM 和 Flash 的区别

目录 一、ROM二、RAM1、内存工作原理 三、Flash 在计算机的组成结构中&#xff0c;有一个很重要的部分&#xff0c;就是存储器。存储器是用来存储程序和数据的部件&#xff0c;对于计算机来说&#xff0c;有了存储器&#xff0c;才有记忆功能&#xff0c;才能保证正常工作。存储…

RocketMQ 消息示例-topic、broker、messagequeue

topic主题里面是会有一些队列的。 可以看到消费的消息来自于不同的broker。broker后面还带有queueid&#xff0c;可以看到brokera后面是带有四个队列。 同理brokerb也会有四条队列。 创建topic并没有指定创建在哪个broker上面。它会去创建在默认的broker cluster上面。 brokerC…

DataFlow 专业版 标准版奶牛管理系统软件

DataFlow 专业版 标准版奶牛管理系统软件特点&#xff1a;是一个控制挤奶和奶牛监测的综合管理系统&#xff0c;能够通过挤奶设备等进行信息采集&#xff0c;生成报告、图表、分析、任务列表和终生奶牛卡历史等。该系统还可以控制和支持分群门、饲喂系统和称重系统等奶厅相关组…

嵌入向量生成与查询

嵌入向量生成与查询 文本嵌入模型 M3E 是 Moka Massive Mixed Embedding 的缩写 Moka&#xff0c;此模型由 MokaAI 训练&#xff0c;开源和评测&#xff0c;训练脚本使用 uniem&#xff0c;评测 BenchMark 使用 MTEB-zh Massive&#xff0c;此模型通过千万级 (2200w) 的中文句…

React 原理分析

优质博文&#xff1a;IT-BLOG-CN 一、简介 为什么我要用react&#xff1f;JQuery也挺好的呀&#xff1f; 1、因为浏览器和JavaScript一直在更新&#xff0c;新版前端框架可以更好对接新的API&#xff0c;更好的利用浏览器的能力&#xff0c; 提供更新潮强大的功能。 2、react…

C++中,如何使你设计的迭代器被标准算法库所支持。

iterator&#xff08;读写迭代器&#xff09; const_iterator&#xff08;只读迭代器&#xff09; reverse_iterator&#xff08;反向读写迭代器&#xff09; const_reverse_iterator&#xff08;反向只读迭代器&#xff09; 以经常介绍的_DList类为例&#xff0c;它的迭代…

番茄间的一分钟休息

很多人喜欢使用番茄工作法&#xff0c;在25分钟内集中工作。这种方法提高了25分钟内的工作效率&#xff0c;但是也增加了自己的疲劳程度。 我建议&#xff0c;在25分钟的工作时间内&#xff0c;要保持对自己身体的觉察。如果感觉呼吸短促&#xff0c;有一些紧张&#xff0c;用…

C0007.Clion中添加ui文件及运行的完整步骤

1.创建ui文件 选择Ui文件目录&#xff0c;右击&#xff0c;打开Qt Designer&#xff1b; 创建完成后&#xff0c;保存ui界面&#xff0c;并且命名为test.ui&#xff1b; 2.新建头文件test.h 在include目录中&#xff0c;新建头文件&#xff0c;文件名为test.h 3.新建test.…

ScrapeGraphAI 大模型增强的网络爬虫

在数据驱动的动态领域&#xff0c;从在线资源中提取有价值的见解至关重要。从市场分析到学术研究&#xff0c;对特定数据的需求推动了对强大的网络抓取工具的需求。 NSDT工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线…

C++语言学习(1): std::endl 在做什么?

std::endl 是一个函数&#xff08;而不是变量&#xff09;&#xff1a; std::endl 会向控制台写入 \n 字符&#xff0c;并且刷新缓冲。 刷新缓冲肯定比不刷新缓冲慢。 这就是为什么有些 guide 里提到&#xff0c;少用 std::endl, 多用 \n.

Notepad++ 之 AndroidLogger插件

背景 最近一段时间在分析Android log 定位问题&#xff0c;Notepad 之前用的比较少&#xff0c;现在看log觉得确实好用&#xff0c;美中不足的是 看Android log的时候不像 logcat -v color 可以区分不同等级的颜色&#xff0c;于是调研了一下&#xff0c;发现大部分都是使用An…

DAY84服务攻防-端口协议桌面应用QQWPS 等 RCEhydra 口令猜解未授权检测

Day84&#xff1a;服务攻防-端口协议&桌面应用&QQ&WPS等RCE&hydra口令猜解&未授权检测_wps漏洞复现 rce-CSDN博客https://blog.csdn.net/qq_61553520/article/details/137119893?ops_request_misc%257B%2522request%255Fid%2522%253A%25220E34BCAF-166A-4…

Python 实现指定股票三日趋势分析脚本及原理详解

以下是一个基于Python的股票三日趋势分析脚本&#xff0c;它能够分析指定股票在三天内的趋势变化情况。脚本主要依赖pandas、numpy、matplotlib和yfinance等库。分析内容包括收盘价的涨跌趋势、成交量变化&#xff0c;并生成可视化图表来帮助用户更好地理解短期趋势。 脚本的分…

汇总binder相关一些常见面试题-安卓系统常见面试题

背景&#xff1a; 国庆前有几个学员朋友在群里讨论了几个binder相关的面试题&#xff0c;讨论较为激烈&#xff0c;这里马哥统一整理一下列出来了&#xff0c;并且也补充了几个&#xff0c;大家有兴趣的可以尝试做一下&#xff0c;后续方便每个学员进行查缺补漏。后续会进行整…

三维地图场景学习总结 20241002

1. 学习内容 1.1 cesium 学习 基础教程&#xff1a;提供了cesium的配置方式及简单案例 dvgis&#xff1a;该网址提供了关系cesium的使用案例 1.2 OpenStreetMap 学习 List_of_OSM-based_services&#xff1a;提供了openstreetmap所有相关工具及相关使用案例 1.3 三维场景渲…