孕期首页登记出生页:改海盐蓝风格,出生日期改底部滚轮选择
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -7,7 +7,7 @@
|
||||
<meta name="mobile-web-app-capable" content="yes">
|
||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||
<title>兜爸心选 · 孕育陪伴</title>
|
||||
<!-- V:26102101 缓存版本标记:改 css/js 时同步 bump 该值(与 js/app.js 的 VER 同源),静态资源按 mtime 走 ETag 自动刷新 -->
|
||||
<!-- V:26102102 缓存版本标记:改 css/js 时同步 bump 该值(与 js/app.js 的 VER 同源),静态资源按 mtime 走 ETag 自动刷新 -->
|
||||
<link rel="stylesheet" href="mama-box.css">
|
||||
<link rel="stylesheet" href="night.css">
|
||||
<!-- 夜晚模式:首屏绘制前就按上次的选择加 class,避免先白后黑闪一下(开关在首页右上角 #nightBtn,逻辑见 app.js) -->
|
||||
@@ -2050,7 +2050,7 @@
|
||||
<!-- 2026-10-05 首页头图:宝宝时不时动一动小手小脚(独立文件,删掉这一行即下线) -->
|
||||
<script src="js/baby-limbs.js?v=26101201"></script>
|
||||
<script src="js/coach.js?v=26101211"></script>
|
||||
<script src="js/birth-flow.js?v=26102104"></script>
|
||||
<script src="js/birth-flow.js?v=26102105"></script>
|
||||
|
||||
<!-- 禁止下拉回弹(2026-10-11 统一规则,与孕期体重同一段):竖向拖动时从手指下往上找还能朝该方向滚的容器,找不到才拦;横滑、双指、可滚列表不受影响 -->
|
||||
<script>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
(function () {
|
||||
'use strict';
|
||||
/* 页面版本号(YYMMDD+序号):显示在「关于兜爸心选」页底部;bump 时同步 head 注释与 ?v= */
|
||||
var VER = '26102101';
|
||||
var VER = '26102102';
|
||||
const $ = (s, c) => (c || document).querySelector(s);
|
||||
const $$ = (s, c) => Array.from((c || document).querySelectorAll(s));
|
||||
|
||||
|
||||
167
js/birth-flow.js
167
js/birth-flow.js
@@ -59,14 +59,56 @@
|
||||
'.bf-btn[disabled]{opacity:.6}' +
|
||||
'.bf-page{position:absolute;inset:0;background:#F8F3EF;overflow-y:auto;-webkit-overflow-scrolling:touch;overscroll-behavior:contain;animation:bfIn .25s ease}' +
|
||||
'@keyframes bfIn{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}' +
|
||||
'.bf-form{padding:calc(22px + env(safe-area-inset-top)) 18px 150px}' +
|
||||
'.bf-form h2{font-size:21px;margin:0}.bf-form .bf-sub{font-size:13px;color:#6B615B;margin:6px 0 18px;line-height:1.6}' +
|
||||
'.bf-row{background:#fff;border-radius:14px;padding:12px 14px;margin-bottom:10px}' +
|
||||
'.bf-row label{display:block;font-size:12.5px;color:#8A7E76;margin-bottom:6px}.bf-row label b{color:#F4593C}' +
|
||||
'.bf-row input{width:100%;border:0;outline:0;background:transparent;font-size:16px;font-weight:600;color:#2B2320;font-family:inherit;padding:2px 0;-webkit-appearance:none;appearance:none;min-height:26px}' +
|
||||
'.bf-seg{display:flex;gap:8px}.bf-seg button{flex:1;border:1.5px solid #EFE7E1;background:#fff;border-radius:10px;padding:9px 0;font-size:14px;color:#2B2320;font-family:inherit}' +
|
||||
'.bf-seg button.on{border-color:#F4593C;color:#F4593C;background:#FFF4EF;font-weight:700}' +
|
||||
'.bf-err{font-size:12.5px;color:#D9442B;min-height:18px;margin-top:2px}' +
|
||||
/* ③ 登记页:海盐蓝(和育儿首页同色系 #4E85C7 / #5B86D0,配浅青),迎接宝宝的感觉 */
|
||||
'.bf-reg{min-height:100%;background:linear-gradient(180deg,#DCEBFA 0%,#EEF6FD 34%,#F6FAFE 62%,#F3FAF8 100%)}' +
|
||||
'.bf-reg .bf-foot{background:linear-gradient(180deg,rgba(243,250,248,0),#F3FAF8 35%)}' +
|
||||
'.bf-reg .bf-sky{position:absolute;left:0;right:0;top:0;height:260px;pointer-events:none;overflow:hidden}' +
|
||||
'.bf-reg .bf-sky i{position:absolute;border-radius:50%;background:#fff;opacity:.55;filter:blur(1px)}' +
|
||||
'.bf-reg .bf-sky b{position:absolute;color:#fff;font-size:12px;opacity:.9;animation:bfTw 2.6s ease-in-out infinite alternate}' +
|
||||
'@keyframes bfTw{from{opacity:.25;transform:scale(.8)}to{opacity:.95;transform:scale(1.1)}}' +
|
||||
'.bf-hero{position:relative;padding:calc(26px + env(safe-area-inset-top)) 22px 6px;text-align:center}' +
|
||||
'.bf-moon{width:104px;height:104px;margin:0 auto 12px;border-radius:50%;background:radial-gradient(circle at 38% 32%,#FFFFFF,#E7F1FC 62%,#D3E5F8);box-shadow:0 10px 30px rgba(78,133,199,.25),inset 0 -6px 14px rgba(78,133,199,.12);display:flex;align-items:center;justify-content:center;animation:bfFloat 3.4s ease-in-out infinite alternate}' +
|
||||
'@keyframes bfFloat{to{transform:translateY(-6px)}}' +
|
||||
'.bf-hero h2{font-size:22px;margin:0;color:#24456B;letter-spacing:.5px}' +
|
||||
'.bf-hero p{font-size:13px;color:#5E7894;margin:8px 0 0;line-height:1.65}' +
|
||||
'.bf-form{position:relative;padding:18px 16px 170px}' +
|
||||
'.bf-card2{background:rgba(255,255,255,.92);border-radius:20px;padding:4px 16px;box-shadow:0 8px 26px rgba(78,133,199,.12);border:1px solid rgba(255,255,255,.9)}' +
|
||||
'.bf-fld{display:flex;align-items:center;gap:12px;padding:15px 0;border-bottom:1px solid #EAF1F8;width:100%;background:none;border-left:0;border-right:0;border-top:0;text-align:left;font-family:inherit;color:inherit}' +
|
||||
'.bf-fld:last-child{border-bottom:0}' +
|
||||
'.bf-fld .bf-fi svg *{fill:none}.bf-fld .bf-fi svg circle[fill]{fill:#4E85C7}.bf-fld .bf-fi{flex:none;width:36px;height:36px;border-radius:12px;display:flex;align-items:center;justify-content:center;background:#E6F0FB}' +
|
||||
'.bf-fld .bf-fb{flex:1;min-width:0}' +
|
||||
'.bf-fld .bf-fl{display:block;font-size:12px;color:#7D93AB;margin-bottom:3px}.bf-fld .bf-fl em{font-style:normal;color:#4E85C7;font-weight:700;margin-left:4px}' +
|
||||
'.bf-fld .bf-fv{display:block;font-size:16.5px;font-weight:700;color:#24456B}.bf-fld .bf-fv small{font-size:12px;font-weight:500;color:#7D93AB;margin-left:6px}' +
|
||||
'.bf-fld .bf-fa{flex:none;color:#A9BCD0;font-size:20px}' +
|
||||
'.bf-fld input{width:100%;border:0;outline:0;background:transparent;font-size:16.5px;font-weight:700;color:#24456B;font-family:inherit;padding:0;-webkit-appearance:none;appearance:none}' +
|
||||
'.bf-fld input::placeholder{color:#B6C6D6;font-weight:500}' +
|
||||
'.bf-sexs{display:flex;gap:10px;padding:4px 0 16px}' +
|
||||
'.bf-sexs button{flex:1;border:1.5px solid #E1EAF4;background:#fff;border-radius:16px;padding:12px 0 10px;font-size:13.5px;color:#4B6380;font-family:inherit;display:flex;flex-direction:column;align-items:center;gap:6px;transition:all .2s}' +
|
||||
'.bf-sexs button i{width:30px;height:30px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-style:normal;font-size:15px;font-weight:800;color:#fff}' +
|
||||
'.bf-sexs .s-boy i{background:#6FA3DD}.bf-sexs .s-girl i{background:#F29BB5}.bf-sexs .s-unknown i{background:#BFCBD8}' +
|
||||
'.bf-sexs button.on{border-color:#4E85C7;background:#EEF5FD;color:#24456B;font-weight:700;box-shadow:0 4px 12px rgba(78,133,199,.18)}' +
|
||||
'.bf-sexs .s-girl.on{border-color:#E57FA0;background:#FDF0F4}' +
|
||||
'.bf-tip{display:flex;gap:8px;align-items:flex-start;margin:14px 4px 0;font-size:12px;color:#7D93AB;line-height:1.6}' +
|
||||
'.bf-err{font-size:12.5px;color:#D9442B;min-height:18px;margin:8px 4px 0}' +
|
||||
'.bf-btn.blue{background:linear-gradient(100deg,#5B8FD6,#4479C2);box-shadow:0 8px 20px rgba(68,121,194,.3)}' +
|
||||
'.bf-btn.ghost.b{color:#7D93AB}' +
|
||||
/* 底部日期滚轮 */
|
||||
'.bf-dmask{position:fixed;inset:0;z-index:2;background:rgba(20,35,55,.42);display:flex;align-items:flex-end;animation:bfFade .2s ease}' +
|
||||
'@keyframes bfFade{from{opacity:0}}' +
|
||||
'.bf-dsheet{width:100%;background:#fff;border-radius:22px 22px 0 0;padding:6px 0 calc(16px + env(safe-area-inset-bottom));animation:bfUp .28s ease}' +
|
||||
'.bf-dhd{display:flex;align-items:center;justify-content:space-between;padding:10px 18px 4px}' +
|
||||
'.bf-dhd b{font-size:16px;color:#24456B}.bf-dhd button{border:0;background:none;font-size:15px;font-family:inherit;padding:6px 2px;color:#7D93AB}' +
|
||||
'.bf-dhd .ok{color:#4479C2;font-weight:700}' +
|
||||
'.bf-dquick{display:flex;gap:8px;padding:6px 18px 2px}.bf-dquick button{border:1px solid #DCE7F3;background:#F5F9FD;color:#4B6380;border-radius:99px;padding:5px 12px;font-size:12.5px;font-family:inherit}' +
|
||||
'.bf-wheels{position:relative;display:flex;height:220px;margin:6px 12px 0;overflow:hidden}' +
|
||||
'.bf-wheels::before{content:"";position:absolute;left:0;right:0;top:88px;height:44px;border-radius:12px;background:#EEF5FD;pointer-events:none}' +
|
||||
'.bf-wheels::after{content:"";position:absolute;inset:0;pointer-events:none;background:linear-gradient(180deg,#fff 0%,rgba(255,255,255,0) 36%,rgba(255,255,255,0) 64%,#fff 100%)}' +
|
||||
'.bf-wh{flex:1;position:relative;overflow-y:scroll;scroll-snap-type:y mandatory;-webkit-overflow-scrolling:touch;scrollbar-width:none;overscroll-behavior:contain}' +
|
||||
'.bf-wh::-webkit-scrollbar{display:none}' +
|
||||
'.bf-wh div{height:44px;line-height:44px;text-align:center;font-size:17px;color:#9AAEC3;scroll-snap-align:center}' +
|
||||
'.bf-wh div.on{color:#24456B;font-weight:700;font-size:18px}' +
|
||||
'.bf-wh div.off{color:#D5DEE8}' +
|
||||
'.bf-wh .pad{scroll-snap-align:none}' +
|
||||
'.bf-foot{position:fixed;left:0;right:0;bottom:0;padding:12px 16px calc(12px + env(safe-area-inset-bottom));background:linear-gradient(180deg,rgba(248,243,239,0),#F8F3EF 35%)}' +
|
||||
'.bf-cele{min-height:100%;background:linear-gradient(180deg,#FFE9DF 0%,#FFF7F2 45%,#F1FAF4 100%);padding:calc(30px + env(safe-area-inset-top)) 18px 130px;text-align:center;position:relative;overflow:hidden}' +
|
||||
'.bf-conf{position:absolute;inset:0;pointer-events:none}.bf-conf i{position:absolute;top:-12px;width:8px;height:12px;border-radius:2px;animation:bfFall 3.2s linear infinite}' +
|
||||
@@ -87,7 +129,7 @@
|
||||
/* ---------- 浮层 ---------- */
|
||||
var ov = document.createElement('div'); ov.className = 'bf-ov'; document.body.appendChild(ov);
|
||||
/* 浮层里滑动不带动后面的首页(禁止下拉回弹规则) */
|
||||
ov.addEventListener('touchmove', function (e) { if (!e.target.closest('.bf-page')) e.preventDefault(); }, { passive: false });
|
||||
ov.addEventListener('touchmove', function (e) { if (!e.target.closest('.bf-page,.bf-wh')) e.preventDefault(); }, { passive: false });
|
||||
function show(html, cls) { ov.innerHTML = html; ov.className = 'bf-ov on' + (cls ? ' ' + cls : ''); }
|
||||
function hide() { ov.className = 'bf-ov'; ov.innerHTML = ''; }
|
||||
|
||||
@@ -98,23 +140,105 @@
|
||||
'<button class="bf-btn" data-bf="reg">出生了,去登记</button><button class="bf-btn ghost" data-bf="later">还没有,明天再问我</button></div>');
|
||||
}
|
||||
|
||||
/* ③ 登记出生 */
|
||||
var sex = 'unknown';
|
||||
/* ③ 登记出生(2026-10-21 用户:出生日期点开从底部弹滚轮选;整页偏育儿首页的海盐蓝,好看一点) */
|
||||
var sex = 'unknown', birth = null;
|
||||
var MOON = '<svg width="62" height="62" viewBox="0 0 64 64" fill="none"><circle cx="32" cy="34" r="17" fill="#FFE9DA"/><path d="M17 30c2-10 9-15 15-15s13 5 15 15c-4-3-9-5-15-5s-11 2-15 5z" fill="#8FB8E6"/><circle cx="26" cy="35" r="1.8" fill="#24456B"/><circle cx="38" cy="35" r="1.8" fill="#24456B"/><path d="M28 41c2.4 1.8 5.6 1.8 8 0" stroke="#24456B" stroke-width="1.8" stroke-linecap="round"/><circle cx="22" cy="40" r="2.6" fill="#F7B6C2" opacity=".7"/><circle cx="42" cy="40" r="2.6" fill="#F7B6C2" opacity=".7"/><path d="M45 14l1.3 3.3 3.3 1.3-3.3 1.3L45 23.2l-1.3-3.3-3.3-1.3 3.3-1.3z" fill="#FFD25C"/></svg>';
|
||||
var ICO = {
|
||||
date: '<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="#4E85C7" stroke-width="1.9" stroke-linecap="round"><rect x="4" y="5.5" width="16" height="14.5" rx="3"/><path d="M4 10h16M9 3.5v4M15 3.5v4"/><circle cx="12" cy="15" r="1.4" fill="#4E85C7" stroke="none"/></svg>',
|
||||
name: '<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="#4E85C7" stroke-width="1.9" stroke-linecap="round"><path d="M12 20s-6.5-4-6.5-9.2A3.8 3.8 0 0 1 12 8.3a3.8 3.8 0 0 1 6.5 2.5C18.5 16 12 20 12 20z"/></svg>',
|
||||
sex: '<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="#4E85C7" stroke-width="1.9" stroke-linecap="round"><circle cx="12" cy="9" r="4.5"/><path d="M5.5 20c1.2-3.4 3.6-5 6.5-5s5.3 1.6 6.5 5"/></svg>'
|
||||
};
|
||||
function dateTxt(d) {
|
||||
var t = midnight(new Date()), n = Math.round((t - d) / 864e5);
|
||||
var tag = n === 0 ? '今天' : n === 1 ? '昨天' : n === 2 ? '前天' : '出生第 ' + (n + 1) + ' 天';
|
||||
return d.getFullYear() + ' 年 ' + (d.getMonth() + 1) + ' 月 ' + d.getDate() + ' 日<small>' + tag + '</small>';
|
||||
}
|
||||
function regPage() {
|
||||
var today = iso(new Date());
|
||||
birth = midnight(new Date());
|
||||
sex = S.babySex === 'boy' || S.babySex === 'girl' ? S.babySex : 'unknown';
|
||||
show('<div class="bf-page"><div class="bf-form"><h2>欢迎宝宝来到这个世界</h2>' +
|
||||
'<div class="bf-sub">填好就能切换到育儿模式。只有出生日期必填,其它以后在育儿首页「我的」里也能改。</div>' +
|
||||
'<div class="bf-row"><label>出生日期 <b>必填</b></label><input type="date" id="bfDate" value="' + today + '" max="' + today + '"></div>' +
|
||||
'<div class="bf-row"><label>宝宝小名</label><input id="bfName" maxlength="12" placeholder="比如:柚子" value="' + esc(S.babyName) + '"></div>' +
|
||||
'<div class="bf-row"><label>宝宝性别</label><div class="bf-seg" id="bfSex">' +
|
||||
['boy:男孩', 'girl:女孩', 'unknown:先不说'].map(function (x) { var p = x.split(':'); return '<button data-sex="' + p[0] + '"' + (p[0] === sex ? ' class="on"' : '') + '>' + p[1] + '</button>'; }).join('') +
|
||||
'</div></div><div class="bf-err" id="bfErr"></div></div>' +
|
||||
'<div class="bf-foot"><button class="bf-btn" data-bf="submit" id="bfSubmit">完成,切换到育儿模式</button><button class="bf-btn ghost" data-bf="close">先不切换</button></div></div>');
|
||||
var stars = '';
|
||||
[[12, 18, 6], [80, 12, 4], [64, 30, 5], [24, 44, 3], [90, 40, 6]].forEach(function (x, i) { stars += '<i style="left:' + x[0] + '%;top:' + x[1] + '%;width:' + x[2] * 6 + 'px;height:' + x[2] * 2.4 + 'px"></i>'; });
|
||||
[[8, 30], [88, 22], [72, 8], [30, 12], [50, 46]].forEach(function (x, i) { stars += '<b style="left:' + x[0] + '%;top:' + x[1] + '%;animation-delay:' + i * .5 + 's"><svg width="12" height="12" viewBox="0 0 12 12"><path d="M6 0l1.4 4.6L12 6 7.4 7.4 6 12 4.6 7.4 0 6l4.6-1.4z" fill="#fff"/></svg></b>'; });
|
||||
show('<div class="bf-page bf-reg"><div class="bf-sky">' + stars + '</div>' +
|
||||
'<div class="bf-hero"><div class="bf-moon">' + MOON + '</div><h2>欢迎宝宝来到这个世界</h2>' +
|
||||
'<p>告诉我们宝宝的生日,首页就换成育儿模式<br>孕期的点点滴滴,都会好好留着</p></div>' +
|
||||
'<div class="bf-form"><div class="bf-card2">' +
|
||||
'<button class="bf-fld" data-bf="date"><span class="bf-fi">' + ICO.date + '</span><span class="bf-fb"><span class="bf-fl">出生日期<em>必填</em></span><span class="bf-fv" id="bfDateTxt">' + dateTxt(birth) + '</span></span><span class="bf-fa">›</span></button>' +
|
||||
'<label class="bf-fld"><span class="bf-fi">' + ICO.name + '</span><span class="bf-fb"><span class="bf-fl">宝宝小名</span><input id="bfName" maxlength="12" placeholder="给宝宝起个小名吧" value="' + esc(S.babyName) + '"></span></label>' +
|
||||
'<div class="bf-fld" style="padding-bottom:6px"><span class="bf-fi">' + ICO.sex + '</span><span class="bf-fb"><span class="bf-fl">宝宝性别</span></span></div>' +
|
||||
'<div class="bf-sexs" id="bfSex">' +
|
||||
[['boy', '男孩', '♂'], ['girl', '女孩', '♀'], ['unknown', '先不说', '?']].map(function (p) { return '<button class="s-' + p[0] + (p[0] === sex ? ' on' : '') + '" data-sex="' + p[0] + '"><i>' + p[2] + '</i>' + p[1] + '</button>'; }).join('') +
|
||||
'</div></div>' +
|
||||
'<div class="bf-tip"><svg width="14" height="14" viewBox="0 0 24 24" style="flex:none;margin-top:2px"><path d="M12 21s-7.5-4.6-7.5-10.6A4.4 4.4 0 0 1 12 7.6a4.4 4.4 0 0 1 7.5 2.8C19.5 16.4 12 21 12 21z" fill="#8FB8E6"/></svg><span>只有出生日期必填,小名和性别以后在育儿首页「我的」里也能改。</span></div>' +
|
||||
'<div class="bf-err" id="bfErr"></div></div>' +
|
||||
'<div class="bf-foot"><button class="bf-btn blue" data-bf="submit" id="bfSubmit">完成,切换到育儿模式</button><button class="bf-btn ghost b" data-bf="close">先不切换</button></div></div>');
|
||||
}
|
||||
|
||||
/* 底部日期滚轮:年 / 月 / 日,最晚今天、最早两年前;快捷「今天 / 昨天」 */
|
||||
function dateSheet() {
|
||||
var page = $('.bf-reg'); if (!page) return;
|
||||
var t = midnight(new Date()), minY = t.getFullYear() - 2;
|
||||
var cur = { y: birth.getFullYear(), m: birth.getMonth() + 1, d: birth.getDate() };
|
||||
var dim = function (y, m) { return new Date(y, m, 0).getDate(); };
|
||||
var box = document.createElement('div'); box.className = 'bf-dmask';
|
||||
box.innerHTML = '<div class="bf-dsheet"><div class="bf-dhd"><button data-d="cancel">取消</button><b>宝宝的生日</b><button class="ok" data-d="ok">确定</button></div>' +
|
||||
'<div class="bf-dquick"><button data-d="q0">今天</button><button data-d="q1">昨天</button><button data-d="q2">前天</button></div>' +
|
||||
'<div class="bf-wheels"><div class="bf-wh" data-k="y"></div><div class="bf-wh" data-k="m"></div><div class="bf-wh" data-k="d"></div></div></div>';
|
||||
ov.appendChild(box);
|
||||
var wh = {}; [].forEach.call(box.querySelectorAll('.bf-wh'), function (w) { wh[w.dataset.k] = w; });
|
||||
function fill(k, from, to, unit) {
|
||||
var h = '<div class="pad"></div><div class="pad"></div>';
|
||||
for (var v = from; v <= to; v++) h += '<div data-v="' + v + '">' + v + unit + '</div>';
|
||||
wh[k].innerHTML = h + '<div class="pad"></div><div class="pad"></div>';
|
||||
}
|
||||
function mark() {
|
||||
['y', 'm', 'd'].forEach(function (k) {
|
||||
[].forEach.call(wh[k].querySelectorAll('[data-v]'), function (el) {
|
||||
var v = +el.dataset.v, y = k === 'y' ? v : cur.y, m = k === 'm' ? v : cur.m, d = k === 'd' ? v : Math.min(cur.d, dim(y, m));
|
||||
el.classList.toggle('on', v === cur[k]);
|
||||
el.classList.toggle('off', new Date(y, m - 1, k === 'd' ? v : 1) > t); /* 晚于今天的灰掉 */
|
||||
});
|
||||
});
|
||||
}
|
||||
function scrollTo(k, smooth) {
|
||||
var el = wh[k].querySelector('[data-v="' + cur[k] + '"]'); if (!el) return;
|
||||
wh[k].scrollTo({ top: el.offsetTop - 88, behavior: smooth ? 'smooth' : 'auto' });
|
||||
}
|
||||
function clamp() {
|
||||
if (cur.d > dim(cur.y, cur.m)) cur.d = dim(cur.y, cur.m);
|
||||
if (new Date(cur.y, cur.m - 1, cur.d) > t) { cur.y = t.getFullYear(); cur.m = Math.min(cur.m, t.getMonth() + 1); if (new Date(cur.y, cur.m - 1, cur.d) > t) { cur.m = t.getMonth() + 1; cur.d = t.getDate(); } }
|
||||
}
|
||||
function rebuildDays() { fill('d', 1, dim(cur.y, cur.m), ' 日'); }
|
||||
fill('y', minY, t.getFullYear(), ' 年'); fill('m', 1, 12, ' 月'); rebuildDays(); mark();
|
||||
['y', 'm', 'd'].forEach(function (k) { scrollTo(k); });
|
||||
var timers = {};
|
||||
['y', 'm', 'd'].forEach(function (k) {
|
||||
wh[k].addEventListener('scroll', function () {
|
||||
clearTimeout(timers[k]);
|
||||
timers[k] = setTimeout(function () {
|
||||
var idx = Math.round(wh[k].scrollTop / 44), items = wh[k].querySelectorAll('[data-v]');
|
||||
var el = items[Math.max(0, Math.min(items.length - 1, idx))]; if (!el) return;
|
||||
var before = cur.y + '-' + cur.m + '-' + cur.d;
|
||||
cur[k] = +el.dataset.v; clamp();
|
||||
if (k !== 'd') { var keep = cur.d; rebuildDays(); cur.d = Math.min(keep, dim(cur.y, cur.m)); clamp(); }
|
||||
mark();
|
||||
if (before !== cur.y + '-' + cur.m + '-' + cur.d || +el.dataset.v !== cur[k]) ['y', 'm', 'd'].forEach(function (q) { scrollTo(q, true); });
|
||||
}, 110);
|
||||
}, { passive: true });
|
||||
});
|
||||
box.addEventListener('click', function (e) {
|
||||
var b = e.target.closest('[data-d]');
|
||||
if (!b) { if (e.target === box) box.remove(); return; }
|
||||
var a = b.dataset.d;
|
||||
if (a === 'cancel') box.remove();
|
||||
else if (a === 'ok') { birth = new Date(cur.y, cur.m - 1, cur.d); $('#bfDateTxt').innerHTML = dateTxt(birth); box.remove(); }
|
||||
else { var q = new Date(t - (+a.slice(1)) * 864e5); cur = { y: q.getFullYear(), m: q.getMonth() + 1, d: q.getDate() }; rebuildDays(); mark(); ['y', 'm', 'd'].forEach(function (k) { scrollTo(k, true); }); }
|
||||
});
|
||||
box.addEventListener('touchmove', function (e) { if (!e.target.closest('.bf-wh')) e.preventDefault(); }, { passive: false });
|
||||
}
|
||||
|
||||
function submit() {
|
||||
var d = parseDay($('#bfDate').value), name = $('#bfName').value.trim();
|
||||
var d = birth, name = $('#bfName').value.trim();
|
||||
var t = midnight(new Date());
|
||||
if (!d) { $('#bfErr').textContent = '请选择出生日期'; return; }
|
||||
if (d > t) { $('#bfErr').textContent = '出生日期不能晚于今天'; return; }
|
||||
@@ -179,6 +303,7 @@
|
||||
if (!a) { if (e.target === ov) hide(); return; }
|
||||
var k = a.dataset.bf;
|
||||
if (k === 'reg') regPage();
|
||||
else if (k === 'date') dateSheet();
|
||||
else if (k === 'later' || k === 'close') hide();
|
||||
else if (k === 'submit') submit();
|
||||
else if (k === 'baby') goBaby();
|
||||
|
||||
Reference in New Issue
Block a user