mirror of
https://github.com/8butubb/8butubb.github.io.git
synced 2026-07-10 19:23:08 +00:00
update
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
:root {
|
||||
--nav-width: 1380px;
|
||||
--article-width: 650px;
|
||||
--toc-width: 300px;
|
||||
}
|
||||
|
||||
.toc {
|
||||
margin: 0 2px 40px 2px;
|
||||
border: 1px solid var(--border);
|
||||
background: var(--entry);
|
||||
border-radius: var(--radius);
|
||||
padding: 0.4em;
|
||||
}
|
||||
|
||||
.toc-container.wide {
|
||||
position: absolute;
|
||||
height: 100%;
|
||||
border-right: 1px solid var(--border);
|
||||
left: calc((var(--toc-width) + var(--gap)) * -1);
|
||||
top: calc(var(--gap) * 2);
|
||||
width: var(--toc-width);
|
||||
}
|
||||
|
||||
.wide .toc {
|
||||
position: sticky;
|
||||
top: var(--gap);
|
||||
border: unset;
|
||||
background: unset;
|
||||
border-radius: unset;
|
||||
width: 100%;
|
||||
margin: 0 2px 40px 2px;
|
||||
}
|
||||
|
||||
.toc details summary {
|
||||
cursor: zoom-in;
|
||||
margin-inline-start: 20px;
|
||||
padding: 12px 0;
|
||||
}
|
||||
|
||||
.toc details[open] summary {
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.toc-container.wide .toc .inner {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.active {
|
||||
font-size: 110%;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.toc ul {
|
||||
list-style-type: circle;
|
||||
}
|
||||
|
||||
.toc .inner {
|
||||
margin: 0 0 0 20px;
|
||||
padding: 0px 15px 15px 20px;
|
||||
font-size: 16px;
|
||||
|
||||
/*目录显示高度*/
|
||||
max-height: 83vh;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
.toc .inner::-webkit-scrollbar-thumb { /*滚动条*/
|
||||
background: var(--border);
|
||||
border: 7px solid var(--theme);
|
||||
border-radius: var(--radius);
|
||||
}
|
||||
|
||||
.toc li ul {
|
||||
margin-inline-start: calc(var(--gap) * 0.5);
|
||||
list-style-type: none;
|
||||
}
|
||||
|
||||
.toc li {
|
||||
list-style: none;
|
||||
font-size: 0.95rem;
|
||||
padding-bottom: 5px;
|
||||
}
|
||||
|
||||
.toc li a:hover {
|
||||
color: var(--secondary);
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
---
|
||||
title: 长期健康生活计划
|
||||
tags: ["健康"]
|
||||
date: 2026-01-17
|
||||
summary: "人的一生最重要的就是健康"
|
||||
---
|
||||
- 最近开始尝试更规律的生活,调整饮食与运动习惯。一方面是真的想对身体好一点,另一方面,也希望生活有个稳定的节奏,让自己心态更积极。
|
||||
|
||||
我的基本情况是身高179cm,体重83kg。我算了一下,这个身高体重对应的BMI大概是25.9,按照标准来看属于超重范围了。所以这次计划的核心目标,就是通过调整生活习惯,慢慢把体重和BMI降到更理想的健康区间。
|
||||
|
||||
我不追求快速见效,重要的是养成能长期坚持的好习惯。主要会从下面三个方面来入手。
|
||||
|
||||
## 饮食
|
||||
我目前尝试的是16+8轻断食,就是把一天吃东西的时间控制在8个小时之内(比如中午11点到晚上7点),其余16小时不吃东西。这样感觉肠胃比较轻松。
|
||||
|
||||
同时,我会把每天吃的东西总热量控制在 1800大卡 左右。我大概估算过,以我的身高体重和每天的运动量,身体每天自然消耗的热量(加上运动)大约在2600-2800大卡。所以吃1800大卡,能创造一个温和的热量缺口,既不会饿得难受,又能让体重慢慢往下走。
|
||||
|
||||
- 确保每天摄入量 不超过1800kcal
|
||||
|
||||
| name | time | kcal |
|
||||
|----------|--------|--------|
|
||||
| 早餐 | - | - |
|
||||
| 午餐 | 11:30 | 700 |
|
||||
| 晚餐 | 18:30 | 800 |
|
||||
| 点心 | - | 250 |
|
||||
|
||||
记录的话使用的是薄荷健康,不开会员也能正常使用,最近还购入了一个食物电子秤
|
||||
主要是有时候自己估算重量真的很虚
|
||||
|
||||
## 饮水
|
||||
喝水真的太重要了,尤其是想控制体重的时候,喝够水能提升代谢,也能避免“假饥饿”。我给自己定的目标是每天至少喝3升白开水。为了提醒自己,手机里装了个叫“饮水时间”的APP,它会按时提醒我喝水。
|
||||
|
||||
## 运动
|
||||
|
||||
我过去的观念是“只要少吃就能瘦”,但后来发现吃得太少整个人情绪会很低落,反而容易放弃。最近我开始运动后,感觉完全不同了,运动完虽然身体累,但心情会变好,精神也更振奋。
|
||||
|
||||
我现在尽量每天都会动一动,采用交替进行的方式,不让身体太枯燥:
|
||||
|
||||
- 一天: 出门快走或散步40分钟,听听播客或者音乐。
|
||||
|
||||
- 一天: 在家跟着视频做40分钟左右的徒手训练,比如深蹲、俯卧撑、拉伸这些。
|
||||
|
||||
不强求强度多大,关键是动起来,并且享受这个过程,让它成为生活里自然而然的一部分。
|
||||
|
||||
## 最后想说的
|
||||
|
||||
这就是我目前的健康生活计划。我知道改变需要时间,所以不会苛求自己一天就做到完美。定期会看看体重和身体的变化,再根据实际情况做调整。
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
---
|
||||
title: "🔍 搜索" # in any language you want
|
||||
layout: "search" # is necessary
|
||||
# url: "/archive"
|
||||
# description: "Description for Search"
|
||||
summary: "search"
|
||||
placeholder: "搜索框内的默认显示"
|
||||
---
|
||||
@@ -4,9 +4,11 @@ title = '日志'
|
||||
theme = 'PaperMod'
|
||||
defaultContentLanguage = 'zh-cn'
|
||||
|
||||
|
||||
[outputs]
|
||||
home = ["HTML", "RSS", "JSON"]
|
||||
|
||||
[params]
|
||||
ShowToc = true
|
||||
defaultTheme = "auto"
|
||||
# 内联表必须写在一行内
|
||||
homeInfoParams = { Title = "你好!我是butubb,安徽人,现工作居住在苏州。", Content = "喜欢互联网冲浪🏄♂️,折腾机器💻,看电影🎥,编程🧑💻,听音乐🎶等" }
|
||||
@@ -31,3 +33,8 @@ defaultContentLanguage = 'zh-cn'
|
||||
name = "标签"
|
||||
url = "/tags"
|
||||
weight = 3
|
||||
|
||||
[[menu.main]]
|
||||
name = "搜索"
|
||||
url = "/search"
|
||||
weight = 4
|
||||
@@ -0,0 +1,192 @@
|
||||
{{- $headers := findRE "<h[1-6].*?>(.|\n])+?</h[1-6]>" .Content -}}
|
||||
{{- $has_headers := ge (len $headers) 1 -}}
|
||||
{{- if $has_headers -}}
|
||||
<aside id="toc-container" class="toc-container wide">
|
||||
<div class="toc">
|
||||
<details {{if (.Param "TocOpen") }} open{{ end }}>
|
||||
<summary accesskey="c" title="(Alt + C)">
|
||||
<span class="details">{{- i18n "toc" | default "目录" }}</span>
|
||||
</summary>
|
||||
|
||||
<div class="inner">
|
||||
{{- $largest := 6 -}}
|
||||
{{- range $headers -}}
|
||||
{{- $headerLevel := index (findRE "[1-6]" . 1) 0 -}}
|
||||
{{- $headerLevel := len (seq $headerLevel) -}}
|
||||
{{- if lt $headerLevel $largest -}}
|
||||
{{- $largest = $headerLevel -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- $firstHeaderLevel := len (seq (index (findRE "[1-6]" (index $headers 0) 1) 0)) -}}
|
||||
|
||||
{{- $.Scratch.Set "bareul" slice -}}
|
||||
<ul>
|
||||
{{- range seq (sub $firstHeaderLevel $largest) -}}
|
||||
<ul>
|
||||
{{- $.Scratch.Add "bareul" (sub (add $largest .) 1) -}}
|
||||
{{- end -}}
|
||||
{{- range $i, $header := $headers -}}
|
||||
{{- $headerLevel := index (findRE "[1-6]" . 1) 0 -}}
|
||||
{{- $headerLevel := len (seq $headerLevel) -}}
|
||||
|
||||
{{/* get id="xyz" */}}
|
||||
{{- $id := index (findRE "(id=\"(.*?)\")" $header 9) 0 }}
|
||||
|
||||
{{- /* strip id="" to leave xyz, no way to get regex capturing groups in hugo */ -}}
|
||||
{{- $cleanedID := replace (replace $id "id=\"" "") "\"" "" }}
|
||||
{{- $header := replaceRE "<h[1-6].*?>((.|\n])+?)</h[1-6]>" "$1" $header -}}
|
||||
|
||||
{{- if ne $i 0 -}}
|
||||
{{- $prevHeaderLevel := index (findRE "[1-6]" (index $headers (sub $i 1)) 1) 0 -}}
|
||||
{{- $prevHeaderLevel := len (seq $prevHeaderLevel) -}}
|
||||
{{- if gt $headerLevel $prevHeaderLevel -}}
|
||||
{{- range seq $prevHeaderLevel (sub $headerLevel 1) -}}
|
||||
<ul>
|
||||
{{/* the first should not be recorded */}}
|
||||
{{- if ne $prevHeaderLevel . -}}
|
||||
{{- $.Scratch.Add "bareul" . -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- else -}}
|
||||
</li>
|
||||
{{- if lt $headerLevel $prevHeaderLevel -}}
|
||||
{{- range seq (sub $prevHeaderLevel 1) -1 $headerLevel -}}
|
||||
{{- if in ($.Scratch.Get "bareul") . -}}
|
||||
</ul>
|
||||
{{/* manually do pop item */}}
|
||||
{{- $tmp := $.Scratch.Get "bareul" -}}
|
||||
{{- $.Scratch.Delete "bareul" -}}
|
||||
{{- $.Scratch.Set "bareul" slice}}
|
||||
{{- range seq (sub (len $tmp) 1) -}}
|
||||
{{- $.Scratch.Add "bareul" (index $tmp (sub . 1)) -}}
|
||||
{{- end -}}
|
||||
{{- else -}}
|
||||
</ul>
|
||||
</li>
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end }}
|
||||
<li>
|
||||
<a href="#{{- $cleanedID -}}" aria-label="{{- $header | plainify -}}">{{- $header | safeHTML -}}</a>
|
||||
{{- else }}
|
||||
<li>
|
||||
<a href="#{{- $cleanedID -}}" aria-label="{{- $header | plainify -}}">{{- $header | safeHTML -}}</a>
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
<!-- {{- $firstHeaderLevel := len (seq (index (findRE "[1-6]" (index $headers 0) 1) 0)) -}} -->
|
||||
{{- $firstHeaderLevel := $largest }}
|
||||
{{- $lastHeaderLevel := len (seq (index (findRE "[1-6]" (index $headers (sub (len $headers) 1)) 1) 0)) }}
|
||||
</li>
|
||||
{{- range seq (sub $lastHeaderLevel $firstHeaderLevel) -}}
|
||||
{{- if in ($.Scratch.Get "bareul") (add . $firstHeaderLevel) }}
|
||||
</ul>
|
||||
{{- else }}
|
||||
</ul>
|
||||
</li>
|
||||
{{- end -}}
|
||||
{{- end }}
|
||||
</ul>
|
||||
</div>
|
||||
</details>
|
||||
</div>
|
||||
</aside>
|
||||
<script>
|
||||
let activeElement;
|
||||
let elements;
|
||||
|
||||
document.addEventListener('DOMContentLoaded', function (event) {
|
||||
checkTocPosition();
|
||||
|
||||
elements = document.querySelectorAll('h1[id],h2[id],h3[id],h4[id],h5[id],h6[id]');
|
||||
if (elements.length > 0) {
|
||||
// Make the first header active
|
||||
activeElement = elements[0];
|
||||
const id = encodeURI(activeElement.getAttribute('id')).toLowerCase();
|
||||
document.querySelector(`.inner ul li a[href="#${id}"]`).classList.add('active');
|
||||
}
|
||||
|
||||
// Add event listener for the "back to top" link
|
||||
const topLink = document.getElementById('top-link');
|
||||
if (topLink) {
|
||||
topLink.addEventListener('click', (event) => {
|
||||
// Prevent the default action
|
||||
event.preventDefault();
|
||||
|
||||
// Smooth scroll to the top
|
||||
window.scrollTo({ top: 0, behavior: 'smooth' });
|
||||
});
|
||||
}
|
||||
}, false);
|
||||
|
||||
window.addEventListener('resize', function(event) {
|
||||
checkTocPosition();
|
||||
}, false);
|
||||
|
||||
window.addEventListener('scroll', () => {
|
||||
// Get the current scroll position
|
||||
const scrollPosition = window.pageYOffset || document.documentElement.scrollTop;
|
||||
|
||||
// Check if the scroll position is at the top of the page
|
||||
if (scrollPosition === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Ensure elements is a valid NodeList
|
||||
if (elements && elements.length > 0) {
|
||||
// Check if there is an object in the top half of the screen or keep the last item active
|
||||
activeElement = Array.from(elements).find((element) => {
|
||||
if ((getOffsetTop(element) - scrollPosition) > 0 &&
|
||||
(getOffsetTop(element) - scrollPosition) < window.innerHeight / 2) {
|
||||
return element;
|
||||
}
|
||||
}) || activeElement;
|
||||
|
||||
elements.forEach(element => {
|
||||
const id = encodeURI(element.getAttribute('id')).toLowerCase();
|
||||
const tocLink = document.querySelector(`.inner ul li a[href="#${id}"]`);
|
||||
if (element === activeElement){
|
||||
tocLink.classList.add('active');
|
||||
|
||||
// Ensure the active element is in view within the .inner container
|
||||
const tocContainer = document.querySelector('.toc .inner');
|
||||
const linkOffsetTop = tocLink.offsetTop;
|
||||
const containerHeight = tocContainer.clientHeight;
|
||||
const linkHeight = tocLink.clientHeight;
|
||||
|
||||
// Calculate the scroll position to center the active link
|
||||
const scrollPosition = linkOffsetTop - (containerHeight / 2) + (linkHeight / 2);
|
||||
tocContainer.scrollTo({ top: scrollPosition, behavior: 'smooth' });
|
||||
} else {
|
||||
tocLink.classList.remove('active');
|
||||
}
|
||||
});
|
||||
}
|
||||
}, false);
|
||||
|
||||
const main = parseInt(getComputedStyle(document.body).getPropertyValue('--article-width'), 10);
|
||||
const toc = parseInt(getComputedStyle(document.body).getPropertyValue('--toc-width'), 10);
|
||||
const gap = parseInt(getComputedStyle(document.body).getPropertyValue('--gap'), 10);
|
||||
|
||||
function checkTocPosition() {
|
||||
const width = document.body.scrollWidth;
|
||||
|
||||
if (width - main - (toc * 2) - (gap * 4) > 0) {
|
||||
document.getElementById("toc-container").classList.add("wide");
|
||||
} else {
|
||||
document.getElementById("toc-container").classList.remove("wide");
|
||||
}
|
||||
}
|
||||
|
||||
function getOffsetTop(element) {
|
||||
if (!element.getClientRects().length) {
|
||||
return 0;
|
||||
}
|
||||
let rect = element.getBoundingClientRect();
|
||||
let win = element.ownerDocument.defaultView;
|
||||
return rect.top + win.pageYOffset;
|
||||
}
|
||||
|
||||
</script>
|
||||
{{- end }}
|
||||
Reference in New Issue
Block a user