mirror of
https://github.com/eternity4719/HowToLiveBetter.git
synced 2026-10-28 11:44:50 +08:00
加 GitHub Pages 在线检索页:关键词、章节、证据等级、成本维度筛选,VitePress 风格
This commit is contained in:
1 parent
2af75f4ab1
commit
a75a780dbf
4 files changed
+563
No files matched your search
@@ -27,6 +27,7 @@
|
||||
- 证据等级:A / B / C
|
||||
- 来源:
|
||||
- 备注:(争议、适用人群、注意事项)
|
||||
- 标题行下紧跟一行 HTML 注释 `<!-- 成本标签: 钱=0|少|多 时间=少|中|多 毅力=否|些|是 -->`,GitHub 渲染不可见,供 index.html 在线检索按成本维度筛选;新增或改动条目时同步维护。含义:钱 0=不花钱或省钱、少=几十到几百元或每月几十元内、多=上千元或长期显著支出;时间 少=一次几分钟内或顺手、中=一次性数小时或每周小时级、多=每天持续占用;毅力 否=做一次就完、些=改一个习惯或忍一点不适、是=长期对抗惯性
|
||||
|
||||
## 目录结构
|
||||
1. 不要早死(外因:交通、火灾、溺水、跌落、中毒、疫苗、体检筛查、心理危机)
|
||||
|
||||
@@ -37,11 +37,14 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
|
||||
每节内条目按性价比从高到低排列。每条来源的核实过程记录在 [docs/核实记录](docs/核实记录/)。
|
||||
|
||||
仓库根目录的 `index.html` 是在线检索页:按关键词、章节、证据等级和成本维度(花钱、花时间、要毅力)筛选条目,数据直接读本文件。在仓库设置里开启 GitHub Pages(Deploy from a branch,分支 main,目录 /)后即可访问。
|
||||
|
||||
## 1. 不要早死
|
||||
|
||||
本节只收外因死亡和少数证据最硬的疫苗、筛查。收益一栏的数字来自随机试验、大型队列或官方统计,成本一栏是作者按市价的粗估,只用于比较,不作引用。
|
||||
|
||||
### 1. 系安全带,前排后排都系
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=否 -->
|
||||
- 成本:0 元,每次上车 2 秒
|
||||
- 收益:美国 NHTSA 估计安全带使轿车前排乘员致死伤害风险下降 45%,轻型卡车前排下降 60%;2022 年美国死亡的乘用车乘员中,已知系带情况者有 50% 未系;WHO 口径为车内人员死亡风险最多降低 50%。WHO 估计中国 2021 年道路交通死亡 248,099 人(17.4/10 万)
|
||||
- 证据等级:A
|
||||
@@ -49,6 +52,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:NHTSA 的 45%/60% 是基于美国事故数据库的官方估计(引 Kahane 2015),不是随机试验。后排不系同样致命,NHTSA 同一报告中第二排被撞死者 60% 未系带。WHO 的中国死亡数是模型估计,比公安交管登记口径高出数倍,两者定义不同,这里只用 WHO 口径。
|
||||
|
||||
### 2. 骑摩托车、电动自行车戴头盔并扣好
|
||||
<!-- 成本标签: 钱=少 时间=少 毅力=否 -->
|
||||
- 成本:100 到 300 元买一顶,每次戴 5 秒
|
||||
- 收益:Cochrane 荟萃分析:摩托车骑行者戴头盔使死亡风险下降 42%(OR 0.58,95% CI 0.50 到 0.68),头部损伤下降 69%(OR 0.31,95% CI 0.25 到 0.38)
|
||||
- 证据等级:A
|
||||
@@ -56,6 +60,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:数据来自摩托车,电动自行车是外推,但受伤机制一样。头盔要扣好扣带,挂在车把上不算。
|
||||
|
||||
### 3. 装烟雾报警器;冬天在室内烧煤、用燃气取暖的再装一氧化碳报警器
|
||||
<!-- 成本标签: 钱=少 时间=少 毅力=否 -->
|
||||
- 成本:烟雾报警器 30 到 100 元一个,一氧化碳报警器 50 到 150 元一个,装完每年换一次电池
|
||||
- 收益:北卡罗来纳州住宅火灾病例对照研究:可工作的烟雾报警器使死亡风险下降(OR 0.39,95% CI 0.18 到 0.83)。美国 2018 到 2020 年有人居住的住宅致死火灾中 24% 没有烟雾报警器,41% 起火时人在睡觉。中国 2018 年报告一氧化碳中毒死亡 11,523 例,12 月、1 月、2 月死亡有 72.59%、67.42%、66.48% 发生在家中
|
||||
- 证据等级:B
|
||||
@@ -63,6 +68,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:烟雾报警器对死亡率的证据是单个病例对照研究,没有随机试验,所以只给 B。一氧化碳报警器本身没有死亡率研究,收益按「中毒死亡集中在冬季家中」推断。
|
||||
|
||||
### 4. 量血压,高了就吃药降到达标
|
||||
<!-- 成本标签: 钱=少 时间=少 毅力=些 -->
|
||||
- 成本:电子血压计 100 到 200 元,一次 1 分钟;降压药多数每月几元到几十元
|
||||
- 收益:荟萃分析(123 项试验,61 万余人):收缩压每降 10 mmHg,主要心血管事件 RR 0.80(95% CI 0.77 到 0.83),卒中 RR 0.73,心力衰竭 RR 0.72,ACM 下降 13%(RR 0.87,95% CI 0.84 到 0.91)。中国 35 到 75 岁 170 万人筛查:44.7% 有高血压,其中知晓 44.7%、治疗 30.1%、控制 7.2%
|
||||
- 证据等级:A
|
||||
@@ -70,6 +76,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:降压目标值(130 还是 140)仍有讨论,但「知道自己高血压并把它降下来」本身没有争议。中国 10 个高血压里只有不到 1 个控制住,量一次血压是这本书里性价比最高的动作之一。
|
||||
|
||||
### 5. 开车不超速、不酒驾
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=些 -->
|
||||
- 成本:0 元,多花几分钟车程,饭局上少喝
|
||||
- 收益:WHO:平均车速每升高 1%,致死事故风险升高 4%;酒驾风险从很低的血液酒精浓度就开始上升
|
||||
- 证据等级:B
|
||||
@@ -77,6 +84,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:速度与死亡的 1%/4% 来自事故模型的估计,不是随机试验。酒驾 WHO 只给了定性结论,具体剂量效应本节未核实原始文献。
|
||||
|
||||
### 6. 给 4 岁以下儿童用安全座椅,不要抱在怀里
|
||||
<!-- 成本标签: 钱=多 时间=少 毅力=否 -->
|
||||
- 成本:300 到 2000 元一个,能用几年,每次多花 1 分钟
|
||||
- 收益:美国 NHTSA 估计安全座椅使轿车内 1 岁以下婴儿致死伤害风险下降 71%,1 到 4 岁幼儿下降 54%;WHO 口径为婴儿死亡下降 71%
|
||||
- 证据等级:A
|
||||
@@ -84,6 +92,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:数字是美国官方基于事故数据的估计。安全座椅装错等于没装,按说明书固定,1 岁以下反向安装。
|
||||
|
||||
### 7. 儿童近水不离视线,划船、野泳穿救生衣
|
||||
<!-- 成本标签: 钱=少 时间=中 毅力=否 -->
|
||||
- 成本:救生衣 50 到 200 元;看护孩子的注意力
|
||||
- 收益:美国海岸警卫队数据配对队列:休闲船只落水者穿救生衣溺亡风险调整 RR 0.51(95% CI 0.35 到 0.74)。中国 20 岁以下溺水死亡率从 2013 年 6.60/10 万降到 2021 年 3.28/10 万,农村约为城市 2 倍,溺水仍是 1 到 14 岁儿童首位死因;2021 年 0 到 19 岁伤害死亡中溺水占 31.1%、道路交通占 27.9%
|
||||
- 证据等级:A
|
||||
@@ -91,6 +100,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:A 级只对应救生衣;「不离视线」是共识(C),没有随机试验也不会有。中国溺水死亡集中在农村、夏季、15 到 19 岁男性。
|
||||
|
||||
### 8. 60 岁以上练平衡和腿部力量,改造家里的浴室和楼梯
|
||||
<!-- 成本标签: 钱=少 时间=多 毅力=是 -->
|
||||
- 成本:每周 2 到 3 次各 30 分钟的太极或平衡训练;浴室防滑垫、扶手、夜灯几十到几百元
|
||||
- 收益:Cochrane 荟萃分析(108 项试验,23,407 人):运动使老年人跌倒率下降 23%(RaR 0.77,95% CI 0.71 到 0.83),跌倒人数下降 15%(RR 0.85);居家安全评估与改造使跌倒率下降(RR 0.81,95% CI 0.68 到 0.97);太极使跌倒风险 RR 0.71。中国跌倒是 65 岁以上伤害死亡首位原因,2018 年监测的老年人跌倒 55.97% 发生在家中
|
||||
- 证据等级:A
|
||||
@@ -98,6 +108,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:结局是跌倒次数,不是死亡;跌倒到髋部骨折再到死亡的链条在老年人里很短。适用人群为社区居住的 60 岁以上老人。
|
||||
|
||||
### 9. 查乙肝两对半,没有抗体就打疫苗
|
||||
<!-- 成本标签: 钱=少 时间=少 毅力=否 -->
|
||||
- 成本:检查几十元;成人乙肝疫苗 3 针共约 100 到 300 元,半年打完
|
||||
- 收益:启东整群随机试验 30 年随访:新生儿接种乙肝疫苗使原发性肝癌下降 84%(95% CI 23% 到 97%),HBsAg 阳性率下降 72%(95% CI 68% 到 75%)。中国全人群 HBsAg 流行率 1992 到 2014 年下降 52%,5 岁以下下降 97%
|
||||
- 证据等级:A
|
||||
@@ -105,6 +116,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:适用人群是 1992 年前出生、没接种过或抗体已消失的成人。肝癌下降的数字来自新生儿接种,同一试验里青少年补种对 HBsAg 的效力只有 21%,成人接种的收益主要是不再感染,不能直接套用 84%。已感染者(HBsAg 阳性)打疫苗无用,要去看肝病科随访。
|
||||
|
||||
### 10. 女性接种 HPV 疫苗,越早越好
|
||||
<!-- 成本标签: 钱=多 时间=少 毅力=否 -->
|
||||
- 成本:国产二价约 300 多元一针,进口九价约 1300 元一针,2 到 3 针;打针半天
|
||||
- 收益:瑞典 167 万女性队列:接种者浸润性宫颈癌发病率比未接种者低,17 岁前接种 IRR 0.12(95% CI 0.00 到 0.34),17 到 30 岁接种 IRR 0.47(95% CI 0.27 到 0.75)
|
||||
- 证据等级:A
|
||||
@@ -112,6 +124,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:9 到 14 岁收益最大,17 到 30 岁仍有一半以上的下降,30 岁后收益递减。接种后仍要做筛查(见下一条)。
|
||||
|
||||
### 11. 30 岁以上女性做宫颈癌筛查,优先 HPV 检测
|
||||
<!-- 成本标签: 钱=少 时间=少 毅力=否 -->
|
||||
- 成本:HPV 检测 100 到 300 元一次,阴性可 5 年一次;取样几分钟
|
||||
- 收益:印度农村整群随机试验(30 到 59 岁女性):单次 HPV 检测筛查使宫颈癌死亡 HR 0.52(95% CI 0.33 到 0.83),晚期宫颈癌 HR 0.47(95% CI 0.32 到 0.69)
|
||||
- 证据等级:A
|
||||
@@ -119,6 +132,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:这是少数用死亡作为结局的筛查随机试验,且只筛了一轮。打过 HPV 疫苗也要筛,疫苗不覆盖全部型别。
|
||||
|
||||
### 12. 45 到 50 岁起做结直肠癌筛查,粪便免疫化学检测或肠镜
|
||||
<!-- 成本标签: 钱=少 时间=中 毅力=否 -->
|
||||
- 成本:粪便检测几十元,每 1 到 2 年一次;肠镜几百到一千多元,阴性可 10 年一次,需要一天肠道准备
|
||||
- 收益:Cochrane 荟萃分析:粪便隐血筛查使结直肠癌死亡 RR 0.84(95% CI 0.78 到 0.90),参加至少一轮者 RR 0.75。NordICC 随机试验:邀请做肠镜使 10 年结直肠癌发病从 1.20% 降到 0.98%(RR 0.82,95% CI 0.70 到 0.93)
|
||||
- 证据等级:A
|
||||
@@ -126,6 +140,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:争议。NordICC 意向筛查分析中结直肠癌死亡 0.28% 对 0.31%(RR 0.90,95% CI 0.64 到 1.16),没有统计学意义,肠镜对死亡率的好处被高估过;粪便检测的死亡率证据反而更硬。起始年龄各国指南在 45 到 50 岁之间,有家族史的更早。
|
||||
|
||||
### 13. 有心血管病的人和老年人每年打流感疫苗
|
||||
<!-- 成本标签: 钱=少 时间=少 毅力=否 -->
|
||||
- 成本:50 到 150 元一针,每年秋天一次
|
||||
- 收益:心肌梗死后随机双盲试验(2571 人):接种流感疫苗 12 个月 ACM 2.9% 对安慰剂 4.9%(HR 0.59,95% CI 0.39 到 0.89),心血管死亡 HR 0.59。荟萃分析:流感疫苗使主要心血管事件 3.6% 对 5.4%(RR 0.66,95% CI 0.53 到 0.83),心血管死亡 RR 0.74(95% CI 0.42 到 1.30,无统计学意义)
|
||||
- 证据等级:A
|
||||
@@ -133,6 +148,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:争议。A 级只对应有心血管病的人。对健康老年人,Cochrane 综述(Demicheli V 等 2018,Vaccines for preventing influenza in the elderly,https://doi.org/10.1002/14651858.CD004876.pub4)只能给出一季流感发病从 6% 降到 2.4% 的低确定性证据,对死亡率的证据是极低确定性。
|
||||
|
||||
### 14. 查幽门螺杆菌,阳性就根除
|
||||
<!-- 成本标签: 钱=少 时间=少 毅力=些 -->
|
||||
- 成本:碳 13/14 呼气试验 100 到 200 元;四联根除 2 周药费 200 到 500 元
|
||||
- 收益:山东临朐随机干预试验 22 年随访:幽门螺杆菌根除治疗使胃癌发病 OR 0.48(95% CI 0.32 到 0.71),胃癌死亡 HR 0.62(95% CI 0.39 到 0.99)
|
||||
- 证据等级:A
|
||||
@@ -140,6 +156,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:试验人群是胃癌高发区居民,低发区绝对收益会小得多。根除后可能再感染,家人同查同治。
|
||||
|
||||
### 15. 重度吸烟者每年做一次低剂量胸部 CT
|
||||
<!-- 成本标签: 钱=少 时间=少 毅力=否 -->
|
||||
- 成本:200 到 400 元一次,10 分钟;假阳性后的复查和焦虑
|
||||
- 收益:美国 NLST 随机试验(53,454 人,55 到 74 岁、吸烟史 30 包年以上、戒烟不超过 15 年):低剂量 CT 比胸片使肺癌死亡相对下降 20.0%(95% CI 6.8 到 26.7),ACM 相对下降 6.7%(95% CI 1.2 到 13.6)
|
||||
- 证据等级:A
|
||||
@@ -147,6 +164,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:只适用于高危吸烟者。同一试验中低剂量 CT 组 24.2% 的筛查为阳性,其中 96.4% 是假阳性,不吸烟的人做这项检查是花钱买焦虑。
|
||||
|
||||
### 16. 抑郁或有自杀念头时打 12356,家里不囤安眠药和农药
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=否 -->
|
||||
- 成本:0 元;一个电话,或者把药锁起来、农药不放家里
|
||||
- 收益:10 年系统综述:限制致死手段的证据持续增强,镇痛药管控相关自杀下降 43%,跳楼热点加防护后下降 86%(79% 到 91%);校园认知项目使自杀未遂 OR 0.45(95% CI 0.24 到 0.85);抑郁的药物和心理治疗是预防的重要环节。中国 2025 年 5 月 1 日起全国拨 12356 接通心理援助热线,每日不少于 18 小时
|
||||
- 证据等级:B
|
||||
@@ -158,6 +176,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
本节只收对全因死亡率(ACM)效应大、证据硬的慢性风险因素,按性价比从高到低排。除特别标注的随机试验外,数字都来自观察性研究,HR/RR 里含混杂和反向因果,读成「方向和量级」而不是「照做就能拿到的折扣」。
|
||||
|
||||
### 1. 戒烟,越早越好
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=是 -->
|
||||
- 成本:戒断期的毅力(数周到数月);金钱是负成本,一天一包烟约 20–30 元,戒了就省下。
|
||||
- 收益:美国队列(观察性):现吸烟者比从不吸烟者预期寿命短 10 年以上;40 岁前戒掉可消除继续吸烟所带来死亡风险的约 90%,25–34、35–44、45–54 岁戒烟分别约多活 10、9、6 年(原文以寿命年报告)。中国队列(观察性):2010 年代城市男性吸烟者 ACM RR 1.65,农村男性 RR 1.22;主动戒烟满 10 年后归因风险接近消失。
|
||||
- 证据等级:A
|
||||
@@ -165,6 +184,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:二手烟同样致死:2004 年全球约 60.3 万人死于二手烟暴露,占当年总死亡约 1%(Oberg M 等 (2011). Worldwide burden of disease from exposure to second-hand smoke: a retrospective analysis of data from 192 countries. Lancet. https://doi.org/10.1016/S0140-6736(10)61388-8)。自己不吸也要避开别人的烟,尤其别让孩子吸。
|
||||
|
||||
### 2. 不喝含糖饮料
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=些 -->
|
||||
- 成本:零;换成白水或无糖茶还省钱。
|
||||
- 收益:美国两大队列(观察性,约 11.8 万人、3.6 万例死亡):每天 ≥2 份 vs 每月 <1 份,ACM HR 1.21;每天 1–2 份 HR 1.14。欧洲 EPIC 队列(观察性,45 万人):每天 ≥2 杯 vs 每月 <1 杯,含糖软饮 HR 1.08,所有软饮合计 HR 1.17。
|
||||
- 证据等级:A
|
||||
@@ -172,6 +192,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:观察性,重度饮用者整体生活方式更差,效应可能被高估。EPIC 里代糖饮料每天 ≥2 杯 HR 1.26 反而高于含糖饮料,可能是反向因果(已有代谢病的人改喝代糖),别把代糖饮料当成安全替代品大量喝,替代品首选水。
|
||||
|
||||
### 3. 把家里的食盐换成低钠盐(钾盐)
|
||||
<!-- 成本标签: 钱=少 时间=少 毅力=否 -->
|
||||
- 成本:每袋比普通盐贵几元;口味几乎不变,不需要毅力。
|
||||
- 收益:随机试验(中国农村,20995 名有卒中史或 ≥60 岁高血压者,随访 4.74 年):低钠盐组 vs 普通盐组,全因死亡 RR 0.88,卒中 RR 0.86,主要心血管事件 RR 0.87;高钾血症事件两组无显著差异。
|
||||
- 证据等级:A
|
||||
@@ -179,6 +200,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:争议:PURE 队列(观察性,O'Donnell M 等 (2014). Urinary sodium and potassium excretion, mortality, and cardiovascular events. NEJM. https://doi.org/10.1056/NEJMoa1311889)报告估算钠排泄 <3 g/天者死亡+心血管事件复合 OR 1.27,≥7 g/天 OR 1.15,提示钠摄入呈 J 型。但 SSaSS 是随机试验,低钠盐只是部分替换,不会把钠压到那么低。试验人群是高危老人,健康年轻人的绝对获益更小;肾功能不全或在吃保钾类药物的人换盐前先问医生。
|
||||
|
||||
### 4. 每天走到 7000–8000 步
|
||||
<!-- 成本标签: 钱=0 时间=多 毅力=些 -->
|
||||
- 成本:约 60–90 分钟步行,可以拆进通勤和买菜里;不花钱。
|
||||
- 收益:15 个队列的荟萃分析(观察性,47471 人、3013 例死亡):按步数四分位,中位 5801、7842、10901 步/天 vs 3553 步/天,ACM HR 分别 0.60、0.55、0.47;≥60 岁者获益在 6000–8000 步后趋平,<60 岁者在 8000–10000 步后趋平。另一荟萃分析:从约 3867 步/天起开始有效,每多 1000 步/天 ACM 降约 15%。
|
||||
- 证据等级:A
|
||||
@@ -186,6 +208,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:观察性,走得最少的人里混有已经病弱者(反向因果),HR 偏大是常态;但剂量反应清楚,从 4000 步走到 7000 步的边际收益最大,不必执着一万步。和第 7 条是同一件事的两种计量方式,达标一个即可。
|
||||
|
||||
### 5. 有高血压、高血脂就按医嘱规律吃药,别自行停
|
||||
<!-- 成本标签: 钱=少 时间=少 毅力=些 -->
|
||||
- 成本:集采降压药、他汀每月几元到几十元;每天一次的习惯。
|
||||
- 收益:随机试验荟萃分析:收缩压每降 10 mmHg,ACM RR 0.87,主要心血管事件 RR 0.80,卒中 RR 0.73,心衰 RR 0.72;他汀使 LDL 每降 1.0 mmol/L,ACM RR 0.90,主要血管事件 RR 0.78。依从性荟萃分析(观察性):他汀、降压药依从 ≥80% 者 vs 依从差者,ACM RR 分别 0.55、0.71。
|
||||
- 证据等级:A
|
||||
@@ -193,6 +216,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:只对有用药指征的人成立,健康人不需要吃。依从性那组数字是观察性的,「能坚持吃药的人本身更自律」会夸大效应,前两组随机试验数字更可靠。本节不单列血糖控制:强化降糖对 ACM 的证据不如血压、血脂一致。
|
||||
|
||||
### 6. 每晚睡 7 小时左右,作息固定
|
||||
<!-- 成本标签: 钱=0 时间=多 毅力=些 -->
|
||||
- 成本:时间(多数人是把刷手机的时间换成睡觉);固定作息需要一点自律。
|
||||
- 收益:荟萃分析(观察性,16 项研究、138 万人、11.3 万例死亡):睡得短者 ACM RR 1.12,睡得长者 RR 1.30。剂量反应荟萃分析:以 7 小时为最低点,少于 7 小时每少 1 小时 RR 1.06,多于 7 小时每多 1 小时 RR 1.13。UK Biobank 约 6.1 万人腕表数据(观察性):睡眠最规律的四个五分位 vs 最不规律的五分位,ACM 低 20%–48%,规律性比时长更能预测死亡。
|
||||
- 证据等级:A
|
||||
@@ -200,6 +224,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:长睡的高风险多半是反向因果(抑郁、慢性病、睡眠呼吸暂停让人睡得多),不必刻意压缩睡眠;短睡和不规律更值得改。规律性证据目前来自单一队列,单独看属 B 级。
|
||||
|
||||
### 7. 每周累计 150–300 分钟中等强度运动,快走即可
|
||||
<!-- 成本标签: 钱=0 时间=多 毅力=些 -->
|
||||
- 成本:每天 20–45 分钟;不花钱。
|
||||
- 收益:多队列汇总分析(观察性):达到指南下限 1–2 倍(7.5–15 MET·h/周,约合快走 150–300 分钟/周)者 vs 不运动者 ACM HR 0.69;不足下限也有 HR 0.80;3–5 倍时 HR 0.61 到顶,再多不再降但也无害(≥10 倍 HR 0.69)。加速度计测量的荟萃分析:中高强度活动最高四分位 vs 最低 HR 0.52。
|
||||
- 证据等级:A
|
||||
@@ -207,6 +232,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:观察性;加速度计研究随访短、样本偏老,HR 里含反向因果成分,真实效应应小于 0.52 这种量级。和第 4 条二选一即可。
|
||||
|
||||
### 8. 每周做 30–60 分钟力量训练
|
||||
<!-- 成本标签: 钱=0 时间=中 毅力=些 -->
|
||||
- 成本:每周 1–2 次、每次 20–30 分钟;徒手深蹲、俯卧撑不花钱。
|
||||
- 收益:队列荟萃分析(观察性):做力量训练者 vs 不做者 ACM 低 10%–17%;剂量反应呈 J 型,约 30–60 分钟/周时降幅最大(约 10%–20%),更多不再增益;力量+有氧都做 vs 都不做,ACM 更低。
|
||||
- 证据等级:A
|
||||
@@ -214,6 +240,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:观察性,自报运动量。J 型曲线右侧上升段的证据薄,不必因此限制训练量;对老年人另有防跌倒、保肌肉的收益,那是第 1 节的事。
|
||||
|
||||
### 9. 别连着坐太久,隔一阵起身动一动
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=些 -->
|
||||
- 成本:零;设个提醒。
|
||||
- 收益:美国队列(观察性,加速度计):久坐总时长最高四分位 vs 最低 ACM HR 2.63;连续不起身的久坐时段最长四分位 vs 最短 HR 1.96,总量和连续时长各自独立相关。百万人汇总分析(观察性):每天坐 >8 小时且几乎不运动者 vs 坐 <4 小时且最活跃者 HR 1.59;每天约 60–75 分钟中等强度活动可抵消久坐的超额风险(最活跃组坐 >8 小时 HR 1.04,不显著)。
|
||||
- 证据等级:A
|
||||
@@ -221,6 +248,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:观察性,坐得最多的人里含大量病弱者,HR 2.63 这种量级明显含反向因果。可靠的结论是:坐多久不如动多少重要,运动量够时久坐风险基本消失;看电视 ≥3 小时/天的风险各活动水平都在,最活跃组也只是把阈值推到 ≥5 小时(HR 1.16)。
|
||||
|
||||
### 10. 少吃加工肉(火腿、培根、香肠、午餐肉)
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=些 -->
|
||||
- 成本:零,甚至省钱;口味上的一点牺牲。
|
||||
- 收益:荟萃分析(观察性):加工肉最高 vs 最低摄入组 ACM RR 1.23,总红肉 RR 1.29,未加工红肉 RR 1.10(不显著);另一荟萃分析按剂量:加工肉每多 1 份/天 RR 1.23,红肉每多 1 份/天 RR 1.10。
|
||||
- 证据等级:A
|
||||
@@ -228,6 +256,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:争议:NutriRECS 指南(Johnston BC 等 (2019). Unprocessed Red Meat and Processed Meat Consumption: Dietary Guideline Recommendations From the NutriRECS Consortium. Annals of Internal Medicine. https://doi.org/10.7326/M19-1621)用 GRADE 把证据评为低确定性,给出「维持现有摄入」的弱推荐。争的是证据质量而不是方向,没有研究说加工肉有益。未加工红肉效应小且不显著,重点是加工肉。
|
||||
|
||||
### 11. 少喝或不喝酒
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=些 -->
|
||||
- 成本:社交场合的一点尴尬;省钱。
|
||||
- 收益:83 项前瞻研究 60 万现饮者汇总(观察性):ACM 最低点在每周 ≤100 g 纯酒精(约合 5% 啤酒 2.5 L 或 40° 白酒 300 mL);40 岁时每周 100–200 g 者预期寿命少约 6 个月,200–350 g 少 1–2 年,>350 g 少 4–5 年(原文以寿命年报告)。GBD 2016:把各类健康损失合计,风险最低的饮酒量是 0 杯/周。校正研究设计偏倚的荟萃分析:少量饮酒(1.3–24 g/天)vs 终身不饮 RR 0.93(不显著),45–64 g/天 RR 1.19,≥65 g/天 RR 1.35。
|
||||
- 证据等级:A
|
||||
@@ -235,6 +264,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:争议。J 型曲线一方:34 项前瞻研究荟萃(Di Castelnuovo A 等 (2006). Alcohol dosing and total mortality in men and women: an updated meta-analysis of 34 prospective studies. Archives of Internal Medicine. https://doi.org/10.1001/archinte.166.22.2437)报告少量饮酒 ACM 最多低 17%–18%,男性 ≤4 杯/天、女性 ≤2 杯/天仍呈负相关。反方认为「不饮者」里混入了因病戒酒者和整体健康更差的人,Zhao 2023 校正这些偏倚后保护作用消失,GBD 2018 也给 0 最安全。稳妥读法:少喝不会明显伤寿命,多喝一定伤,「为了健康开始喝」没有依据。
|
||||
|
||||
### 12. 把一部分精米白面换成全谷物
|
||||
<!-- 成本标签: 钱=少 时间=少 毅力=些 -->
|
||||
- 成本:糙米、燕麦、全麦面价格略高,口感需要适应。
|
||||
- 收益:荟萃分析(观察性):全谷物每多 90 g/天(约 3 份)ACM RR 0.83,收益持续到 210–225 g/天;另一荟萃分析每多 1 份/天 RR 0.92。
|
||||
- 证据等级:A
|
||||
@@ -242,6 +272,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:观察性,吃全谷物的人整体更健康,效应偏大;研究间异质性高(I² 83%)。不必全换,换一半就已在剂量反应曲线的陡段。
|
||||
|
||||
### 13. 每天吃够 5 份(约 400 g)水果蔬菜
|
||||
<!-- 成本标签: 钱=少 时间=中 毅力=些 -->
|
||||
- 成本:每天几元到十几元;洗切的时间。
|
||||
- 收益:荟萃分析(观察性):每多 200 g/天 ACM RR 0.90,收益持续到 800 g/天;美国两大队列加 26 项队列荟萃:每天 5 份 vs 2 份 ACM HR 0.87,2 份水果+3 份蔬菜最优,再多不再降。
|
||||
- 证据等级:A
|
||||
@@ -249,6 +280,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:观察性,混杂明显(吃菜多的人收入、教育、运动都不同),RR 0.90 是上限量级。两项研究对「够不够」的答案一致:5 份到位,10 份不必。
|
||||
|
||||
### 14. 少吃超加工食品(薯片、方便面、糕点、速食)
|
||||
<!-- 成本标签: 钱=0 时间=多 毅力=是 -->
|
||||
- 成本:要自己做饭或挑原材料食物,时间和毅力成本中等。
|
||||
- 收益:伞状综述(汇总观察性荟萃分析):超加工食品摄入高 vs 低,ACM RR 1.21,心血管病死亡 RR 1.50;两者证据分级分别为「高度提示」和「令人信服」,但 GRADE 确定性为低/极低。
|
||||
- 证据等级:A
|
||||
@@ -256,6 +288,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:争议:分类标准(NOVA)把营养差异很大的食物归为一类,且与含糖饮料、加工肉(第 2、10 条)高度重叠,独立效应难以分离,GRADE 评级低。做到第 2、10 条之后,这一条的边际收益不确定;反方证据是同一篇综述里的低确定性评级本身,目前没有反向结论的原始研究。
|
||||
|
||||
### 15. 做饭、取暖不烧煤和柴,换成电或燃气
|
||||
<!-- 成本标签: 钱=多 时间=少 毅力=否 -->
|
||||
- 成本:农村家庭换灶具加燃料费,每年几百到上千元;城市居民基本已达成。
|
||||
- 收益:中国慢性病前瞻队列(观察性,27.1 万无心血管病成人):做饭用固体燃料 vs 清洁燃料 ACM HR 1.11,取暖用固体燃料 HR 1.14;已从固体燃料换成清洁燃料者 vs 继续用固体燃料者,做饭 HR 0.87、取暖 HR 0.67。室外 PM2.5:104 项队列荟萃,长期暴露每高 10 µg/m³,自然原因死亡 RR 1.08。
|
||||
- 证据等级:A
|
||||
@@ -263,6 +296,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:观察性;换燃料的家庭往往也更富裕,HR 0.67 含混杂。室外 PM2.5 个人能做的有限(搬家、口罩、净化器),空气净化器没有以死亡率为终点的研究,本节不给数字。
|
||||
|
||||
### 16. 把 BMI 控制在 20–25,超重就减
|
||||
<!-- 成本标签: 钱=0 时间=多 毅力=是 -->
|
||||
- 成本:毅力最大的一条:饮食加运动长期坚持,减下来之后维持更难。
|
||||
- 收益:239 项前瞻研究个体数据荟萃(观察性,限定从不吸烟、基线无慢性病、存活满 5 年者):ACM 在 BMI 20–25 最低,25–27.5 HR 1.07,27.5–30 HR 1.20,30–35 HR 1.45,35–40 HR 1.94,40–60 HR 2.76;BMI 25 以上每高 5 kg/m²,东亚人群 HR 1.39。
|
||||
- 证据等级:A
|
||||
@@ -274,6 +308,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
本节只算精力和时间账:每天可用的注意力、反应速度、错误率、被打断后的恢复时间。所有数字都来自实验或队列研究里的直接测量,不换算成寿命或死亡率。多数条目证据等级是 B,这是这个领域的常态,不代表建议不成立。
|
||||
|
||||
### 1. 关掉非必要通知,工作时把手机放到视线之外
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=否 -->
|
||||
- 成本:几分钟设置;几乎不需要毅力
|
||||
- 收益:只是收到通知(不看不碰)就显著拉低注意力任务成绩,效应量与实际接打电话或发短信相当(实验室,大学生);两项实验显示,即便成功克制住不去看手机,自己的手机在场本身就会降低可用认知容量,手机依赖强的人下降最多
|
||||
- 证据等级:B
|
||||
@@ -281,6 +316,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:都是单次实验室任务,日常工作中的累积效应没有直接测量。真正需要随叫随到的岗位可以只留少数联系人的通知
|
||||
|
||||
### 2. 固定起床时间,周末也一样
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=些 -->
|
||||
- 成本:不花钱;周末少睡懒觉,需要一点毅力
|
||||
- 收益:61 名大学生记录 30 天,作息最不规律的五分之一比最规律的五分之一昼夜节律晚约 2.5 小时(褪黑素起始 00:08 vs 21:32),睡眠倾向高峰晚约 1.8 小时;作息规律性与学业成绩正相关(r = 0.37)
|
||||
- 证据等级:B
|
||||
@@ -288,6 +324,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:单一队列、观察性、样本小。模型分析提示节律差异主要来自光照模式不同,所以固定起床时间要配合早上见光才有效
|
||||
|
||||
### 3. 每晚睡够 7 到 8 小时,别把 6 小时当作够用
|
||||
<!-- 成本标签: 钱=0 时间=多 毅力=些 -->
|
||||
- 成本:每天多留 1 到 2 小时给睡眠
|
||||
- 收益:48 名 21 到 38 岁健康成人连续 14 天每晚只睡 6 小时,认知表现累计下降到相当于连续 2 晚完全不睡的水平;而主观困倦评分只在头几天上升,之后几乎不再增加,6 小时组和 4 小时组的主观困倦没有差别(RCT);急性剥夺睡眠(不超过 48 小时)对简单注意力走神的效应量 g = -0.776,对推理准确率 g = -0.125(70 项研究荟萃分析)
|
||||
- 证据等级:A
|
||||
@@ -295,6 +332,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:最重要的一点是「自己觉得不困」不是睡够的证据,长期睡 6 小时的人主观上适应了,表现没有。荟萃分析针对的是急性完全剥夺,慢性限制的效应量来自单项 RCT
|
||||
|
||||
### 4. 下午两点以后不碰咖啡因
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=些 -->
|
||||
- 成本:零;习惯下午喝咖啡的人需要一点毅力
|
||||
- 收益:睡前 6 小时喝 400 mg 咖啡因,客观监测的总睡眠时间比安慰剂少 1.1 到 1.2 小时,而受试者的睡眠日记没有报告出差别,即自己察觉不到;荟萃分析:咖啡因平均使总睡眠时间减少 45 分钟、睡眠效率下降 7%,一杯咖啡(107 mg)需在睡前 8.8 小时以上喝完才不影响睡眠
|
||||
- 证据等级:A
|
||||
@@ -302,6 +340,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:Drake 是单一实验室研究,用的 400 mg 剂量偏大(约两三杯咖啡)。对咖啡因代谢慢的人截止时间要更早。收益口径是睡眠时长,和第 3 条叠加
|
||||
|
||||
### 5. 把邮件和消息改成每天固定几次批量处理
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=些 -->
|
||||
- 成本:不花钱;需要和同事说明回复节奏;毅力中等
|
||||
- 收益:124 名成年人两周内自身对照,限制为每天查 3 次邮件的那周,日常压力显著低于不限次数那周(Cohen's d = 0.37),收到和回复的邮件数量两周并无差别;基线时人们平均每天查邮件 15.5 次
|
||||
- 证据等级:B
|
||||
@@ -309,6 +348,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:单一研究,效应量中等偏小,结果指标是压力而非产出。即时消息未直接研究,只能类推
|
||||
|
||||
### 6. 需要连续思考的工作,隔离几秒钟的打断
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=否 -->
|
||||
- 成本:关门、戴耳机或挂个「勿扰」牌;不花钱
|
||||
- 收益:平均 2.8 秒的打断使序列任务的步骤错误率翻倍,4.4 秒的打断使其翻三倍(实验室);24 名信息工作者的现场观察:平均每 11 分钟切换一次工作主题,57% 的工作主题被打断,当天恢复被打断工作平均要 25 分 26 秒,中间还插了 2.26 个别的事;被打断的人做得更快但报告更高的压力、挫败感、时间压力和努力度(48 人实验)
|
||||
- 证据等级:B
|
||||
@@ -316,6 +356,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:现场研究把打断分为外部打断和自己发起的内部打断两类,关门只挡得住前者,配合第 1、5 条使用
|
||||
|
||||
### 7. 一次只做一件事,不要边开会边回消息
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=些 -->
|
||||
- 成本:零;需要一点毅力
|
||||
- 收益:任务切换后的反应明显更慢、更容易出错(综述);重度媒体多任务者更容易被无关刺激和无关记忆干扰,在任务切换测试上反而表现更差(实验室,大学生)
|
||||
- 证据等级:B
|
||||
@@ -323,6 +364,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:切换成本的具体百分比高度依赖任务类型,这里不给统一数字。Ophir 是横断面比较,无法区分「多任务导致注意力差」还是「注意力差的人更爱多任务」
|
||||
|
||||
### 8. 睡前一小时不看发光屏幕,要看就看纸书或墨水屏
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=是 -->
|
||||
- 成本:不花钱;需要毅力
|
||||
- 收益:实验室交叉试验,睡前读发光电子书比读纸书入睡慢约 10 分钟(25.7 vs 15.8 分钟),晚间褪黑素被压低 55%,次日昼夜节律推迟超过 1.5 小时(褪黑素起始 22:31 vs 21:01),第二天早上更困、要更长时间才完全清醒
|
||||
- 证据等级:B
|
||||
@@ -330,6 +372,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:样本小,实验室受控条件,日常手机亮度和时长下效应可能更小。手机夜间模式能减少多少没有在本研究中测量
|
||||
|
||||
### 9. 下午困了就睡 10 分钟,不要睡半小时
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=否 -->
|
||||
- 成本:10 分钟加一个能躺或趴的地方
|
||||
- 收益:前一晚睡眠受限后,10 分钟小睡立刻改善困倦、疲劳、精力和认知表现,部分收益维持到 155 分钟后;5 分钟几乎没有收益;20 分钟的收益要等 35 分钟后才出现;30 分钟小睡后先有一段睡眠惰性(醒来后表现反而更差),之后才改善
|
||||
- 证据等级:B
|
||||
@@ -337,6 +380,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:单一实验室研究,健康年轻人。睡不着也不必勉强,闭眼躺 10 分钟本身没有研究支持的收益
|
||||
|
||||
### 10. 在开放式办公室工作时用耳塞或找安静房间做需要记忆的活
|
||||
<!-- 成本标签: 钱=少 时间=少 毅力=否 -->
|
||||
- 成本:耳塞几十元;预订会议室要花点时间
|
||||
- 收益:学生在模拟开放办公室工作,背景噪音从 39 dB 升到 51 dB(LAeq)时,记住的词更少、自评更疲劳、动机下降;休息时看带声音的自然影片比只听河流声或办公室噪音更能恢复精力评分
|
||||
- 证据等级:B
|
||||
@@ -344,6 +388,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:单一实验室研究。噪音的主要危害来自能听清内容的人声,白噪音耳机对这一点有帮助,但本研究没有测试耳机
|
||||
|
||||
### 11. 每周工作时间不要超过 49 小时
|
||||
<!-- 成本标签: 钱=少 时间=少 毅力=些 -->
|
||||
- 成本:可能少加班费,或者和上级谈判的成本
|
||||
- 收益:一战时期英国军工厂工人的产出记录:每周 49 小时以内,产出与工时成正比;49 小时以上,产出增速递减,约 63 小时达到最大,70 小时的产出与 56 小时几乎没有差别,即多干的 14 小时是白干
|
||||
- 证据等级:B
|
||||
@@ -351,6 +396,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:数据来自体力劳动、百年前的工厂、以女性为主,阈值对脑力工作不一定相同,作者自己也说其他工种可能更高或更低。方向性结论(超过某个点边际产出趋零)比具体的 49 这个数字可靠
|
||||
|
||||
### 12. 发现自己在反复回想同一件糟心事时,换个需要动手的活
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=些 -->
|
||||
- 成本:不花钱;需要察觉自己在反刍,这本身要练习
|
||||
- 收益:综述:反刍思维加重抑郁、强化负面思考、损害问题解决能力、妨碍实际行动、消耗社会支持;与焦虑、暴食、酗酒、自伤相关
|
||||
- 证据等级:B
|
||||
@@ -358,6 +404,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:这是精力口径里最难量化的一条,综述给的是方向而非数字。「换个活」是作者的经验做法,文献支持的是分散注意力优于继续反刍,具体做什么活没有比较研究
|
||||
|
||||
### 13. 减少让你消耗的人际关系,学会拒绝不想接的请求
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=是 -->
|
||||
- 成本:短期社交摩擦,可能失去部分关系;需要相当的毅力
|
||||
- 收益:120 名 60 到 89 岁丧偶女性的调查:负面社交互动与心理幸福感的关联比正面互动更一致、更强,即一个消耗你的人造成的损失大于一个支持你的人带来的收益
|
||||
- 证据等级:C
|
||||
@@ -365,6 +412,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:样本特殊且是横断面数据,结果指标是幸福感而非精力,放在本节是作者的推断。哪些关系算「消耗」没有客观标准,只能自己判断
|
||||
|
||||
### 14. 把穿什么、吃什么这类低价值决策固定下来
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=否 -->
|
||||
- 成本:不花钱;前期要花一点时间定下默认选项
|
||||
- 收益:无法量化。原始实验称做选择和自我控制会消耗一种共用的有限资源(自我损耗),但两次大规模预注册多实验室复制都没有复现:23 个实验室 2141 人,d = 0.04,95% CI [-0.07, 0.15];36 个实验室 3531 人,d = 0.06,不显著
|
||||
- 证据等级:C
|
||||
@@ -376,6 +424,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
本节只算时间账:每天、每周、每年能省回多少小时,或任务完成率能提高多少。不换算成寿命,也不换算成钱;涉及钱的地方只给算法,不给结论。多数条目的证据是单一研究或时间利用统计,等级以 B、C 为主。
|
||||
|
||||
### 1. 把「打算做」写成「几点、在哪、遇到什么就做什么」
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=否 -->
|
||||
- 成本:每件事花 1 到 2 分钟写一句「如果……就……」(如「周二早 8 点坐到书桌前就先写引言」),零金钱
|
||||
- 收益:荟萃分析 94 项独立检验,形成实施意图的人目标达成率提高,效应量 d = 0.65(中到大),覆盖开始行动、抵御干扰、从失败路线撤出等环节
|
||||
- 证据等级:A
|
||||
@@ -383,6 +432,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:只对自己真想做的事有效,目标本身不想要时写再多也没用;样本多为学生和健康行为研究,工作场景外推需谨慎
|
||||
|
||||
### 2. 开工前写下退出条件
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=些 -->
|
||||
- 成本:立项时花 5 分钟写清「到某日期没达到某指标就停」,零金钱;执行时需要一点面子
|
||||
- 收益:实施意图荟萃分析显示,预先设定的「如果……就……」同样促进「从失败路线上撤出」(disengagement from failing courses of action);省下的是本来会继续投进去的全部时间
|
||||
- 证据等级:B
|
||||
@@ -390,6 +440,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:撤出效应在荟萃分析里是分项结论,没有单独的时间节省数字;退出条件要在情绪冷静的立项期定,事后再定会被已投入的成本带偏(见下一条)
|
||||
|
||||
### 3. 决定是否继续时,只看未来投入和未来回报,不看已投入多少
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=些 -->
|
||||
- 成本:零金钱;需要接受「之前的时间已经没了」这个事实
|
||||
- 收益:已投入的钱、精力、时间会让人更倾向继续(沉没成本效应),98 个效应量的荟萃分析确认效应稳定存在;避开它省下的是被「不想浪费」绑住的后续时间
|
||||
- 证据等级:B
|
||||
@@ -397,6 +448,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:Arkes & Blumer 的剧院实验只核实到定性结论(付更高价买季票的人半年内看戏更多),各组场次数字待核实;Roth 等发现效应随时间推移减弱、年长者受影响更小
|
||||
|
||||
### 4. 估工期时按过去同类任务的实际耗时估,不按计划推
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=否 -->
|
||||
- 成本:零金钱;估之前花几分钟翻一下上次同类事做了多久
|
||||
- 收益:学生预计 33.9 天完成论文,实际 55.5 天,只有 29.7% 按自己的估计按时完成;被要求把过去经历和当前任务挂钩后,按时完成比例从对照组 29.3% 升到 60.0%,乐观偏差消失
|
||||
- 证据等级:B
|
||||
@@ -404,6 +456,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:Buehler 的样本是加拿大大学生,单研究、小样本(37 人和每组约 40 人);参考类预测在工程项目上的做法见 Flyvbjerg;Halkjelsvik 综述指出低估比高估更常见,但效应大小随任务和研究方法变化很大
|
||||
|
||||
### 5. 会前发议程,没议程的会不开;能站着开就站着开
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=否 -->
|
||||
- 成本:组织者会前花 5 到 10 分钟写议程;站会需要参会者配合
|
||||
- 收益:两项调查(958 人和 292 人)中,使用议程是感知会议效果的显著预测因子;实验中 55 组坐着开会比 56 组站着开会时长多 34%,决策质量没有差别
|
||||
- 证据等级:B
|
||||
@@ -411,6 +464,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:站会实验是 5 人小组的实验室任务,长会和大型会议不宜直接外推;Leach 的结论是「感知效果」,不是客观产出
|
||||
|
||||
### 6. 砍会议数量,能用文字异步解决的不开会
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=些 -->
|
||||
- 成本:需要同事和上级配合;写清楚一段文字比开口说费一点精力
|
||||
- 收益:每周工作 35 小时以上的员工中(676 人和 304 人两项调查),会议时间需求与工作态度和幸福感的关系受会议质量、任务依赖程度调节;一周日记研究显示当天开会次数越多,疲劳和主观工作量越高。省下的时间等于砍掉的会议时长本身
|
||||
- 证据等级:B
|
||||
@@ -418,6 +472,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:争议:Rogelberg 2006 发现会议多少与幸福感的关系并非单向,任务高度依赖他人的岗位上会议多反而不坏;没有直接研究把「异步替代」和会议做过对照,异步替代属于作者推论
|
||||
|
||||
### 7. 把大任务拆成子任务再估时、再开工
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=否 -->
|
||||
- 成本:拆分本身花 5 到 15 分钟,零金钱
|
||||
- 收益:人们估工期时不会自发把多面任务拆成子部分(写文献综述、写讨论、整理参考文献等),先列出子任务再估计可以减少规划谬误;拆开后每一小步都成为一个可以立刻开始的动作,也降低拖延(拖延的强预测因子包括任务厌恶感和任务延迟)
|
||||
- 证据等级:B
|
||||
@@ -425,6 +480,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:Kruger & Evans 只核实到摘要的定性结论,未核实到具体百分比;拆得过细本身也耗时间,以「每个子任务能在一次坐下来的时间内完成」为度
|
||||
|
||||
### 8. 给没有外部截止的事自己定一个日期
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=些 -->
|
||||
- 成本:零金钱;定了要认,否则等于没定
|
||||
- 收益:有外部截止的学生 80.6% 在截止前完成,而只有 38.7% 在自己预计的时间内完成;完成时间与截止日期强相关(r = 0.82),与自己的预计只弱相关
|
||||
- 证据等级:B
|
||||
@@ -432,6 +488,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:研究证实的是外部截止的作用,自己设的截止(时间盒、番茄钟一类)效果没有直接检验,属于类推;把自设截止告诉别人可以让它更接近外部截止
|
||||
|
||||
### 9. 用自己的时薪决定哪些家务外包
|
||||
<!-- 成本标签: 钱=多 时间=少 毅力=否 -->
|
||||
- 成本:外包费用;需要先算一次账
|
||||
- 收益:中国居民家务劳动每日平均 1 小时 17 分钟,做家务的人平均 1 小时 59 分钟(2024 年调查,3.85 万户 10.7 万人);四国 6271 人的样本里,花钱买时间的人生活满意度更高,田野实验中买时间的一次消费比买实物带来更高的当下幸福感
|
||||
- 证据等级:B
|
||||
@@ -439,6 +496,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:算法:时薪 = 一个月税后收入 ÷ 一个月实际工作小时;某项家务的外包单价低于时薪、且省下的时间你确实会用在收入或休息上,就外包。只给方法,不给结论,因为每个人的时薪和外包价不同;Whillans 的结果是幸福感口径,不是时间口径
|
||||
|
||||
### 10. 给短视频和无目的刷屏设硬上限
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=是 -->
|
||||
- 成本:毅力大;需要关推送、删应用或设应用限时
|
||||
- 收益:中国居民互联网使用每日平均 5 小时 37 分钟,使用者平均 6 小时 3 分钟,参与率 92.9%(2024 年);2018 年同口径为 2 小时 42 分钟。这是本节里数字最大的一项,砍掉其中一小时等于每年多出 365 小时
|
||||
- 证据等级:C
|
||||
@@ -446,6 +504,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:互联网使用时间包含工作、学习和社交,不全是浪费;C 级是因为没有研究量化「限制后省回多少并用到哪里」,只有总量统计
|
||||
|
||||
### 11. 不看电视和滚动新闻,需要的信息定时集中看
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=些 -->
|
||||
- 成本:毅力中等;可能错过一些即时消息
|
||||
- 收益:美国 15 岁以上人群看电视每天 2.6 小时,占全部休闲时间(5.2 小时)的一半(2025 年);中国居民看电视每天平均 1 小时 40 分钟,75 到 84 岁人群 3 小时 16 分钟(2018 年)
|
||||
- 证据等级:C
|
||||
@@ -453,6 +512,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:只有总量统计,没有研究量化减少看电视/新闻后时间被用去了哪里;「集中看」的做法是作者经验
|
||||
|
||||
### 12. 花一次时间学常用软件的键盘快捷键和自动化
|
||||
<!-- 成本标签: 钱=0 时间=中 毅力=些 -->
|
||||
- 成本:一次性投入几小时到几十小时;初期比用鼠标慢
|
||||
- 收益:251 名有经验的 Word 用户中,多数人很少使用更高效的快捷键,仍以图标工具栏为主;对照实验确认快捷键是三种方式中最快的。省回的时间随每天操作次数累积,长期做同一类工作的人收益最大
|
||||
- 证据等级:B
|
||||
@@ -460,6 +520,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:效率实验只有 6 名参与者,摘要没有给出每次操作节省的秒数;只学每天用到十次以上的操作,学得太全是另一种浪费
|
||||
|
||||
### 13. 选住处时把通勤时长放在前面,缩短单程通勤
|
||||
<!-- 成本标签: 钱=多 时间=中 毅力=否 -->
|
||||
- 成本:高,可能是更高房租或更小的房子,搬家本身也耗时
|
||||
- 收益:中国居民交通活动每日平均 50 分钟,参与者 1 小时 2 分钟(2024 年);德国面板数据显示通勤越长主观幸福感系统性越低,且没有在收入或住房上得到补偿;综述确认通勤满意度随时长下降,与交通方式无关。单程少 30 分钟,每周约省 5 小时
|
||||
- 证据等级:B
|
||||
@@ -471,6 +532,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
本节口径是金钱:节省比例、年化收益差、期望值,不换算成寿命或时间。凡涉及投资的条目只讲算法与已核实的历史数据,不构成投资建议。
|
||||
|
||||
### 1. 关掉所有自动续费,改为到期手动续
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=否 -->
|
||||
- 成本:一次性花 10 到 20 分钟翻一遍支付宝/微信/苹果/安卓的「自动扣款」列表;此后每次续费多点一次
|
||||
- 收益:省下的钱等于「已不再使用却仍在扣费」的订阅总额,因人而异;监管已要求经营者在续费前显著提醒并提供「简便的随时取消」选项,取消无需额外成本(中国,2021 年起施行)
|
||||
- 证据等级:C
|
||||
@@ -478,6 +540,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:确实高频使用的服务,年付通常比月付便宜,保留自动续费反而合算;本条针对的是「忘了在扣」的那部分。
|
||||
|
||||
### 2. 不买彩票
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=否 -->
|
||||
- 成本:零
|
||||
- 收益:按财政部规定,乐透型/数字型彩票奖金比例下限为销售额的 50%,即开型 65%,竞猜型 73%;双色球按销售额的 51% 计提奖金,每投入 1 元长期期望仅返还 0.51 元,期望亏损 49%。2024 年全国彩票销售 6234.86 亿元,其中 1610.31 亿元进入公益金,未回到购彩者手中(中国,2024 年)
|
||||
- 证据等级:A
|
||||
@@ -485,6 +548,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:期望值为负是彩票制度设计的结果,不是运气问题;把它当作 2 元一次的娱乐消费、而非理财,是唯一合理的定位。
|
||||
|
||||
### 3. 不用信用卡最低还款,不为消费开分期或消费贷
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=些 -->
|
||||
- 成本:零;需要在账单日前留足全额还款的现金
|
||||
- 收益:信用卡透支利率 2020 年前以「日利率万分之五」为上限、其 0.7 倍为下限,折合单利年化 18.25%(2021 年起改为发卡机构与持卡人协商定价);最低还款后剩余本金按日全额计息,免息期同时失效。央行已要求发卡机构必须以明显方式展示年化利率,「不得仅展示日利率、日还款额」,看年化数字再决定(中国,2020 年通知)
|
||||
- 证据等级:C
|
||||
@@ -492,6 +556,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:18.25% 由「万分之五 × 365」算得,为单利口径,按月计复利会更高;个别银行有折扣,以自己账单上公示的年化利率为准。真周转不开时,优先找利率更低的正规渠道,不要拖着最低还款滚利息。
|
||||
|
||||
### 4. 拒绝电子产品的延长保修(延保)
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=否 -->
|
||||
- 成本:零;承担保修期外自费维修的小概率支出
|
||||
- 收益:延保定价通常为商品原价的 10% 到 50%;研究引用的行业估计称延保平均毛利率 50% 到 60%,约为普通商品毛利率的 18 倍,2003 年延保只占百思买营收的 3% 到 4% 却贡献了超过 50% 的利润(美国,2000 年代零售数据)
|
||||
- 证据等级:B
|
||||
@@ -499,6 +564,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:毛利率数字是论文转引的行业估计(Business Week 2004),非论文自己的测算;适用于自己能承担一次维修费的普通人,靠一台设备吃饭且无备机的人另算。手机碎屏险类产品要单独按自己的摔机频率算期望值。
|
||||
|
||||
### 5. 优先选通过一致性评价的仿制药和集采中选药
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=否 -->
|
||||
- 成本:零;处方或购药时多问一句「有没有集采/通用名药」
|
||||
- 收益:国家组织药品集采第二批平均降价 53%、最高 93%;截至 2026 年 4 月已开展 11 批、覆盖 490 种药品,通过或视同通过一致性评价的药品达 1695 个,约占临床常用化学药的 2/3(中国,2020 到 2026 年官方数据)
|
||||
- 证据等级:A
|
||||
@@ -506,6 +572,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:争议:集采入围以一致性评价为质量门槛,官方立场是疗效等同;部分临床医生对个别品种的实际疗效差异有质疑,但缺少可引用的系统性证据。换药前问医生,慢病长期用药尤其如此。
|
||||
|
||||
### 6. 喝烧开的自来水,不常年买瓶装水
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=否 -->
|
||||
- 成本:烧水的时间和少量燃气/电费;一个水壶
|
||||
- 收益:北京居民第一阶梯水价 5 元/立方米,即 0.005 元/升;若瓶装水按 1 元/500 毫升计,每升 2 元,是自来水的 400 倍。生活饮用水执行强制性国家标准 GB 5749-2022(2022 年 3 月 15 日发布,2023 年 4 月 1 日起施行,主管部门为国家疾控局)(中国,2015 年水价与 2022 年标准)
|
||||
- 证据等级:C
|
||||
@@ -513,6 +580,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:瓶装水 1 元/500 毫升是为算式设的假设价,按自己所在城市的实价重算;老旧小区二次供水设施不达标的,可以加装过滤或只在此场景买水。各地水价不同,北京数字仅作量级参考。
|
||||
|
||||
### 7. 不频繁交易股票
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=些 -->
|
||||
- 成本:零;需要克制「看到消息就想动」的冲动
|
||||
- 收益:对 66,465 个美国折扣券商家庭账户(1991 到 1996 年)的研究:交易最频繁的一组年化收益 11.4%,同期市场 17.9%,平均家庭 16.4%;平均家庭年换手率 75%。频繁交易组与不频繁组的毛收益差别很小,差距主要来自交易成本(美国,1991 到 1996 年)
|
||||
- 证据等级:A
|
||||
@@ -520,6 +588,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:数据是美国 1990 年代的,A 股的佣金、印花税结构不同,但「换手越高、净收益越低」的机制一致。不构成投资建议。
|
||||
|
||||
### 8. 用宽基指数基金替代主动管理基金作为长期底仓
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=些 -->
|
||||
- 成本:放弃「选中明星基金经理」的可能性;需要接受和指数一样的下跌
|
||||
- 收益:美国主动股票型基金的整体组合接近市场组合,但主动管理的高成本原封不动地变成了投资者更低的净回报;自助法模拟显示很少有基金能产生足以覆盖成本的超额收益(美国,2010 年发表)
|
||||
- 证据等级:B
|
||||
@@ -527,6 +596,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:争议:Harvey CR, Liu Y (2022). Luck versus Skill in the Cross Section of Mutual Fund Returns: Reexamining the Evidence. The Journal of Finance 77(3). https://doi.org/10.1111/jofi.13123 指出 Fama-French 的自助法存在欠采样问题,即使部分基金有显著超额收益也可能无法拒绝零假设,即「几乎没有基金有技能」的结论可能过强。中国主动基金整体是否跑输指数尚无本节可引用的原始文献。不构成投资建议。
|
||||
|
||||
### 9. 同类基金优先选费率低的
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=否 -->
|
||||
- 成本:零;申购前多看一眼「管理费 + 托管费 + 销售服务费」
|
||||
- 收益:费率差异按复利侵蚀:年费率高 1 个百分点,20 年后终值少 0.99^20 ≈ 18.2%,30 年后少约 26%。中国 2023 年起推行公募基金费率改革,下调主动权益类基金管理费率和托管费率上限(具体上限数字待核实)
|
||||
- 证据等级:C
|
||||
@@ -534,6 +604,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:复利算式为纯算术,假设两只基金费前收益相同;实际还要算申购费、赎回费和 C 类份额的销售服务费。不构成投资建议。
|
||||
|
||||
### 10. 健身房按次付费或短周期付费,除非有一年以上的稳定记录
|
||||
<!-- 成本标签: 钱=少 时间=少 毅力=否 -->
|
||||
- 成本:单次价格比年卡均摊价高;需要诚实评估自己的去场频率
|
||||
- 收益:对美国 3 家健身俱乐部 7,752 名会员 3 年数据的研究:选择月费超过 70 美元合同的会员平均每月只去 4.3 次,折合每次超过 17 美元,而 10 次卡只需每次 10 美元;这些用户在会籍期间平均多付 600 美元。月付会员超过一年仍未退卡的比例比年付会员高 17%(美国,三年面板数据)
|
||||
- 证据等级:B
|
||||
@@ -541,6 +612,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:单一研究、美国数据,但机制(高估未来自控力)普遍。已有连续一年每周两次以上记录的人,年卡确实更便宜。
|
||||
|
||||
### 11. 大额非必需购买设 24 小时冷静期,网购善用七日无理由退货
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=些 -->
|
||||
- 成本:延后一天满足;退货运费通常自付
|
||||
- 收益:省下的是冲动购买中「第二天就不想要了」的那部分,无法给出统一比例;网络购买商品自收到之日起七日内可无理由退货,定作、鲜活易腐、已拆封数字商品、报刊除外(中国,2017 年起施行)
|
||||
- 证据等级:C
|
||||
@@ -548,6 +620,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:「冷静期」本身是经验规则,没有直接文献;七日退货是它的制度兜底,退货前先确认商品是否在排除清单内、包装是否完好。
|
||||
|
||||
### 12. 不为「划线价」和大促囤货
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=些 -->
|
||||
- 成本:放弃部分真折扣;需要记住常购商品的日常价
|
||||
- 收益:判断锚定于最先看到的数字,之后的调整通常不足,所以「原价 999 现价 499」会系统性抬高你对便宜程度的估计;监管规定折价基准应为促销前七日内同店最低成交价,也就是说划线价并不必然是曾经的售价(中国,2020 年起施行)
|
||||
- 证据等级:C
|
||||
@@ -555,6 +628,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:锚定效应是实验室结论,对囤货损失没有直接的金钱量化;囤货的隐性成本还包括过期、占地和「反正有,多用点」。只囤保质期长、确定会用完、单价确实低于历史价的东西。
|
||||
|
||||
### 13. 保险优先买消费型,把「返还」「分红」当作不保证的部分
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=些 -->
|
||||
- 成本:消费型保险到期无返还,心理上像「白花了」;需要自己安排储蓄
|
||||
- 收益:监管规则要求分红型产品说明书用加粗字体提示「未来的保单红利为非保证利益,其红利分配是不确定的」,且红利演示的利差上限为 4.5% 减去产品预定利率;返还型/分红型的额外保费本质上是交给保险公司代管的储蓄,收益不保证、流动性差(中国,2023 年起施行)
|
||||
- 证据等级:C
|
||||
@@ -562,6 +636,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:争议:对完全存不下钱的人,返还型的强制储蓄功能有实际价值;本条针对的是有自律的普通人。精算原理上「消费型 + 自己投资」优于「返还型」的量化差距因产品而异,本节没有可引用的系统性数据。不构成投资建议。
|
||||
|
||||
### 14. 提前还房贷之前先做一道比较题,不要凭感觉
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=否 -->
|
||||
- 成本:半小时算账;需要诚实估计自己能拿到的税后稳定收益率
|
||||
- 收益:算法:设房贷年利率 r(按合同,2026 年 8 月 20 日 5 年期以上 LPR 为 3.5%,实际执行利率为 LPR 加减点),可选替代投资的税后年化收益 g。提前还款的确定收益率就是 r;若 g 稳定大于 r,钱留在投资里更划算;若 g 小于 r 或不确定,提前还款等于锁定一笔无风险的 r。等额本息前期利息占比高,越早还省息越多,这一点用银行 App 的「提前还款试算」直接看数字(中国,2026 年利率)
|
||||
- 证据等级:C
|
||||
@@ -573,6 +648,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
本节收的是「看起来便宜又有效」但原始证据显示收益接近零、为零或为负的东西。排序按大众花钱多少与证据硬度综合,越靠前越值得先停掉。
|
||||
|
||||
### 1. 不要为了长寿或防心血管病吃复合维生素
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=否 -->
|
||||
- 成本:约 0.5–2 元/天,一年 200–700 元;长期吞药的心理依赖
|
||||
- 收益:PHS II(14,641 名男医生,中位随访 11.2 年)主要心血管事件 HR 1.01(95% CI 0.91–1.10),全因死亡 HR 0.94(0.88–1.02);USPSTF 2022 汇总 9 项 RCT 51,550 人,多维片与全因死亡无关联,评级 I(证据不足);看起来划算是因为「一片补齐所有营养」的直觉和单价低
|
||||
- 证据等级:A
|
||||
@@ -580,6 +656,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:争议:PHS II 同队列的癌症分析显示总癌症发生 HR 0.92(0.86–0.998,P=0.04),癌症死亡 HR 0.88(0.77–1.01)未达显著(Gaziano JM et al. 2012, JAMA, https://doi.org/10.1001/jama.2012.14641),效应很小且仅见于男医生人群。确诊营养缺乏者、孕妇(叶酸)、饮食极不均衡者不在此列,按医嘱补
|
||||
|
||||
### 2. 不要为了预防心血管病吃普通鱼油
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=否 -->
|
||||
- 成本:约 1–3 元/天,一年 400–1000 元
|
||||
- 收益:VITAL(25,871 人,1 g/天,中位随访 5.3 年)主要心血管事件 HR 0.92(95% CI 0.80–1.06),全因死亡 HR 1.02(0.90–1.15);ASCEND(15,480 名糖尿病患者,1 g/天,平均随访 7.4 年)严重血管事件 RR 0.97(0.87–1.08),全因死亡 RR 0.95(0.86–1.05);看起来划算是因为「吃鱼有益」被直接等同于「吃鱼油胶囊有益」
|
||||
- 证据等级:A
|
||||
@@ -587,6 +664,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:争议:REDUCE-IT(8,179 人,已有心血管病或糖尿病、服他汀且甘油三酯 135–499 mg/dL)用 4 g/天纯 EPA 处方药,主要终点 17.2% vs 22.0%,HR 0.75(0.68–0.83)(Bhatt DL et al. 2019, NEJM, https://doi.org/10.1056/NEJMoa1812792)。那是高剂量处方 EPA 用于高危人群,不等于保健品鱼油用于普通人;吃鱼本身不在本条范围
|
||||
|
||||
### 3. 不要为了长寿给不缺维生素 D 的人补维生素 D
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=否 -->
|
||||
- 成本:约 0.2–0.5 元/天,一年 100–200 元;钱不多,主要是「以为已经做了预防」的错觉
|
||||
- 收益:VITAL(25,871 人,2000 IU/天,中位随访 5.3 年)浸润性癌 HR 0.96(95% CI 0.88–1.06),主要心血管事件 HR 0.97(0.85–1.12),全因死亡 HR 0.99(0.87–1.12);D-Health(21,315 名 60 岁以上澳大利亚人,60,000 IU/月,5 年)全因死亡 HR 1.04(0.93–1.18),死亡率 5.3% vs 5.1%;看起来划算是因为观察性研究里维 D 水平低的人死亡率高,被误读为补充即有效
|
||||
- 证据等级:A
|
||||
@@ -594,6 +672,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:争议:两项试验都没有专门纳入真正缺乏者,结论只适用于「不缺的人」;确诊缺乏、骨质疏松、长期不见光、婴幼儿等特定人群仍按医嘱补。本条只针对全因死亡与癌症/心血管终点
|
||||
|
||||
### 4. 不要为了防癌吃抗氧化补剂(β 胡萝卜素、维生素 E、维生素 A)
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=否 -->
|
||||
- 成本:约 0.5–2 元/天;吸烟者的成本是肺癌风险上升
|
||||
- 收益:Cochrane 综述(78 项 RCT,296,707 人)抗氧化补剂总死亡 RR 1.02(95% CI 0.98–1.05),低偏倚风险试验 RR 1.04(1.01–1.07),β 胡萝卜素 RR 1.05(1.01–1.09),维生素 E RR 1.03(1.00–1.05);ATBC(29,133 名男性吸烟者,20 mg/天)肺癌发生率升高 18%(3%–36%),总死亡升高 8%(1%–16%);CARET(18,314 名吸烟者/石棉暴露者)肺癌 RR 1.28(1.04–1.57),全因死亡 RR 1.17(1.03–1.33);看起来划算是因为「抗氧化 = 抗衰老 = 防癌」的推理链每一步都像常识
|
||||
- 证据等级:A
|
||||
@@ -601,6 +680,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:USPSTF 2022 对 β 胡萝卜素和维生素 E 给出 D 级(建议不用),吸烟者和石棉暴露者是明确的受害人群;从蔬菜水果摄入抗氧化物不在本条范围
|
||||
|
||||
### 5. 不要指望氨糖(葡萄糖胺)/软骨素治膝关节炎
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=否 -->
|
||||
- 成本:约 2–5 元/天,一年 700–1800 元
|
||||
- 收益:GAIT(1,583 名膝骨关节炎患者,24 周)疼痛缓解应答率安慰剂 60.1%,氨糖比安慰剂高 3.9 个百分点(P=0.30),软骨素高 5.3 个百分点(P=0.17),两者合用高 6.5 个百分点(P=0.09),均不显著;对照药塞来昔布高 10.0 个百分点(P=0.008);看起来划算是因为「补软骨的原料」听起来直接对症,且安慰剂本身就有六成应答
|
||||
- 证据等级:A
|
||||
@@ -608,6 +688,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:争议:同一试验中基线中重度疼痛亚组合用应答率 79.2% vs 54.3%(P=0.002),但作者明确称之为「探索性分析」。膝关节炎的减重和肌力训练是有证据的替代方案,见第 2 节
|
||||
|
||||
### 6. 不要靠维生素 C 预防感冒
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=否 -->
|
||||
- 成本:泡腾片约 1–2 元/片,一年 300–700 元
|
||||
- 收益:Cochrane 综述(29 项对照,11,306 人)普通人群规律补充维 C 的感冒发生率 RR 0.97(95% CI 0.94–1.00),即基本不减少得感冒的次数;感冒后才开始吃「在治疗性试验中未见一致效应」;看起来划算是因为便宜、酸甜好喝、且「维 C 防感冒」流传了半个世纪
|
||||
- 证据等级:A
|
||||
@@ -615,6 +696,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:争议:同一综述显示长期规律补充可把感冒病程缩短约 8%(成人,3%–12%)、14%(儿童,7%–21%),一次感冒少病半天左右;马拉松、滑雪、寒地行军士兵(5 项试验,598 人)发生率 RR 0.48(0.35–0.64)。绝大多数人不属于这两类
|
||||
|
||||
### 7. 不要给没有症状的自己做「全身 PET-CT」或「肿瘤标志物套餐」
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=否 -->
|
||||
- 成本:全身 PET-CT 约 7000–10000 元/次并伴随电离辐射;肿瘤标志物套餐几百元;真正的成本是假阳性之后的复查、活检与手术
|
||||
- 收益:USPSTF 对无症状女性用 CA-125 和超声筛查卵巢癌给 D 级(建议不做):PLCO 试验卵巢癌死亡率筛查组 0.34% vs 常规组 0.29%(RR 1.18,95% CI 0.82–1.71),无获益;因假阳性接受手术的比例在各试验为 0.2%–3.25%,其中最多 15% 出现严重手术并发症;全身 CT 筛查 1,192 名无症状者,86% 至少有一处「异常」,37% 被建议进一步检查,而「大多数发现按描述是良性的」;看起来划算是因为「一次查全身、早发现早治疗」符合直觉
|
||||
- 证据等级:A
|
||||
@@ -622,6 +704,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:肿瘤标志物部分是 RCT 证据,全身 CT/PET-CT 部分只有描述性研究(相当于 B 级)。有证据的筛查(结直肠、宫颈、乳腺、高危者的低剂量胸 CT)是另一回事,见第 1 节;已有症状或确诊癌症者的 PET-CT 是诊疗手段,不在本条范围
|
||||
|
||||
### 8. 不要指望手环/手表的运动量化帮你减重
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=否 -->
|
||||
- 成本:200–2000 元设备,加上每天看数据的注意力
|
||||
- 收益:IDEA 试验(471 名超重/肥胖成人,24 个月)在同样的生活方式干预基础上,佩戴可穿戴设备组减重 3.5 kg(95% CI 2.6–4.5),不戴组反而减 5.9 kg(5.0–6.8),差 2.4 kg(1.0–3.7,P=0.002);看起来划算是因为「量化才能管理」的说法和设备一次性付费
|
||||
- 证据等级:B
|
||||
@@ -629,6 +712,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:单一试验,用的是 2010 年代初的臂戴设备,结论不能外推到「所有可穿戴设备无用」;运动本身有效,见第 2 节,本条只说设备不是减重的必要开销
|
||||
|
||||
### 9. 不要为了「更健康」花溢价买有机食品
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=否 -->
|
||||
- 成本:通常是普通食品价格的 1–3 倍
|
||||
- 收益:系统综述(17 项人体研究,223 项食品成分研究)「缺乏有力证据表明有机食品比常规食品显著更有营养」;仅 3 项人体研究看临床结局(过敏、症状性感染),组间无显著差异;有机农产品检出农药残留的风险低 30 个百分点,但检出不等于超标;看起来划算是因为「无农药 = 更安全 = 更健康」每一步都像常识
|
||||
- 证据等级:B
|
||||
@@ -636,6 +720,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:健康结局的人体研究极少,属于「没有证据支持有益」而非「证明无益」;环境、动物福利、口味不在本条口径内。多吃蔬菜水果本身有效,有机与否不影响这一条
|
||||
|
||||
### 10. 不要花大钱买保健品、膏方、滋补品来「调理身体」
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=否 -->
|
||||
- 成本:从几百元到上万元不等,礼品化之后常常成倍上涨
|
||||
- 收益:国家市场监管总局规定保健食品包装主展示面必须用不小于 20% 的面积标注「保健食品不是药物,不能代替药物治疗疾病」,并把保健食品的目的界定为「补充膳食营养物质、维持改善机体健康状态或者降低疾病发生风险因素」,即监管机构本身不认可其治疗功效;本节前 6 条已列出其中最常见成分(多维、鱼油、维 D、抗氧化剂、氨糖、维 C)的 RCT 结果;看起来划算是因为「不治病但调理」的说法无法被证伪,且送礼场景下购买决策由人情而非证据驱动
|
||||
- 证据等级:C
|
||||
@@ -643,6 +728,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:这是「没有证据支持」而非「证明无效」,故为 C 级。成分明确的产品按前几条查对应文献;确诊营养缺乏或在治疗中的人按医嘱
|
||||
|
||||
### 11. 不要在没有肠道问题时长期吃益生菌
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=否 -->
|
||||
- 成本:约 2–5 元/天,一年 700–1800 元
|
||||
- 收益:综述 45 项健康成人试验,「未能支持益生菌能引起肠道菌群的持久改变,也未能改善健康成人的血脂」,菌群变化是暂时性的,停用即消失;看起来划算是因为「肠道健康」的概念足够宽泛,且每天一瓶的单价很低
|
||||
- 证据等级:B
|
||||
@@ -650,6 +736,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:同一综述报告健康人在排便性状、女性阴道乳杆菌等指标上有小幅改善。抗生素相关腹泻、特定菌株的特定适应证有独立证据,不在本条范围;本条只针对「健康人日常保健」
|
||||
|
||||
### 12. 不要为了「增强免疫力」逼自己洗冷水澡
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=否 -->
|
||||
- 成本:钱 0;每天 30–90 秒不适感,冬季坚持需要毅力;心血管病患者有冷刺激风险
|
||||
- 收益:荷兰 RCT(3,018 人,热水澡结尾冲 30/60/90 秒冷水)病假次数减少 29%(IRR 0.71),但「病假天数没有显著组间差异」,生活质量、工作效率、焦虑均无临床相关差异;2025 年系统综述(11 项 RCT,3,177 人)显示冷水浸泡后即刻与 1 小时炎症指标反而升高,免疫指标无变化,压力仅在 12 小时时点降低,作者称证据「受限于 RCT 少、样本小」;看起来划算是因为免费,且「吃苦 = 有效」的直觉
|
||||
- 证据等级:B
|
||||
@@ -657,6 +744,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:争议:病假次数减少 29% 是真实的显著结果,但生病天数不减,更像「生病了也照常上班」而非少生病;运动员训练后恢复是另一个问题。冷水澡本身对健康人无害,本条只说别把它当健康投资
|
||||
|
||||
### 13. 不要买排毒、清肠、酵素、碱性水这类产品
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=否 -->
|
||||
- 成本:数百到数千元;断食式「排毒」还可能带来低血糖与营养不足
|
||||
- 收益:综述结论「尽管排毒产业蓬勃发展,支持这些饮食的临床证据非常少」,且「没有针对商业排毒饮食的随机对照试验」;碱性饮食/碱性水与癌症的系统综述筛了 8,278 篇文献,只有 1 篇符合纳入标准且未见关联,作者称「向公众推广碱性饮食和碱性水用于癌症预防或治疗是不合理的」;看起来划算是因为「身体里有毒素要排」「酸性体质致癌」这两个前提听起来像生理学
|
||||
- 证据等级:C
|
||||
@@ -664,6 +752,7 @@ ACM 类数字与精力/时间类数字分开口径,不做跨口径换算。
|
||||
- 备注:属于「没有证据支持」,故为 C 级。肝肾本身承担代谢废物清除,无对应疾病时不需要额外「排毒」
|
||||
|
||||
### 14. 不要为了凑够「每天 8 杯水」强迫自己喝水
|
||||
<!-- 成本标签: 钱=0 时间=少 毅力=否 -->
|
||||
- 成本:钱 0;时间与精力少量,夜尿增多
|
||||
- 收益:对「8×8」(每天 8 杯 8 盎司水)的文献回顾「未找到任何支持 8×8 的科学研究」,反而「对数千名成年人的食物与液体摄入调查强烈提示不需要如此大量」,因为食物和其他饮品已提供大量水分;看起来划算是因为水免费、数字整齐、且「多喝水」在任何场合都显得无害
|
||||
- 证据等级:C
|
||||
|
||||
+473
@@ -0,0 +1,473 @@
|
||||
<!doctype html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>高性价比生存指南</title>
|
||||
<meta name="description" content="按花掉什么、换回什么检索生存建议:章节、证据等级、钱、时间、毅力。">
|
||||
<script>(function(){try{var s=localStorage.getItem('theme');var d=s?s==='dark':matchMedia('(prefers-color-scheme: dark)').matches;if(d)document.documentElement.classList.add('dark')}catch(e){}})();</script>
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
|
||||
<style>
|
||||
:root{
|
||||
--bg:#ffffff; --bg-alt:#f6f6f7; --bg-soft:#f6f6f7; --bg-mute:#f1f1f2; --bg-elv:#ffffff;
|
||||
--divider:#e2e2e3; --gutter:#e2e2e3;
|
||||
--t1:rgba(60,60,67,1); --t2:rgba(60,60,67,.78); --t3:rgba(60,60,67,.56);
|
||||
--brand-1:#3451b2; --brand-2:#3a5ccc; --brand-3:#5672cd; --brand-soft:rgba(100,108,255,.14);
|
||||
--green-1:#18794e; --green-soft:rgba(16,185,129,.14);
|
||||
--yellow-1:#915930; --yellow-soft:rgba(234,179,8,.14);
|
||||
--red-1:#b8272c; --red-soft:rgba(244,63,94,.14);
|
||||
--gray-1:#565a5f; --gray-soft:rgba(142,150,170,.14);
|
||||
--mark:rgba(234,179,8,.32);
|
||||
--shadow:0 1px 2px rgba(0,0,0,.04),0 1px 2px rgba(0,0,0,.06);
|
||||
--font:"Inter",ui-sans-serif,system-ui,-apple-system,"Segoe UI",Roboto,"PingFang SC","Hiragino Sans GB","Microsoft YaHei","Noto Sans SC",sans-serif;
|
||||
--mono:ui-monospace,"SF Mono",Menlo,Consolas,"Liberation Mono",monospace;
|
||||
--nav-h:64px; --side-w:272px;
|
||||
color-scheme:light;
|
||||
}
|
||||
html.dark{
|
||||
--bg:#1b1b1f; --bg-alt:#161618; --bg-soft:#202127; --bg-mute:#2b2b2f; --bg-elv:#202127;
|
||||
--divider:#2e2e32; --gutter:#000000;
|
||||
--t1:rgba(255,255,245,.86); --t2:rgba(235,235,245,.6); --t3:rgba(235,235,245,.38);
|
||||
--brand-1:#a8b1ff; --brand-2:#5c73e7; --brand-3:#3e63dd; --brand-soft:rgba(100,108,255,.16);
|
||||
--green-1:#3dd68c; --green-soft:rgba(16,185,129,.16);
|
||||
--yellow-1:#f9b44e; --yellow-soft:rgba(234,179,8,.16);
|
||||
--red-1:#f66f81; --red-soft:rgba(244,63,94,.16);
|
||||
--gray-1:#a4a8ae; --gray-soft:rgba(142,150,170,.16);
|
||||
--mark:rgba(234,179,8,.28);
|
||||
--shadow:0 1px 2px rgba(0,0,0,.3);
|
||||
color-scheme:dark;
|
||||
}
|
||||
*{box-sizing:border-box}
|
||||
html{scroll-padding-top:calc(var(--nav-h) + 16px)}
|
||||
body{margin:0;background:var(--bg);color:var(--t1);font:14px/1.7 var(--font);-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}
|
||||
a{color:var(--brand-1);text-decoration:none;transition:color .25s}
|
||||
a:hover{color:var(--brand-2);text-decoration:underline;text-underline-offset:2px}
|
||||
button{font:inherit;color:inherit;background:none;border:0;padding:0;cursor:pointer}
|
||||
:focus-visible{outline:2px solid var(--brand-1);outline-offset:2px;border-radius:4px}
|
||||
mark{background:var(--mark);color:inherit;border-radius:2px;padding:0 1px}
|
||||
[hidden]{display:none!important}
|
||||
|
||||
/* nav */
|
||||
.nav{position:fixed;top:0;left:0;right:0;height:var(--nav-h);z-index:30;background:var(--bg);border-bottom:1px solid var(--divider)}
|
||||
.nav-in{height:100%;display:flex;align-items:center;gap:16px;padding:0 24px}
|
||||
.title{display:flex;align-items:center;gap:10px;font-weight:600;font-size:16px;color:var(--t1);white-space:nowrap}
|
||||
.title:hover{text-decoration:none;color:var(--t1)}
|
||||
.logo{width:24px;height:24px;border-radius:6px;background:linear-gradient(135deg,var(--brand-3),var(--brand-1));display:grid;place-items:center;color:#fff;font-size:12px;font-weight:700}
|
||||
.search{flex:1;max-width:520px;margin-left:auto;position:relative}
|
||||
.search input{width:100%;height:40px;padding:0 44px 0 40px;border-radius:8px;border:1px solid transparent;background:var(--bg-alt);color:var(--t1);font:inherit;font-size:14px;transition:border-color .25s,background .25s}
|
||||
.search input:hover{border-color:var(--divider)}
|
||||
.search input:focus{outline:0;border-color:var(--brand-1);background:var(--bg)}
|
||||
.search input::placeholder{color:var(--t3)}
|
||||
.search svg{position:absolute;left:12px;top:50%;transform:translateY(-50%);width:18px;height:18px;fill:none;stroke:var(--t3);stroke-width:2;pointer-events:none}
|
||||
.search kbd{position:absolute;right:10px;top:50%;transform:translateY(-50%);font:500 11px/1 var(--font);color:var(--t3);border:1px solid var(--divider);border-radius:4px;padding:3px 6px;background:var(--bg-elv);pointer-events:none}
|
||||
.nav-r{display:flex;align-items:center;gap:8px}
|
||||
.icon-btn{width:36px;height:36px;border-radius:8px;display:grid;place-items:center;color:var(--t2);transition:background .25s,color .25s}
|
||||
.icon-btn:hover{background:var(--bg-soft);color:var(--t1)}
|
||||
.icon-btn svg{width:20px;height:20px;fill:currentColor}
|
||||
.switch{position:relative;width:40px;height:22px;border-radius:11px;border:1px solid var(--divider);background:var(--bg-mute);transition:border-color .25s,background .25s;flex:none;margin-left:8px}
|
||||
.switch:hover{border-color:var(--t3)}
|
||||
.switch .knob{position:absolute;top:1px;left:1px;width:18px;height:18px;border-radius:50%;background:var(--bg-elv);box-shadow:var(--shadow);transition:transform .25s;display:grid;place-items:center}
|
||||
html.dark .switch .knob{transform:translateX(18px)}
|
||||
.switch svg{width:12px;height:12px;fill:var(--t2)}
|
||||
.switch .sun{display:block} .switch .moon{display:none}
|
||||
html.dark .switch .sun{display:none} html.dark .switch .moon{display:block}
|
||||
.menu-btn{display:none}
|
||||
|
||||
/* sidebar */
|
||||
.sidebar{position:fixed;top:var(--nav-h);bottom:0;left:0;width:var(--side-w);background:var(--bg-alt);padding:32px 32px 96px;overflow-y:auto;overscroll-behavior:contain;z-index:20}
|
||||
.group{padding-bottom:20px;margin-bottom:20px;border-bottom:1px solid var(--divider)}
|
||||
.group:last-of-type{border-bottom:0}
|
||||
.gt{font-size:14px;font-weight:700;color:var(--t1);line-height:24px;margin-bottom:4px;display:flex;justify-content:space-between;align-items:baseline}
|
||||
.gt small{font-weight:400;font-size:12px;color:var(--t3)}
|
||||
.sec-links{display:flex;flex-direction:column}
|
||||
.sec-link{display:flex;justify-content:space-between;align-items:center;gap:8px;padding:4px 0;font-size:14px;font-weight:500;color:var(--t2);line-height:24px;text-align:left;transition:color .25s;border-radius:0}
|
||||
.sec-link:hover{color:var(--t1)}
|
||||
.sec-link[aria-pressed="true"]{color:var(--brand-1)}
|
||||
.sec-link i{font-style:normal;font-size:12px;color:var(--t3);font-variant-numeric:tabular-nums}
|
||||
.chips{display:flex;flex-wrap:wrap;gap:6px;padding-top:6px}
|
||||
.chip{border:1px solid var(--divider);background:var(--bg-elv);color:var(--t2);border-radius:999px;padding:3px 11px;font-size:12px;font-weight:500;line-height:18px;transition:all .2s}
|
||||
.chip:hover{border-color:var(--brand-3);color:var(--t1)}
|
||||
.chip[aria-pressed="true"]{background:var(--brand-soft);border-color:var(--brand-1);color:var(--brand-1)}
|
||||
.toggle{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--t2);padding:4px 0;cursor:pointer;font-weight:500}
|
||||
.toggle input{accent-color:var(--brand-1);width:15px;height:15px;margin:0}
|
||||
.reset{display:inline-flex;align-items:center;gap:6px;margin-top:8px;padding:6px 14px;border:1px solid var(--divider);border-radius:20px;font-size:13px;font-weight:500;color:var(--t2);background:var(--bg-elv);transition:all .25s}
|
||||
.reset:hover{border-color:var(--brand-1);color:var(--brand-1)}
|
||||
.hint{font-size:12px;color:var(--t3);line-height:1.6;margin-top:16px}
|
||||
.hint p{margin:4px 0}
|
||||
.backdrop{display:none}
|
||||
|
||||
/* content */
|
||||
.content{padding:calc(var(--nav-h) + 40px) 48px 128px calc(var(--side-w) + 48px)}
|
||||
.doc{max-width:900px;margin:0 auto}
|
||||
.doc-head{margin-bottom:28px}
|
||||
.doc-head h1{font-size:32px;line-height:40px;font-weight:700;letter-spacing:-.02em;margin:0 0 8px}
|
||||
.doc-head p{margin:0;color:var(--t2);font-size:16px}
|
||||
.doc-head .stat{color:var(--t3);font-size:14px;margin-top:6px}
|
||||
.doc-head .stat b{color:var(--brand-1);font-weight:600}
|
||||
.sec-block{margin-top:40px}
|
||||
.sec-h{display:flex;align-items:baseline;gap:12px;padding-top:24px;border-top:1px solid var(--divider);margin-bottom:8px}
|
||||
.sec-h h2{font-size:24px;line-height:32px;font-weight:600;letter-spacing:-.02em;margin:0}
|
||||
.sec-h .shown{margin-left:auto;font-size:13px;color:var(--t3);font-variant-numeric:tabular-nums}
|
||||
.intro{margin:0 0 20px;color:var(--t2);font-size:14px;max-width:72ch}
|
||||
|
||||
.card{background:var(--bg-soft);border:1px solid transparent;border-radius:12px;padding:22px 24px 18px;margin-bottom:16px;transition:border-color .25s,background .25s}
|
||||
.card:hover{border-color:var(--divider)}
|
||||
.card-h{display:flex;align-items:flex-start;gap:10px;margin-bottom:10px}
|
||||
.card-h h3{margin:0;font-size:18px;line-height:28px;font-weight:600;letter-spacing:-.01em;flex:1;min-width:0;overflow-wrap:anywhere}
|
||||
.card-h .idx{color:var(--t3);font-size:14px;line-height:28px;font-variant-numeric:tabular-nums;min-width:22px}
|
||||
.card-h .anchor{opacity:0;color:var(--brand-1);font-size:16px;line-height:28px;font-weight:500;transition:opacity .2s}
|
||||
.card:hover .anchor,.anchor:focus-visible{opacity:1}
|
||||
.badges{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:14px}
|
||||
.badge{display:inline-block;border-radius:10px;padding:0 10px;line-height:20px;font-size:12px;font-weight:600;white-space:nowrap;transform:translateY(0)}
|
||||
.badge.tip{background:var(--brand-soft);color:var(--brand-1)}
|
||||
.badge.A{background:var(--green-soft);color:var(--green-1)}
|
||||
.badge.B{background:var(--yellow-soft);color:var(--yellow-1)}
|
||||
.badge.C{background:var(--gray-soft);color:var(--gray-1)}
|
||||
.badge.danger{background:var(--red-soft);color:var(--red-1)}
|
||||
.badge.warn{background:var(--yellow-soft);color:var(--yellow-1)}
|
||||
.badge.plain{background:var(--gray-soft);color:var(--t2);font-weight:500}
|
||||
.rows{display:grid;grid-template-columns:auto 1fr;gap:8px 16px;font-size:14px;line-height:1.75}
|
||||
.rows .k{color:var(--t3);font-weight:500;font-size:13px;line-height:1.75;padding-top:1px}
|
||||
.rows .v{color:var(--t1);min-width:0;overflow-wrap:anywhere}
|
||||
.rows .v.note{color:var(--t2)}
|
||||
.src{margin-top:14px;border-top:1px solid var(--divider);padding-top:10px}
|
||||
.src summary{list-style:none;cursor:pointer;font-size:13px;font-weight:500;color:var(--t2);display:flex;align-items:center;gap:6px;user-select:none}
|
||||
.src summary::-webkit-details-marker{display:none}
|
||||
.src summary::before{content:"";width:6px;height:6px;border-right:1.5px solid var(--t3);border-bottom:1.5px solid var(--t3);transform:rotate(-45deg);transition:transform .2s;margin-right:2px}
|
||||
.src[open] summary::before{transform:rotate(45deg)}
|
||||
.src .body{padding-top:8px;font-size:13px;line-height:1.75;color:var(--t2);overflow-wrap:anywhere}
|
||||
|
||||
.empty{border:1px dashed var(--divider);border-radius:12px;padding:40px 24px;text-align:center;color:var(--t2);margin-top:24px}
|
||||
.empty button{margin-top:12px;padding:7px 16px;border:1px solid var(--divider);border-radius:20px;font-weight:500;background:var(--bg-elv)}
|
||||
.empty button:hover{border-color:var(--brand-1);color:var(--brand-1)}
|
||||
.status{color:var(--t3);padding:40px 0;text-align:center}
|
||||
.status code{font-family:var(--mono);font-size:13px;background:var(--bg-mute);padding:2px 6px;border-radius:4px}
|
||||
.foot{margin-top:64px;padding-top:24px;border-top:1px solid var(--divider);color:var(--t3);font-size:13px;line-height:1.7}
|
||||
|
||||
@media (max-width:960px){
|
||||
:root{--nav-h:56px}
|
||||
.nav-in{padding:0 16px;gap:10px}
|
||||
.title span{display:none}
|
||||
.search{max-width:none}
|
||||
.search kbd{display:none}
|
||||
.menu-btn{display:grid}
|
||||
.sidebar{transform:translateX(-100%);transition:transform .25s;box-shadow:none;padding:24px 24px 96px;width:min(var(--side-w),86vw)}
|
||||
.sidebar.open{transform:none;box-shadow:0 8px 24px rgba(0,0,0,.2)}
|
||||
.backdrop{display:block;position:fixed;inset:0;background:rgba(0,0,0,.4);z-index:15;opacity:0;pointer-events:none;transition:opacity .25s}
|
||||
.backdrop.on{opacity:1;pointer-events:auto}
|
||||
.content{padding:calc(var(--nav-h) + 24px) 20px 96px}
|
||||
.doc-head h1{font-size:26px;line-height:34px}
|
||||
.card{padding:18px 16px 14px;border-radius:10px}
|
||||
.card-h h3{font-size:16px;line-height:24px}
|
||||
.card-h .idx{line-height:24px}
|
||||
.rows{grid-template-columns:1fr;gap:4px}
|
||||
.rows .k{padding-top:6px}
|
||||
.rows .k:first-child{padding-top:0}
|
||||
}
|
||||
@media (prefers-reduced-motion:reduce){*{transition:none!important}}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<header class="nav">
|
||||
<div class="nav-in">
|
||||
<button class="icon-btn menu-btn" id="menu" aria-label="打开筛选" aria-expanded="false"><svg viewBox="0 0 24 24"><path d="M4 6h16v2H4zm0 5h16v2H4zm0 5h16v2H4z"/></svg></button>
|
||||
<a class="title" href="./"><span class="logo">性</span><span>高性价比生存指南</span></a>
|
||||
<label class="search">
|
||||
<svg viewBox="0 0 24 24" aria-hidden="true"><circle cx="11" cy="11" r="7"/><path d="m20 20-3.5-3.5" stroke-linecap="round"/></svg>
|
||||
<input id="q" type="search" placeholder="搜索条目" autocomplete="off" aria-label="搜索条目">
|
||||
<kbd>/</kbd>
|
||||
</label>
|
||||
<div class="nav-r">
|
||||
<a class="icon-btn" href="README.md" title="查看 README.md" aria-label="README"><svg viewBox="0 0 24 24"><path d="M6 2h9l5 5v15H6zm8 1.5V8h4.5zM8 12h8v1.5H8zm0 3.5h8V17H8z"/></svg></a>
|
||||
<button class="switch" id="theme" aria-label="切换深色模式" title="切换深色模式"><span class="knob"><svg class="sun" viewBox="0 0 24 24"><path d="M12 4a1 1 0 0 1 1 1v1a1 1 0 1 1-2 0V5a1 1 0 0 1 1-1zm0 13a1 1 0 0 1 1 1v1a1 1 0 1 1-2 0v-1a1 1 0 0 1 1-1zm8-6a1 1 0 1 1 0 2h-1a1 1 0 1 1 0-2zM5 11a1 1 0 1 1 0 2H4a1 1 0 1 1 0-2zm12.07-5.07a1 1 0 0 1 0 1.41l-.7.71a1 1 0 1 1-1.42-1.41l.71-.71a1 1 0 0 1 1.41 0zM8.05 16.95a1 1 0 0 1 0 1.41l-.7.71a1 1 0 1 1-1.42-1.41l.71-.71a1 1 0 0 1 1.41 0zm9.02 0l.7.71a1 1 0 1 1-1.41 1.41l-.71-.7a1 1 0 0 1 1.42-1.42zM6.34 5.93l.71.71a1 1 0 0 1-1.41 1.41l-.71-.7a1 1 0 0 1 1.41-1.42zM12 8a4 4 0 1 1 0 8 4 4 0 0 1 0-8z"/></svg><svg class="moon" viewBox="0 0 24 24"><path d="M12.1 22c-5.5 0-10-4.5-10-10 0-4.8 3.4-8.9 8-9.8.5-.1.9.4.7.9A8 8 0 0 0 20.9 13c.5-.2 1 .2.9.7-.9 4.7-5 8.3-9.7 8.3z"/></svg></span></button>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<div class="backdrop" id="backdrop"></div>
|
||||
<aside class="sidebar" id="sidebar">
|
||||
<div class="group">
|
||||
<div class="gt">章节</div>
|
||||
<div class="sec-links" id="f-sec" data-dim="sec"></div>
|
||||
</div>
|
||||
<div class="group">
|
||||
<div class="gt">证据等级 <small>荟萃/RCT · 有研究 · 共识</small></div>
|
||||
<div class="chips" data-dim="grade">
|
||||
<button class="chip" data-v="A" aria-pressed="false">A 级</button>
|
||||
<button class="chip" data-v="B" aria-pressed="false">B 级</button>
|
||||
<button class="chip" data-v="C" aria-pressed="false">C 级</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="group">
|
||||
<div class="gt">花钱</div>
|
||||
<div class="chips" data-dim="money">
|
||||
<button class="chip" data-v="0" aria-pressed="false">不花钱</button>
|
||||
<button class="chip" data-v="少" aria-pressed="false">少</button>
|
||||
<button class="chip" data-v="多" aria-pressed="false">多</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="group">
|
||||
<div class="gt">花时间</div>
|
||||
<div class="chips" data-dim="time">
|
||||
<button class="chip" data-v="少" aria-pressed="false">顺手</button>
|
||||
<button class="chip" data-v="中" aria-pressed="false">几小时</button>
|
||||
<button class="chip" data-v="多" aria-pressed="false">每天占用</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="group">
|
||||
<div class="gt">要毅力</div>
|
||||
<div class="chips" data-dim="will">
|
||||
<button class="chip" data-v="否" aria-pressed="false">不用</button>
|
||||
<button class="chip" data-v="些" aria-pressed="false">一点</button>
|
||||
<button class="chip" data-v="是" aria-pressed="false">很多</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="group">
|
||||
<label class="toggle"><input type="checkbox" id="f-dispute"> 只看标了争议的</label>
|
||||
<label class="toggle"><input type="checkbox" id="f-todo"> 只看有待核实的</label>
|
||||
<button class="reset" id="reset">清空筛选</button>
|
||||
</div>
|
||||
<div class="hint">
|
||||
<p>同一组多选是「或」,不同组之间是「且」。</p>
|
||||
<p>每节内按性价比从高到低排,检索不改变顺序。</p>
|
||||
<p>正文与标签来自仓库里的 <a href="README.md">README.md</a>,改正文即改这里。</p>
|
||||
</div>
|
||||
</aside>
|
||||
|
||||
<main class="content">
|
||||
<div class="doc">
|
||||
<div class="doc-head">
|
||||
<h1>高性价比生存指南</h1>
|
||||
<p>每一条都回答两个问题:花掉什么,换回什么。</p>
|
||||
<div class="stat" aria-live="polite">当前显示 <b id="cnt">–</b> 条,共 <span id="tot">–</span> 条</div>
|
||||
</div>
|
||||
<div id="list">
|
||||
<div class="status" id="status">正在读取 README.md …</div>
|
||||
<div class="empty" id="empty" hidden>
|
||||
没有匹配的条目。去掉一个筛选条件,或换个更短的关键词。
|
||||
<div><button id="reset2">清空筛选</button></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="foot">数字口径以条目内标注为准:第 1、2 节是 ACM 或特定死因,第 3、4 节是精力/时间,第 5 节是金钱,互不换算。来源核实过程见 docs/核实记录。Unlicense,公有领域。</div>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<script>
|
||||
/* ---------- 解析 README ---------- */
|
||||
function parseReadme(md){
|
||||
const lines = md.split(/\r?\n/);
|
||||
const sections = [];
|
||||
let sec = null, entry = null;
|
||||
const flush = () => { if (entry && sec) { sec.entries.push(entry); } entry = null; };
|
||||
for (const raw of lines){
|
||||
const line = raw.trimEnd();
|
||||
let m;
|
||||
if ((m = /^## (\d)\. (.+)$/.exec(line))) { flush(); sec = {n:m[1], title:m[2].trim(), intro:'', entries:[]}; sections.push(sec); continue; }
|
||||
if (/^## /.test(line)) { flush(); sec = null; continue; }
|
||||
if (!sec) continue;
|
||||
if ((m = /^### (\d+)\. (.+)$/.exec(line))) { flush(); entry = {sec:sec.n, n:m[1], title:m[2].trim(), cost:'', gain:'', grade:'', src:'', note:'', money:'', time:'', will:''}; continue; }
|
||||
if ((m = /^<!--\s*成本标签:\s*(.*?)\s*-->/.exec(line)) && entry){
|
||||
for (const kv of m[1].split(/\s+/)){ const [k,v] = kv.split('='); if(k==='钱') entry.money=v; if(k==='时间') entry.time=v; if(k==='毅力') entry.will=v; }
|
||||
continue;
|
||||
}
|
||||
if (entry){
|
||||
if ((m = /^- 成本:(.*)$/.exec(line))) entry.cost = m[1];
|
||||
else if ((m = /^- 收益:(.*)$/.exec(line))) entry.gain = m[1];
|
||||
else if ((m = /^- 证据等级:\s*([ABC])/.exec(line))) entry.grade = m[1];
|
||||
else if ((m = /^- 来源:(.*)$/.exec(line))) entry.src = m[1];
|
||||
else if ((m = /^- 备注:(.*)$/.exec(line))) entry.note = m[1];
|
||||
continue;
|
||||
}
|
||||
if (line && !sec.intro) sec.intro = line;
|
||||
}
|
||||
flush();
|
||||
for (const s of sections) for (const e of s.entries){
|
||||
e.dispute = /^争议/.test(e.note);
|
||||
e.todo = /待核实|TODO/.test(e.src + e.gain + e.note + e.cost);
|
||||
e.hay = [e.title, e.cost, e.gain, e.note, e.src, e.grade].join('\n').toLowerCase();
|
||||
}
|
||||
return sections;
|
||||
}
|
||||
|
||||
/* ---------- 文本渲染:链接 + 高亮 ---------- */
|
||||
const URL_RE = /https?:\/\/[^\s;;]+/g;
|
||||
function trimUrl(u){
|
||||
let t = '';
|
||||
for (;;){
|
||||
const ch = u.slice(-1);
|
||||
const unbalanced = ch === ')' && (u.split('(').length < u.split(')').length);
|
||||
if (!/[)。,,]/.test(ch) && !unbalanced) break;
|
||||
t = ch + t; u = u.slice(0, -1);
|
||||
}
|
||||
return [u, t];
|
||||
}
|
||||
function renderText(el, text, terms){
|
||||
el.textContent = '';
|
||||
let last = 0; URL_RE.lastIndex = 0; let m;
|
||||
const pushText = (s) => { if (s) highlightInto(el, s, terms); };
|
||||
while ((m = URL_RE.exec(text))){
|
||||
pushText(text.slice(last, m.index));
|
||||
const [u, tail] = trimUrl(m[0]);
|
||||
const a = document.createElement('a'); a.href = u; a.target = '_blank'; a.rel = 'noopener'; a.textContent = u;
|
||||
el.appendChild(a); pushText(tail);
|
||||
last = m.index + m[0].length;
|
||||
}
|
||||
pushText(text.slice(last));
|
||||
}
|
||||
function highlightInto(el, s, terms){
|
||||
if (!terms.length){ el.appendChild(document.createTextNode(s)); return; }
|
||||
const lower = s.toLowerCase(); let i = 0;
|
||||
while (i < s.length){
|
||||
let best = -1, bl = 0;
|
||||
for (const t of terms){ const k = lower.indexOf(t, i); if (k !== -1 && (best === -1 || k < best)) { best = k; bl = t.length; } }
|
||||
if (best === -1){ el.appendChild(document.createTextNode(s.slice(i))); break; }
|
||||
if (best > i) el.appendChild(document.createTextNode(s.slice(i, best)));
|
||||
const mk = document.createElement('mark'); mk.textContent = s.slice(best, best+bl); el.appendChild(mk);
|
||||
i = best + bl;
|
||||
}
|
||||
}
|
||||
|
||||
/* ---------- 构建 DOM ---------- */
|
||||
const LABEL = { money:{'0':'不花钱','少':'花少量钱','多':'花不少钱'}, time:{'少':'顺手','中':'花几小时','多':'每天占时间'}, will:{'否':'不用毅力','些':'要一点毅力','是':'要很多毅力'} };
|
||||
let CARDS = [];
|
||||
function esc(s){ return s.replace(/[&<>"]/g, ch => ({'&':'&','<':'<','>':'>','"':'"'}[ch])); }
|
||||
function build(sections){
|
||||
const list = document.getElementById('list');
|
||||
const fsec = document.getElementById('f-sec');
|
||||
for (const s of sections){
|
||||
const b = document.createElement('button'); b.className='sec-link'; b.dataset.v = s.n; b.setAttribute('aria-pressed','false');
|
||||
b.innerHTML = `<span>${s.n}. ${esc(s.title)}</span><i>${s.entries.length}</i>`; fsec.appendChild(b);
|
||||
|
||||
const block = document.createElement('section'); block.className='sec-block'; block.dataset.sec = s.n; block.id = 'sec-'+s.n;
|
||||
block.innerHTML = `<div class="sec-h"><h2>${s.n}. ${esc(s.title)}</h2><span class="shown"><span class="k"></span> / ${s.entries.length}</span></div><p class="intro">${esc(s.intro)}</p>`;
|
||||
for (const e of s.entries){
|
||||
const id = `e-${e.sec}-${e.n}`;
|
||||
const c = document.createElement('article'); c.className='card'; c.id = id;
|
||||
c.innerHTML = `
|
||||
<div class="card-h"><span class="idx">${e.n}</span><h3 class="t"></h3><a class="anchor" href="#${id}" aria-label="本条链接">#</a></div>
|
||||
<div class="badges"></div>
|
||||
<div class="rows">
|
||||
<div class="k">成本</div><div class="v cost"></div>
|
||||
<div class="k">收益</div><div class="v gain"></div>
|
||||
<div class="k">备注</div><div class="v note"></div>
|
||||
</div>
|
||||
<details class="src"><summary>来源</summary><div class="body"></div></details>`;
|
||||
const badges = c.querySelector('.badges');
|
||||
const add = (cls, text) => { const t=document.createElement('span'); t.className='badge '+cls; t.textContent=text; badges.appendChild(t); };
|
||||
add(e.grade, `证据 ${e.grade} 级`);
|
||||
for (const d of ['money','time','will']) if (e[d]) add('plain', LABEL[d][e[d]] || e[d]);
|
||||
if (e.dispute) add('danger', '争议');
|
||||
if (e.todo) add('warn', '含待核实');
|
||||
block.appendChild(c);
|
||||
CARDS.push({e, el:c});
|
||||
}
|
||||
list.appendChild(block);
|
||||
}
|
||||
document.getElementById('tot').textContent = CARDS.length;
|
||||
}
|
||||
|
||||
/* ---------- 筛选状态 ---------- */
|
||||
const DIMS = ['sec','grade','money','time','will'];
|
||||
const state = { q:'', sec:new Set(), grade:new Set(), money:new Set(), time:new Set(), will:new Set(), dispute:false, todo:false };
|
||||
function readUrl(){
|
||||
const p = new URLSearchParams(location.search);
|
||||
state.q = p.get('q') || '';
|
||||
for (const d of DIMS) state[d] = new Set((p.get(d)||'').split(',').filter(Boolean));
|
||||
state.dispute = p.get('dispute') === '1'; state.todo = p.get('todo') === '1';
|
||||
}
|
||||
function writeUrl(){
|
||||
const p = new URLSearchParams();
|
||||
if (state.q) p.set('q', state.q);
|
||||
for (const d of DIMS) if (state[d].size) p.set(d, [...state[d]].join(','));
|
||||
if (state.dispute) p.set('dispute','1'); if (state.todo) p.set('todo','1');
|
||||
const qs = p.toString(); history.replaceState(null, '', (qs ? '?'+qs : location.pathname) + location.hash);
|
||||
}
|
||||
function syncControls(){
|
||||
document.getElementById('q').value = state.q;
|
||||
document.querySelectorAll('[data-dim] [data-v]').forEach(b => b.setAttribute('aria-pressed', String(state[b.parentElement.dataset.dim].has(b.dataset.v))));
|
||||
document.getElementById('f-dispute').checked = state.dispute;
|
||||
document.getElementById('f-todo').checked = state.todo;
|
||||
}
|
||||
function apply(){
|
||||
const terms = state.q.toLowerCase().split(/\s+/).filter(Boolean);
|
||||
let shown = 0; const perSec = {};
|
||||
for (const {e, el} of CARDS){
|
||||
let ok = true;
|
||||
if (state.sec.size && !state.sec.has(e.sec)) ok = false;
|
||||
if (ok && state.grade.size && !state.grade.has(e.grade)) ok = false;
|
||||
if (ok && state.money.size && !state.money.has(e.money)) ok = false;
|
||||
if (ok && state.time.size && !state.time.has(e.time)) ok = false;
|
||||
if (ok && state.will.size && !state.will.has(e.will)) ok = false;
|
||||
if (ok && state.dispute && !e.dispute) ok = false;
|
||||
if (ok && state.todo && !e.todo) ok = false;
|
||||
if (ok && terms.length && !terms.every(t => e.hay.includes(t))) ok = false;
|
||||
el.hidden = !ok;
|
||||
if (ok){
|
||||
shown++; perSec[e.sec] = (perSec[e.sec]||0)+1;
|
||||
renderText(el.querySelector('.t'), e.title, terms);
|
||||
renderText(el.querySelector('.cost'), e.cost, terms);
|
||||
renderText(el.querySelector('.gain'), e.gain, terms);
|
||||
renderText(el.querySelector('.note'), e.note, terms);
|
||||
renderText(el.querySelector('.src .body'), e.src, terms);
|
||||
const inBody = (e.title+e.cost+e.gain+e.note).toLowerCase();
|
||||
if (terms.length && terms.some(t => e.src.toLowerCase().includes(t)) && !terms.some(t => inBody.includes(t))) el.querySelector('.src').open = true;
|
||||
}
|
||||
}
|
||||
for (const b of document.querySelectorAll('.sec-block')){ const n = perSec[b.dataset.sec]||0; b.hidden = n === 0; b.querySelector('.shown .k').textContent = n; }
|
||||
document.getElementById('cnt').textContent = shown;
|
||||
document.getElementById('empty').hidden = shown !== 0;
|
||||
syncControls(); writeUrl();
|
||||
}
|
||||
|
||||
/* ---------- 事件 ---------- */
|
||||
function wire(){
|
||||
document.querySelectorAll('[data-dim]').forEach(g => g.addEventListener('click', ev => {
|
||||
const b = ev.target.closest('[data-v]'); if (!b) return;
|
||||
const set = state[g.dataset.dim]; set.has(b.dataset.v) ? set.delete(b.dataset.v) : set.add(b.dataset.v); apply();
|
||||
}));
|
||||
document.getElementById('f-dispute').addEventListener('change', e => { state.dispute = e.target.checked; apply(); });
|
||||
document.getElementById('f-todo').addEventListener('change', e => { state.todo = e.target.checked; apply(); });
|
||||
let tm; document.getElementById('q').addEventListener('input', e => { clearTimeout(tm); tm = setTimeout(() => { state.q = e.target.value.trim(); apply(); }, 120); });
|
||||
const reset = () => { state.q=''; for (const d of DIMS) state[d].clear(); state.dispute=false; state.todo=false; apply(); };
|
||||
document.getElementById('reset').addEventListener('click', reset);
|
||||
document.getElementById('reset2').addEventListener('click', reset);
|
||||
document.addEventListener('keydown', e => {
|
||||
if (e.key === '/' && !/INPUT|TEXTAREA/.test(document.activeElement.tagName)) { e.preventDefault(); document.getElementById('q').focus(); }
|
||||
if (e.key === 'Escape') { if (document.activeElement.id === 'q') document.activeElement.blur(); setMenu(false); }
|
||||
});
|
||||
// 侧栏(移动端抽屉)
|
||||
const sb = document.getElementById('sidebar'), bd = document.getElementById('backdrop'), mb = document.getElementById('menu');
|
||||
const setMenu = (on) => { sb.classList.toggle('open', on); bd.classList.toggle('on', on); mb.setAttribute('aria-expanded', String(on)); };
|
||||
mb.addEventListener('click', () => setMenu(!sb.classList.contains('open')));
|
||||
bd.addEventListener('click', () => setMenu(false));
|
||||
// 深色模式
|
||||
document.getElementById('theme').addEventListener('click', () => {
|
||||
const dark = !document.documentElement.classList.contains('dark');
|
||||
document.documentElement.classList.toggle('dark', dark);
|
||||
try { localStorage.setItem('theme', dark ? 'dark' : 'light'); } catch (e) {}
|
||||
});
|
||||
}
|
||||
|
||||
/* ---------- 启动 ---------- */
|
||||
(async function init(){
|
||||
const status = document.getElementById('status');
|
||||
try {
|
||||
if (location.protocol === 'file:') throw new Error('file');
|
||||
const r = await fetch('README.md', {cache:'no-cache'});
|
||||
if (!r.ok) throw new Error('http '+r.status);
|
||||
const sections = parseReadme(await r.text());
|
||||
if (!sections.length) throw new Error('empty');
|
||||
status.remove(); build(sections); readUrl(); wire(); apply();
|
||||
if (location.hash) document.getElementById(location.hash.slice(1))?.scrollIntoView();
|
||||
} catch (err) {
|
||||
status.innerHTML = err.message === 'file'
|
||||
? '这个页面要通过 http 打开才能读取 README.md。在仓库目录运行 <code>python -m http.server</code>,然后访问 <code>http://localhost:8000/</code>;或直接用 GitHub Pages 地址。'
|
||||
: `读取 README.md 失败(${esc(String(err.message))})。确认它和 index.html 在同一目录。`;
|
||||
}
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
Reference in new issue
Block a user