Initial commit: add mini pages collection

- eight-drunken-styles.html (醉翁八態)
- liquor-tasting.html (品酒程序)
- shoe-size.html (鞋子尺寸對照表)
This commit is contained in:
2026-04-12 14:24:42 +08:00
commit 04907e1ac6
3 changed files with 1534 additions and 0 deletions

676
eight-drunken-styles.html Normal file
View File

@@ -0,0 +1,676 @@
<!DOCTYPE html>
<html lang="zh-TW">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>醉翁八態 · Eight Drunken Styles</title>
<link href="https://fonts.googleapis.com/css2?family=Noto+Serif+TC:wght@300;400;600;900&family=Cinzel:wght@400;700&family=Noto+Sans+TC:wght@300;400&display=swap" rel="stylesheet">
<style>
:root {
--c1: #c8b87a; /* 猴 - 黃綠 */
--c2: #d4956a; /* 獅 - 橙 */
--c3: #c8855a; /* 豬 - 深橙 */
--c4: #c47a7a; /* 羊 - 玫瑰 */
--c5: #8a9e8a; /* 狼 - 灰綠 */
--c6: #7a9060; /* 狐 - 橄欖 */
--c7: #5a7060; /* 哭 - 深綠 */
--c8: #4a5a50; /* 真 - 墨綠 */
--bg: #1a1a18;
--text: #f0ebe0;
--text-dim: #a09880;
}
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
html { scroll-behavior: smooth; }
body {
background: var(--bg);
color: var(--text);
font-family: 'Noto Serif TC', serif;
min-height: 100vh;
overflow-x: hidden;
}
/* noise */
body::after {
content: '';
position: fixed;
inset: 0;
background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.035'/%3E%3C/svg%3E");
pointer-events: none;
z-index: 9999;
}
/* ===== HERO ===== */
.hero {
height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
text-align: center;
position: relative;
overflow: hidden;
background: #0d0d0b;
}
.hero-stripes {
position: absolute;
inset: 0;
display: flex;
opacity: 0.18;
}
.hero-stripes span {
flex: 1;
transform: skewX(-3deg) scaleX(1.1);
}
.hero-stripes span:nth-child(1) { background: var(--c1); }
.hero-stripes span:nth-child(2) { background: var(--c2); }
.hero-stripes span:nth-child(3) { background: var(--c3); }
.hero-stripes span:nth-child(4) { background: var(--c4); }
.hero-stripes span:nth-child(5) { background: var(--c5); }
.hero-stripes span:nth-child(6) { background: var(--c6); }
.hero-stripes span:nth-child(7) { background: var(--c7); }
.hero-stripes span:nth-child(8) { background: var(--c8); }
.hero-content { position: relative; z-index: 2; }
.hero-label {
font-family: 'Cinzel', serif;
font-size: 0.7rem;
letter-spacing: 0.5em;
color: var(--text-dim);
text-transform: uppercase;
opacity: 0;
animation: fadeUp 1s ease forwards 0.3s;
}
.hero-title {
font-size: clamp(3.5rem, 12vw, 8rem);
font-weight: 900;
line-height: 1;
margin: 0.25em 0 0.2em;
opacity: 0;
animation: fadeUp 1s ease forwards 0.6s;
background: linear-gradient(135deg, #e8d88a 0%, #f5f0e0 50%, #c8b87a 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.hero-sub {
font-family: 'Cinzel', serif;
font-size: clamp(0.65rem, 1.5vw, 0.85rem);
letter-spacing: 0.4em;
color: var(--text-dim);
text-transform: uppercase;
opacity: 0;
animation: fadeUp 1s ease forwards 0.9s;
}
.hero-scroll {
position: absolute;
bottom: 2.5rem;
left: 50%;
transform: translateX(-50%);
display: flex;
flex-direction: column;
align-items: center;
gap: 0.6rem;
opacity: 0;
animation: fadeUp 1s ease forwards 1.4s;
}
.hero-scroll span {
font-family: 'Cinzel', serif;
font-size: 0.55rem;
letter-spacing: 0.4em;
color: var(--text-dim);
text-transform: uppercase;
}
.scroll-line {
width: 1px;
height: 50px;
background: linear-gradient(to bottom, rgba(200,184,122,0.6), transparent);
animation: scrollPulse 2s ease-in-out infinite;
}
@keyframes scrollPulse {
0%, 100% { opacity: 0.4; transform: scaleY(1); }
50% { opacity: 1; transform: scaleY(1.1); }
}
@keyframes fadeUp {
from { opacity: 0; transform: translateY(24px); }
to { opacity: 1; transform: translateY(0); }
}
/* ===== CARDS SECTION ===== */
.cards-section {
padding: 6rem 0 8rem;
}
.cards-title {
text-align: center;
margin-bottom: 5rem;
}
.cards-title h2 {
font-family: 'Cinzel', serif;
font-size: 0.7rem;
letter-spacing: 0.5em;
color: var(--text-dim);
text-transform: uppercase;
}
/* ===== STRIPE CARDS ===== */
.stripe-wrap {
display: flex;
gap: 0;
min-height: 680px;
position: relative;
overflow: hidden;
}
.stripe {
flex: 1;
position: relative;
cursor: pointer;
transition: flex 0.6s cubic-bezier(0.25, 0.46, 0.45, 0.94);
overflow: hidden;
display: flex;
flex-direction: column;
align-items: center;
padding: 3rem 0 2.5rem;
}
.stripe:hover { flex: 3; }
.stripe::before {
content: '';
position: absolute;
inset: 0;
background: inherit;
opacity: 0.85;
transition: opacity 0.4s ease;
}
.stripe:hover::before { opacity: 1; }
.stripe-1 { background: var(--c1); }
.stripe-2 { background: var(--c2); }
.stripe-3 { background: var(--c3); }
.stripe-4 { background: var(--c4); }
.stripe-5 { background: var(--c5); }
.stripe-6 { background: var(--c6); }
.stripe-7 { background: var(--c7); }
.stripe-8 { background: var(--c8); }
.stripe-inner {
position: relative;
z-index: 1;
display: flex;
flex-direction: column;
align-items: center;
width: 100%;
height: 100%;
}
/* animal circle */
.animal-circle {
width: 90px;
height: 90px;
border-radius: 50%;
background: rgba(255,255,255,0.92);
display: flex;
align-items: center;
justify-content: center;
font-size: 2.5rem;
flex-shrink: 0;
box-shadow: 0 8px 30px rgba(0,0,0,0.2);
transition: transform 0.4s ease, box-shadow 0.4s ease;
}
.stripe:hover .animal-circle {
transform: scale(1.1);
box-shadow: 0 12px 40px rgba(0,0,0,0.3);
}
.stripe-name {
writing-mode: vertical-rl;
font-size: 1.4rem;
font-weight: 900;
color: rgba(255,255,255,0.95);
margin-top: 1.5rem;
letter-spacing: 0.1em;
text-shadow: 0 2px 8px rgba(0,0,0,0.2);
transition: opacity 0.3s ease;
}
.stripe-en {
writing-mode: vertical-rl;
font-family: 'Cinzel', serif;
font-size: 0.55rem;
letter-spacing: 0.25em;
color: rgba(255,255,255,0.5);
margin-top: 0.8rem;
text-transform: uppercase;
}
/* expanded content */
.stripe-detail {
opacity: 0;
max-width: 0;
overflow: hidden;
transition: opacity 0.4s ease 0.2s, max-width 0.6s ease;
flex: 1;
display: flex;
flex-direction: column;
justify-content: flex-end;
padding: 0 1.2rem 1rem;
}
.stripe:hover .stripe-detail {
opacity: 1;
max-width: 300px;
}
.stripe-detail p {
font-size: 0.82rem;
font-weight: 300;
line-height: 2;
color: rgba(255,255,255,0.88);
font-family: 'Noto Sans TC', sans-serif;
writing-mode: vertical-rl;
text-orientation: mixed;
white-space: nowrap;
text-shadow: 0 1px 4px rgba(0,0,0,0.2);
}
.stripe:hover .stripe-name,
.stripe:hover .stripe-en {
writing-mode: horizontal-tb;
margin-top: 0;
}
.stripe-top {
display: flex;
flex-direction: column;
align-items: center;
gap: 0.6rem;
padding-bottom: 1.5rem;
}
/* ===== GRID CARDS (mobile/alt view) ===== */
.grid-section {
max-width: 1100px;
margin: 0 auto;
padding: 6rem 1.5rem 8rem;
}
.grid-title {
display: flex;
align-items: center;
gap: 1.5rem;
margin-bottom: 3.5rem;
}
.grid-title::before, .grid-title::after {
content: '';
flex: 1;
height: 1px;
background: linear-gradient(to right, transparent, rgba(200,184,122,0.3), transparent);
}
.grid-title h2 {
font-family: 'Cinzel', serif;
font-size: 0.65rem;
letter-spacing: 0.4em;
color: var(--text-dim);
text-transform: uppercase;
white-space: nowrap;
}
.cards-grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 1.5rem;
}
.card {
border-radius: 2px;
overflow: hidden;
display: flex;
flex-direction: column;
opacity: 0;
transform: translateY(30px);
transition: opacity 0.6s ease, transform 0.6s ease, box-shadow 0.4s ease;
}
.card.visible {
opacity: 1;
transform: translateY(0);
}
.card:hover {
box-shadow: 0 20px 60px rgba(0,0,0,0.4);
transform: translateY(-4px);
}
.card-header {
padding: 2rem 1.5rem 1.5rem;
display: flex;
flex-direction: column;
align-items: center;
gap: 1rem;
}
.card-1 .card-header { background: var(--c1); }
.card-2 .card-header { background: var(--c2); }
.card-3 .card-header { background: var(--c3); }
.card-4 .card-header { background: var(--c4); }
.card-5 .card-header { background: var(--c5); }
.card-6 .card-header { background: var(--c6); }
.card-7 .card-header { background: var(--c7); }
.card-8 .card-header { background: var(--c8); }
.card-icon {
width: 72px;
height: 72px;
border-radius: 50%;
background: rgba(255,255,255,0.9);
display: flex;
align-items: center;
justify-content: center;
font-size: 2rem;
box-shadow: 0 4px 20px rgba(0,0,0,0.15);
}
.card-name {
font-size: 1.3rem;
font-weight: 900;
color: rgba(255,255,255,0.95);
text-shadow: 0 2px 6px rgba(0,0,0,0.15);
}
.card-en {
font-family: 'Cinzel', serif;
font-size: 0.55rem;
letter-spacing: 0.3em;
color: rgba(255,255,255,0.55);
text-transform: uppercase;
margin-top: -0.4rem;
}
.card-body {
background: #1e1e1c;
padding: 1.4rem 1.3rem;
flex: 1;
border: 1px solid rgba(255,255,255,0.04);
border-top: none;
}
.card-body p {
font-size: 0.8rem;
font-weight: 300;
line-height: 2;
color: rgba(240,235,224,0.65);
font-family: 'Noto Sans TC', sans-serif;
}
/* ===== FOOTER ===== */
footer {
text-align: center;
padding: 3rem 2rem;
border-top: 1px solid rgba(255,255,255,0.06);
font-family: 'Cinzel', serif;
font-size: 0.55rem;
letter-spacing: 0.45em;
color: var(--text-dim);
text-transform: uppercase;
}
/* ===== RESPONSIVE ===== */
@media (max-width: 900px) {
.cards-grid { grid-template-columns: repeat(2, 1fr); }
.stripe-wrap { display: none; }
}
@media (max-width: 540px) {
.cards-grid { grid-template-columns: 1fr; }
}
@media (min-width: 901px) {
.grid-section { display: none; }
/* show stripe on desktop */
}
</style>
</head>
<body style="background:#0d0d0b !important;">
<!-- HERO -->
<div class="hero" style="background:#0d0d0b !important;">
<div class="hero-stripes">
<span></span><span></span><span></span><span></span>
<span></span><span></span><span></span><span></span>
</div>
<div class="hero-content">
<p class="hero-label">Eight Drunken Styles</p>
<h1 class="hero-title">醉翁八態</h1>
<p class="hero-sub">八種醉態 · 各有其韻</p>
</div>
<div class="hero-scroll">
<span>Scroll</span>
<div class="scroll-line"></div>
</div>
</div>
<!-- DESKTOP: STRIPE INTERACTION -->
<div class="stripe-wrap">
<div class="stripe stripe-1">
<div class="stripe-inner">
<div class="stripe-top">
<div class="animal-circle">🐒</div>
<div class="stripe-name">猴醉</div>
<div class="stripe-en">Monkey-like</div>
</div>
<div class="stripe-detail">
<p>大聲唱歌、跳來跳去,動作迅速、反應敏捷</p>
</div>
</div>
</div>
<div class="stripe stripe-2">
<div class="stripe-inner">
<div class="stripe-top">
<div class="animal-circle">🦁</div>
<div class="stripe-name">獅醉</div>
<div class="stripe-en">Lion-like</div>
</div>
<div class="stripe-detail">
<p>大吼大叫、滋事尋釁,舞步連連、想著立桿</p>
</div>
</div>
</div>
<div class="stripe stripe-3">
<div class="stripe-inner">
<div class="stripe-top">
<div class="animal-circle">🐷</div>
<div class="stripe-name">豬醉</div>
<div class="stripe-en">Pig-like</div>
</div>
<div class="stripe-detail">
<p>舌頭遲鈍、言語不清楚仍想倒,但舌頭已說不能使喚,嚷著再來一杯</p>
</div>
</div>
</div>
<div class="stripe stripe-4">
<div class="stripe-inner">
<div class="stripe-top">
<div class="animal-circle">🐐</div>
<div class="stripe-name">羊醉</div>
<div class="stripe-en">Goat-like</div>
</div>
<div class="stripe-detail">
<p>自以為威風八面、大言不慚,對異性性趣十足,帥哥美女想去撩戲弄</p>
</div>
</div>
</div>
<div class="stripe stripe-5">
<div class="stripe-inner">
<div class="stripe-top">
<div class="animal-circle">🐺</div>
<div class="stripe-name">狼醉</div>
<div class="stripe-en">Wolf-like</div>
</div>
<div class="stripe-detail">
<p>對異性性趣十足、感覺得都是帥哥美女,灌酒以達心願,以達到對方</p>
</div>
</div>
</div>
<div class="stripe stripe-6">
<div class="stripe-inner">
<div class="stripe-top">
<div class="animal-circle">🦊</div>
<div class="stripe-name">狐醉</div>
<div class="stripe-en">Fox-like</div>
</div>
<div class="stripe-detail">
<p>也可說是假醉,金圓將對方灌醉,以達其願,人動盡其反而臉不加寬</p>
</div>
</div>
</div>
<div class="stripe stripe-7">
<div class="stripe-inner">
<div class="stripe-top">
<div class="animal-circle">🐦</div>
<div class="stripe-name">哭醉</div>
<div class="stripe-en">Sadly drunk</div>
</div>
<div class="stripe-detail">
<p>爛醉如泥,淚流滿面,人動盡反而臉不加寬</p>
</div>
</div>
</div>
<div class="stripe stripe-8">
<div class="stripe-inner">
<div class="stripe-top">
<div class="animal-circle">🐸</div>
<div class="stripe-name">真醉</div>
<div class="stripe-en">Really drunk</div>
</div>
<div class="stripe-detail">
<p>真的醉了,很快進入睡眠狀態</p>
</div>
</div>
</div>
</div>
<!-- MOBILE / GRID VIEW -->
<div class="grid-section">
<div class="grid-title"><h2>Eight Drunken Styles · 醉翁八態</h2></div>
<div class="cards-grid">
<div class="card card-1">
<div class="card-header">
<div class="card-icon">🐒</div>
<div class="card-name">猴醉</div>
<div class="card-en">Monkey-like</div>
</div>
<div class="card-body"><p>大聲唱歌、跳來跳去,動作迅速、反應敏捷</p></div>
</div>
<div class="card card-2">
<div class="card-header">
<div class="card-icon">🦁</div>
<div class="card-name">獅醉</div>
<div class="card-en">Lion-like</div>
</div>
<div class="card-body"><p>大吼大叫、滋事尋釁,舞步連連、想著立桿</p></div>
</div>
<div class="card card-3">
<div class="card-header">
<div class="card-icon">🐷</div>
<div class="card-name">豬醉</div>
<div class="card-en">Pig-like</div>
</div>
<div class="card-body"><p>舌頭遲鈍、言語不清楚仍想倒,嚷著再來一杯</p></div>
</div>
<div class="card card-4">
<div class="card-header">
<div class="card-icon">🐐</div>
<div class="card-name">羊醉</div>
<div class="card-en">Goat-like</div>
</div>
<div class="card-body"><p>自以為威風八面、大言不慚,對異性性趣十足,想去撩戲弄</p></div>
</div>
<div class="card card-5">
<div class="card-header">
<div class="card-icon">🐺</div>
<div class="card-name">狼醉</div>
<div class="card-en">Wolf-like</div>
</div>
<div class="card-body"><p>感覺得都是帥哥美女,灌酒以達心願,強行接近對方</p></div>
</div>
<div class="card card-6">
<div class="card-header">
<div class="card-icon">🦊</div>
<div class="card-name">狐醉</div>
<div class="card-en">Fox-like</div>
</div>
<div class="card-body"><p>也可說是假醉,金圓將對方灌醉,以達其願,人動盡其反而臉不加寬</p></div>
</div>
<div class="card card-7">
<div class="card-header">
<div class="card-icon">🐦</div>
<div class="card-name">哭醉</div>
<div class="card-en">Sadly drunk</div>
</div>
<div class="card-body"><p>爛醉如泥、淚流滿面,觸景傷情、感慨橫飛</p></div>
</div>
<div class="card card-8">
<div class="card-header">
<div class="card-icon">🐸</div>
<div class="card-name">真醉</div>
<div class="card-en">Really drunk</div>
</div>
<div class="card-body"><p>真的醉了,很快進入睡眠狀態</p></div>
</div>
</div>
</div>
<footer>醉翁八態 · Eight Drunken Styles · 飲酒七方</footer>
<script>
// Scroll reveal for cards
const cards = document.querySelectorAll('.card');
const observer = new IntersectionObserver((entries) => {
entries.forEach((entry, i) => {
if (entry.isIntersecting) {
setTimeout(() => entry.target.classList.add('visible'), 80 * [...cards].indexOf(entry.target));
}
});
}, { threshold: 0.1 });
cards.forEach(c => observer.observe(c));
</script>
</body>
</html>

551
liquor-tasting.html Normal file
View File

@@ -0,0 +1,551 @@
<!DOCTYPE html>
<html lang="zh-TW">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>飲酒七方 · 品酒程序</title>
<link href="https://fonts.googleapis.com/css2?family=Noto+Serif+TC:wght@300;400;600;900&family=Cinzel:wght@400;700&family=Noto+Sans+TC:wght@300;400&display=swap" rel="stylesheet">
<style>
:root {
--gold: #c9a84c;
--gold-light: #e8cb7a;
--gold-dim: #7a6030;
--bg: #0d0d0d;
--surface: #141414;
--surface2: #1c1c1c;
--text: #e8e0d0;
--text-dim: #8a8070;
--border: rgba(201,168,76,0.2);
}
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
html { scroll-behavior: smooth; }
body {
background: var(--bg);
color: var(--text);
font-family: 'Noto Serif TC', serif;
min-height: 100vh;
overflow-x: hidden;
}
/* === NOISE TEXTURE === */
body::before {
content: '';
position: fixed;
inset: 0;
background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)' opacity='0.04'/%3E%3C/svg%3E");
pointer-events: none;
z-index: 1000;
opacity: 0.4;
}
/* === HERO === */
.hero {
position: relative;
height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
text-align: center;
overflow: hidden;
}
.hero::before {
content: '';
position: absolute;
inset: 0;
background: radial-gradient(ellipse 60% 60% at 50% 50%, rgba(201,168,76,0.08) 0%, transparent 70%);
}
.hero-deco {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 600px;
height: 600px;
border: 1px solid rgba(201,168,76,0.06);
border-radius: 50%;
animation: pulse-ring 6s ease-in-out infinite;
}
.hero-deco:nth-child(2) {
width: 450px; height: 450px;
border-color: rgba(201,168,76,0.1);
animation-delay: -2s;
}
.hero-deco:nth-child(3) {
width: 300px; height: 300px;
border-color: rgba(201,168,76,0.15);
animation-delay: -4s;
}
@keyframes pulse-ring {
0%, 100% { opacity: 0.5; transform: translate(-50%, -50%) scale(1); }
50% { opacity: 1; transform: translate(-50%, -50%) scale(1.03); }
}
.hero-content { position: relative; z-index: 2; }
.hero-en {
font-family: 'Cinzel', serif;
font-size: clamp(0.7rem, 1.5vw, 0.85rem);
letter-spacing: 0.5em;
color: var(--gold);
text-transform: uppercase;
opacity: 0;
animation: fade-up 1s ease forwards 0.3s;
}
.hero-zh {
font-size: clamp(3rem, 10vw, 7rem);
font-weight: 900;
line-height: 1;
margin: 0.3em 0 0.2em;
background: linear-gradient(135deg, var(--gold-light) 0%, var(--gold) 40%, var(--gold-dim) 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
opacity: 0;
animation: fade-up 1s ease forwards 0.6s;
}
.hero-sub {
font-size: clamp(0.8rem, 2vw, 1rem);
font-weight: 300;
color: var(--text-dim);
letter-spacing: 0.3em;
opacity: 0;
animation: fade-up 1s ease forwards 0.9s;
}
.hero-line {
width: 1px;
height: 80px;
background: linear-gradient(to bottom, var(--gold), transparent);
margin: 2.5rem auto 0;
opacity: 0;
animation: fade-up 1s ease forwards 1.2s;
}
@keyframes fade-up {
from { opacity: 0; transform: translateY(20px); }
to { opacity: 1; transform: translateY(0); }
}
/* === SECTION === */
section {
max-width: 1200px;
margin: 0 auto;
padding: 6rem 2rem;
}
.section-title {
display: flex;
align-items: center;
gap: 1.5rem;
margin-bottom: 4rem;
}
.section-title::before, .section-title::after {
content: '';
flex: 1;
height: 1px;
background: linear-gradient(to right, transparent, var(--gold-dim), transparent);
}
.section-title h2 {
font-family: 'Cinzel', serif;
font-size: 0.75rem;
letter-spacing: 0.4em;
color: var(--gold);
text-transform: uppercase;
white-space: nowrap;
}
/* === SEVEN WAYS === */
.ways-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
gap: 1.5px;
background: var(--border);
border: 1px solid var(--border);
}
.way-card {
background: var(--surface);
padding: 2.5rem 2rem;
position: relative;
overflow: hidden;
transition: background 0.4s ease;
cursor: default;
}
.way-card::before {
content: '';
position: absolute;
top: 0; left: 0;
width: 3px;
height: 0;
background: var(--gold);
transition: height 0.4s ease;
}
.way-card:hover { background: var(--surface2); }
.way-card:hover::before { height: 100%; }
.way-char {
font-size: 3.5rem;
font-weight: 900;
line-height: 1;
background: linear-gradient(135deg, var(--gold-light), var(--gold));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
margin-bottom: 0.4rem;
}
.way-en {
font-family: 'Cinzel', serif;
font-size: 0.65rem;
letter-spacing: 0.35em;
color: var(--gold-dim);
text-transform: uppercase;
margin-bottom: 1.2rem;
}
.way-desc {
font-size: 0.9rem;
font-weight: 300;
line-height: 2;
color: var(--text-dim);
font-family: 'Noto Sans TC', sans-serif;
}
.way-num {
position: absolute;
top: 1.5rem;
right: 1.5rem;
font-family: 'Cinzel', serif;
font-size: 0.6rem;
color: rgba(201,168,76,0.2);
letter-spacing: 0.1em;
}
/* === TASTING PROCEDURE === */
.procedure-section {
background: var(--surface);
border-top: 1px solid var(--border);
border-bottom: 1px solid var(--border);
}
.procedure-section > section {
padding-top: 5rem;
padding-bottom: 5rem;
}
.steps-flow {
display: grid;
grid-template-columns: repeat(4, 1fr);
position: relative;
}
.steps-flow::before {
content: '';
position: absolute;
top: 60px;
left: calc(12.5% + 10px);
right: calc(12.5% + 10px);
height: 1px;
background: linear-gradient(to right, var(--gold-dim), var(--gold), var(--gold-dim));
}
.step {
display: flex;
flex-direction: column;
align-items: center;
text-align: center;
padding: 0 1rem;
opacity: 0;
animation: fade-up 0.8s ease forwards;
}
.step:nth-child(1) { animation-delay: 0.1s; }
.step:nth-child(2) { animation-delay: 0.3s; }
.step:nth-child(3) { animation-delay: 0.5s; }
.step:nth-child(4) { animation-delay: 0.7s; }
.step-circle {
width: 120px;
height: 120px;
border-radius: 50%;
border: 1px solid var(--gold);
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
background: var(--bg);
position: relative;
z-index: 1;
transition: all 0.4s ease;
box-shadow: 0 0 30px rgba(201,168,76,0.05);
}
.step-circle:hover {
background: rgba(201,168,76,0.08);
box-shadow: 0 0 50px rgba(201,168,76,0.15);
transform: scale(1.05);
}
.step-zh {
font-size: 2rem;
font-weight: 900;
color: var(--gold-light);
line-height: 1;
}
.step-en {
font-family: 'Cinzel', serif;
font-size: 0.55rem;
letter-spacing: 0.2em;
color: var(--gold-dim);
text-transform: uppercase;
margin-top: 0.3rem;
}
.step-attrs {
margin-top: 2rem;
display: flex;
flex-direction: column;
gap: 0.4rem;
}
.step-attrs span {
font-size: 0.82rem;
color: var(--text-dim);
font-family: 'Noto Sans TC', sans-serif;
font-weight: 300;
}
.step-attrs .en-attr {
font-family: 'Cinzel', serif;
font-size: 0.55rem;
color: rgba(201,168,76,0.3);
letter-spacing: 0.1em;
margin-top: 0.8rem;
}
/* === FOOTER === */
footer {
text-align: center;
padding: 3rem 2rem;
border-top: 1px solid var(--border);
font-family: 'Cinzel', serif;
font-size: 0.6rem;
letter-spacing: 0.4em;
color: var(--gold-dim);
text-transform: uppercase;
}
/* === SCROLL REVEAL === */
.reveal {
opacity: 0;
transform: translateY(30px);
transition: opacity 0.8s ease, transform 0.8s ease;
}
.reveal.visible {
opacity: 1;
transform: translateY(0);
}
/* === RESPONSIVE === */
@media (max-width: 768px) {
.steps-flow {
grid-template-columns: repeat(2, 1fr);
gap: 3rem 1rem;
}
.steps-flow::before { display: none; }
.ways-grid { grid-template-columns: 1fr; }
}
@media (max-width: 480px) {
.steps-flow { grid-template-columns: 1fr; }
}
</style>
</head>
<body>
<!-- HERO -->
<div class="hero">
<div class="hero-deco"></div>
<div class="hero-deco"></div>
<div class="hero-deco"></div>
<div class="hero-content">
<p class="hero-en">The Art of Chinese Liquor</p>
<h1 class="hero-zh">飲酒七方</h1>
<p class="hero-sub">七種飲酒之道 · 一套品酒程序</p>
<div class="hero-line"></div>
</div>
</div>
<!-- SEVEN WAYS -->
<section>
<div class="section-title">
<h2>Seven Ways of Liquor Drinking</h2>
</div>
<div class="ways-grid reveal">
<div class="way-card">
<span class="way-num">01</span>
<div class="way-char"></div>
<div class="way-en">Drink Bravely</div>
<div class="way-desc">鴻圖壯志心未止,飲乾一壺笑看天</div>
</div>
<div class="way-card">
<span class="way-num">02</span>
<div class="way-char"></div>
<div class="way-en">Drink Freely</div>
<div class="way-desc">任由酒花白眼亂,何不一回酒中仙</div>
</div>
<div class="way-card">
<span class="way-num">03</span>
<div class="way-char"></div>
<div class="way-en">Drink Lustfully</div>
<div class="way-desc">胸前瑞雪燈斜照,眼底桃花酒半醺。美人在懷,秋波盈盈,飲酒一杯已三分</div>
</div>
<div class="way-card">
<span class="way-num">04</span>
<div class="way-char"></div>
<div class="way-en">Drink Alone</div>
<div class="way-desc">一仰盡盅酒,舉杯邀邀月</div>
</div>
<div class="way-card">
<span class="way-num">05</span>
<div class="way-char"></div>
<div class="way-en">Drink in Pairs</div>
<div class="way-desc">但求知音相對飲,隔桌呼取盡餘杯</div>
</div>
<div class="way-card">
<span class="way-num">06</span>
<div class="way-char"></div>
<div class="way-en">Drink in Groups</div>
<div class="way-desc">開壇猛生花醉月,群朋聚飲樂無邊。催酒興來難知盡,千杯不醉似神仙</div>
</div>
<div class="way-card">
<span class="way-num">07</span>
<div class="way-char"></div>
<div class="way-en">Drink Generously</div>
<div class="way-desc">醉臥沙場君莫笑,瀟瀟滄海歸何年</div>
</div>
</div>
</section>
<!-- PROCEDURE -->
<div class="procedure-section">
<section>
<div class="section-title">
<h2>Procedure of Liquor Tasting</h2>
</div>
<div class="steps-flow">
<div class="step">
<div class="step-circle">
<div class="step-zh"></div>
<div class="step-en">Look</div>
</div>
<div class="step-attrs">
<span>光澤</span>
<span>顏色</span>
<span>清晰度</span>
<span class="en-attr">gloss · color · clarity</span>
</div>
</div>
<div class="step">
<div class="step-circle">
<div class="step-zh"></div>
<div class="step-en">Smell</div>
</div>
<div class="step-attrs">
<span>果香 · 花香 · 藥香</span>
<span>清香 · 濃香</span>
<span>醬香 · 醇香</span>
<span class="en-attr">fruity · flowery · herbal<br>refreshing · strong · mellow</span>
</div>
</div>
<div class="step">
<div class="step-circle">
<div class="step-zh"></div>
<div class="step-en">Taste</div>
</div>
<div class="step-attrs">
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span class="en-attr">sour · sweet · bitter · astringent · salty</span>
</div>
</div>
<div class="step">
<div class="step-circle">
<div class="step-zh">回味</div>
<div class="step-en">Savor</div>
</div>
<div class="step-attrs">
<span>平滑</span>
<span>柔和</span>
<span>爽口</span>
<span>圓正</span>
<span class="en-attr">smooth · supple · fresh · round</span>
</div>
</div>
</div>
</section>
</div>
<footer>
飲酒七方 · Seven Ways of Liquor Drinking · 品酒程序
</footer>
<script>
// Scroll reveal
const reveals = document.querySelectorAll('.reveal');
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.classList.add('visible');
}
});
}, { threshold: 0.1 });
reveals.forEach(el => observer.observe(el));
// Staggered card reveal
const cards = document.querySelectorAll('.way-card');
const cardObserver = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
const cards = entry.target.querySelectorAll('.way-card');
cards.forEach((card, i) => {
setTimeout(() => {
card.style.opacity = '1';
card.style.transform = 'translateY(0)';
}, i * 80);
});
}
});
}, { threshold: 0.1 });
document.querySelectorAll('.ways-grid').forEach(grid => {
grid.querySelectorAll('.way-card').forEach(card => {
card.style.opacity = '0';
card.style.transform = 'translateY(20px)';
card.style.transition = 'opacity 0.6s ease, transform 0.6s ease, background 0.4s ease';
});
cardObserver.observe(grid);
});
</script>
</body>
</html>

307
shoe-size.html Normal file
View File

@@ -0,0 +1,307 @@
<!DOCTYPE html>
<html lang="zh-TW">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>鞋子尺寸對照表</title>
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+TC:wght@300;400;500;700&display=swap" rel="stylesheet">
<style>
* { box-sizing: border-box; margin: 0; padding: 0; }
body {
font-family: 'Noto Sans TC', sans-serif;
background: #f5f6fa;
min-height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
justify-content: flex-start;
padding: 2.5rem 1rem 4rem;
color: #1a1a2e;
}
.container {
width: 100%;
max-width: 600px;
}
/* Header */
.header {
display: flex;
align-items: center;
gap: 0.7rem;
margin-bottom: 2rem;
}
.header-icon {
font-size: 2rem;
filter: drop-shadow(0 2px 4px rgba(0,0,0,0.12));
}
.header h1 {
font-size: 1.5rem;
font-weight: 700;
letter-spacing: 0.05em;
color: #1a1a2e;
}
/* Size input */
.input-card {
background: #fff;
border-radius: 16px;
padding: 1.4rem 1.6rem;
margin-bottom: 1.2rem;
box-shadow: 0 2px 12px rgba(0,0,0,0.07);
display: flex;
align-items: center;
gap: 1rem;
flex-wrap: wrap;
}
.input-card label {
font-size: 0.9rem;
font-weight: 500;
color: #555;
white-space: nowrap;
}
.input-row {
display: flex;
align-items: center;
gap: 0.6rem;
flex: 1;
}
.input-row select {
flex: 1;
padding: 0.5rem 0.8rem;
border: 1.5px solid #e0e4f0;
border-radius: 8px;
font-family: inherit;
font-size: 0.95rem;
color: #1a1a2e;
background: #f8f9ff;
outline: none;
cursor: pointer;
transition: border-color 0.2s;
}
.input-row select:focus { border-color: #4f6ef7; }
.input-row input[type=number] {
width: 90px;
padding: 0.5rem 0.8rem;
border: 1.5px solid #e0e4f0;
border-radius: 8px;
font-family: inherit;
font-size: 0.95rem;
color: #1a1a2e;
background: #f8f9ff;
outline: none;
text-align: center;
transition: border-color 0.2s;
}
.input-row input[type=number]:focus { border-color: #4f6ef7; }
/* Table card */
.table-card {
background: #fff;
border-radius: 16px;
overflow: hidden;
box-shadow: 0 2px 12px rgba(0,0,0,0.07);
}
table {
width: 100%;
border-collapse: collapse;
}
thead tr {
background: #eef0fb;
}
thead th {
padding: 1rem 1.4rem;
font-size: 0.8rem;
font-weight: 600;
letter-spacing: 0.08em;
color: #6b7280;
text-align: left;
}
tbody tr {
border-top: 1px solid #f0f1f8;
transition: background 0.15s;
}
tbody tr:hover { background: #f7f8ff; }
tbody tr.highlight {
background: #eff3ff;
border-left: 3px solid #4f6ef7;
}
tbody tr.highlight td:first-child { padding-left: calc(1.4rem - 3px); }
tbody td {
padding: 1rem 1.4rem;
font-size: 0.95rem;
}
td.region {
font-weight: 500;
color: #374151;
}
td.code {
font-size: 0.75rem;
color: #9ca3af;
padding-top: 0;
padding-bottom: 0;
line-height: 1;
}
td.size {
font-weight: 700;
font-size: 1.05rem;
color: #1a1a2e;
text-align: right;
}
tbody tr.highlight td.size {
color: #4f6ef7;
}
.region-wrap { display: flex; flex-direction: column; gap: 2px; }
.region-name { font-weight: 500; color: #374151; font-size: 0.95rem; }
.region-code { font-size: 0.72rem; color: #9ca3af; }
/* Note */
.note {
margin-top: 1rem;
font-size: 0.75rem;
color: #9ca3af;
text-align: center;
line-height: 1.8;
}
</style>
</head>
<body>
<div class="container">
<div class="header">
<span class="header-icon">👟</span>
<h1>鞋子尺寸對照表</h1>
</div>
<div class="input-card">
<label>輸入尺寸換算</label>
<div class="input-row">
<select id="fromUnit" onchange="convert()">
<option value="eu">歐碼 EU</option>
<option value="us">美碼 US</option>
<option value="uk">英碼 UK</option>
<option value="mm">腳長 mm</option>
<option value="mx">墨西哥 MX (cm)</option>
<option value="br">巴西 BR</option>
<option value="ru">俄羅斯 RU</option>
</select>
<input type="number" id="sizeInput" placeholder="44" min="1" step="0.5" oninput="convert()">
</div>
</div>
<div class="table-card">
<table>
<thead>
<tr>
<th>地區/規格</th>
<th style="text-align:right">尺寸標示</th>
</tr>
</thead>
<tbody id="tableBody">
<!-- filled by JS -->
</tbody>
</table>
</div>
<p class="note">以上為近似換算,不同品牌可能略有差異。<br>建議實際試穿確認。</p>
</div>
<script>
// Base data: array of {eu, us, uk, mm, mx, br, ru}
const sizeData = [
{ eu: 38, us: 6, uk: 5, mm: 240, mx: 24.0, br: 36, ru: 37 },
{ eu: 38.5, us: 6.5, uk: 5.5, mm: 245, mx: 24.5, br: 37, ru: 37.5 },
{ eu: 39, us: 7, uk: 6, mm: 250, mx: 25.0, br: 38, ru: 38 },
{ eu: 40, us: 7.5, uk: 6.5, mm: 255, mx: 25.5, br: 38, ru: 38.5 },
{ eu: 40.5, us: 8, uk: 7, mm: 260, mx: 26.0, br: 39, ru: 39 },
{ eu: 41, us: 8.5, uk: 7.5, mm: 265, mx: 26.5, br: 40, ru: 40 },
{ eu: 42, us: 9, uk: 8, mm: 270, mx: 27.0, br: 41, ru: 40.5 },
{ eu: 42.5, us: 9.5, uk: 8.5, mm: 275, mx: 27.5, br: 41, ru: 41 },
{ eu: 43, us: 10, uk: 9, mm: 278, mx: 27.8, br: 42, ru: 42 },
{ eu: 44, us: 10.5, uk: 9.5, mm: 282, mx: 28.0, br: 42, ru: 43 },
{ eu: 44.5, us: 11, uk: 10, mm: 285, mx: 28.5, br: 43, ru: 43.5 },
{ eu: 45, us: 11.5, uk: 10.5, mm: 290, mx: 29.0, br: 44, ru: 44 },
{ eu: 46, us: 12, uk: 11, mm: 295, mx: 29.5, br: 45, ru: 45 },
{ eu: 47, us: 13, uk: 12, mm: 300, mx: 30.0, br: 46, ru: 46 },
];
const regions = [
{ key: 'eu', name: '歐碼', code: 'EU', unit: '' },
{ key: 'us', name: '美碼', code: 'US', unit: '' },
{ key: 'uk', name: '英碼', code: 'UK', unit: '' },
{ key: 'mm', name: '腳長', code: 'CM/MM', unit: ' mm' },
{ key: 'mx', name: '墨西哥', code: 'MX', unit: ' cm' },
{ key: 'br', name: '巴西', code: 'BR', unit: '' },
{ key: 'ru', name: '俄羅斯', code: 'RU', unit: '' },
];
// Default display (no input): show the sample row from image
function renderDefault() {
const tbody = document.getElementById('tableBody');
const sample = sizeData.find(r => r.eu === 44) || sizeData[9];
tbody.innerHTML = regions.map(r => `
<tr>
<td><div class="region-wrap">
<span class="region-name">${r.name}</span>
<span class="region-code">${r.code}</span>
</div></td>
<td class="size">${fmt(sample[r.key])}${r.unit}</td>
</tr>
`).join('');
}
function fmt(v) {
return Number.isInteger(v) ? v : v;
}
function convert() {
const unit = document.getElementById('fromUnit').value;
const val = parseFloat(document.getElementById('sizeInput').value);
if (isNaN(val)) { renderDefault(); return; }
// Find closest row
let best = null, bestDiff = Infinity;
for (const row of sizeData) {
const diff = Math.abs(row[unit] - val);
if (diff < bestDiff) { bestDiff = diff; best = row; }
}
const tbody = document.getElementById('tableBody');
tbody.innerHTML = regions.map(r => `
<tr class="${r.key === unit ? 'highlight' : ''}">
<td><div class="region-wrap">
<span class="region-name">${r.name}</span>
<span class="region-code">${r.code}</span>
</div></td>
<td class="size">${fmt(best[r.key])}${r.unit}</td>
</tr>
`).join('');
}
renderDefault();
</script>
</body>
</html>