<!DOCTYPE html>
<html lang="zh-Hant">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>忽冷忽熱、已讀不回?他到底在想什麼,顏色會告訴妳|一心一憶</title>
<meta name="description" content="他今天為什麼這麼冷淡?與其每天猜測他的心思,不如透過色彩測驗,直接看穿他沒說出口的情緒。">
<meta property="og:title" content="忽冷忽熱、已讀不回?他到底在想什麼,顏色會告訴妳">
<meta property="og:description" content="讀懂他,也放過妳自己。用色彩測驗看穿他沒說出口的情緒。">
<meta property="og:url" content="https://oncian.com">
<meta property="og:type" content="website">
<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=Noto+Serif+TC:wght@300;400;500;600;700&display=swap" rel="stylesheet">
<style>
:root{
--ink:#2B1D24;
--paper:#FBF6F0;
--wine:#7A2E3A;
--gold:#C9A66B;
--sand:#E8D9C5;
--red:#B5453A;
--gray:#8B8378;
--yellow:#C99A34;
--blue:#5B7C99;
}
*{ box-sizing:border-box; }
html,body{ margin:0; background:var(--paper); color:var(--ink); font-family:'Noto Serif TC', sans-serif; }
body{ position:relative; display:flex; justify-content:center; overflow-x:hidden; }
.grain{
position:fixed; inset:0; pointer-events:none; opacity:.5; mix-blend-mode:multiply; z-index:1;
background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='120' height='120'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2' stitchTiles='stitch'/><feColorMatrix type='matrix' values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.03 0'/></filter><rect width='100%25' height='100%25' filter='url(%23n)'/></svg>");
}
.light{ position:fixed; pointer-events:none; border-radius:50%; filter:blur(90px); z-index:0; }
.light-1{ top:-140px; right:-100px; width:420px; height:420px; background:radial-gradient(circle, rgba(201,166,107,.55), transparent 70%); }
.light-2{ top:38%; left:-160px; width:380px; height:380px; background:radial-gradient(circle, rgba(122,46,58,.28), transparent 70%); }
.light-3{ bottom:-120px; right:10%; width:360px; height:360px; background:radial-gradient(circle, rgba(91,124,153,.22), transparent 70%); }
main{ position:relative; z-index:2; }
main{ width:100%; max-width:720px; padding:70px 24px 60px; }
.hero{ text-align:center; margin-bottom:64px; animation:rise .9s ease both; }
.eyebrow{ margin:0 0 16px; font-size:12px; letter-spacing:.3em; color:var(--wine); font-weight:500; }
h1{ margin:0 0 16px; font-family:'Noto Serif TC', serif; font-weight:600; font-size:clamp(28px,5.5vw,42px); line-height:1.45; }
.sub{ margin:0; font-size:14px; line-height:1.8; color:rgba(43,29,36,.6); }
.sub-emphasis{ margin:16px 0 0; font-size:16px; font-weight:600; color:var(--wine); }
.section-title{ font-family:'Noto Serif TC', serif; font-size:clamp(20px,3.4vw,24px); font-weight:600; text-align:center; margin:0 0 6px; }
.section-sub{ text-align:center; font-size:13px; color:rgba(43,29,36,.55); margin:0 0 36px; }
.reading{ margin-bottom:80px; animation:rise 1s ease both; animation-delay:.1s; }
.card-grid{ display:grid; grid-template-columns:1fr 1fr; gap:18px; margin-top:32px; }
.card-flip{ height:216px; perspective:1300px; }
.card-flip.c-red{ --accent:var(--red); }
.card-flip.c-gray{ --accent:var(--gray); }
.card-flip.c-yellow{ --accent:var(--yellow); }
.card-flip.c-blue{ --accent:var(--blue); }
.card-inner{
position:relative; width:100%; height:100%; cursor:pointer;
transition:transform .65s cubic-bezier(.4,.2,.2,1); transform-style:preserve-3d;
}
.card-flip.flipped .card-inner{ transform:rotateY(180deg); }
.card-face{
position:absolute; inset:0; backface-visibility:hidden; border-radius:16px;
padding:24px 22px; border-left:3px solid var(--accent); background:#fff8f0;
box-shadow:0 14px 30px -22px rgba(43,29,36,.35), inset 0 1px 0 rgba(255,255,255,.7);
display:flex; flex-direction:column; transition:box-shadow .3s ease;
}
.card-flip:hover .card-face{
box-shadow:0 18px 36px -20px color-mix(in srgb, var(--accent) 35%, rgba(43,29,36,.3)), inset 0 1px 0 rgba(255,255,255,.8);
}
.swatch{ box-shadow:0 0 0 5px color-mix(in srgb, var(--accent) 16%, transparent); }
.card-front{ justify-content:space-between; }
.card .head{ display:flex; align-items:center; gap:9px; margin-bottom:14px; }
.swatch{ width:13px; height:13px; border-radius:50%; background:var(--accent); flex:none; }
.card .name{ font-family:'Noto Serif TC', serif; font-weight:600; font-size:15px; }
.card .scenario{ margin:0; font-size:14px; line-height:1.7; font-weight:500; }
.flip-hint{ margin:0; font-size:11px; letter-spacing:.06em; color:var(--gold); }
.card-back{ transform:rotateY(180deg); justify-content:center; }
.card .insight{ margin:0; font-size:12.5px; line-height:1.85; color:rgba(43,29,36,.62); }
.quiz{ animation:rise 1.1s ease both; animation-delay:.2s; }
.progress{ display:flex; justify-content:center; gap:11px; margin:0 0 34px; }
.dot{ width:9px; height:9px; border-radius:50%; border:1.5px solid rgba(43,29,36,.22); transition:background .35s ease, border-color .35s ease, transform .3s ease; }
.dot.active{ border-color:var(--wine); transform:scale(1.4); }
.quiz-card{
max-width:460px; margin:0 auto; background:#fff8f0; border:1px solid var(--sand);
border-radius:18px; padding:36px 30px;
box-shadow:0 20px 44px -28px rgba(43,29,36,.4), 0 0 60px -20px rgba(201,166,107,.35), inset 0 1px 0 rgba(255,255,255,.7);
}
.q-count{ margin:0 0 14px; font-size:11px; letter-spacing:.2em; color:var(--gold); text-align:center; font-weight:500; }
.q-text{ margin:0 0 26px; font-family:'Noto Serif TC', serif; font-size:clamp(17px,3.6vw,20px); line-height:1.7; text-align:center; font-weight:500; }
.options{ display:flex; flex-direction:column; gap:11px; }
.option-btn{
width:100%; text-align:left; padding:14px 18px; border-radius:11px;
border:1px solid rgba(43,29,36,.14); background:transparent; font-family:'Noto Serif TC', sans-serif;
font-size:13.5px; line-height:1.6; color:var(--ink); cursor:pointer;
transition:background .2s ease, border-color .2s ease, transform .15s ease;
}
.option-btn:hover{ background:rgba(201,166,107,.14); border-color:var(--gold); box-shadow:0 0 22px -10px rgba(201,166,107,.6); }
.option-btn.selected{ background:rgba(122,46,58,.1); border-color:var(--wine); transform:translateX(3px); }
.option-btn:focus-visible{ outline:2px solid var(--gold); outline-offset:3px; }
.option-btn:disabled{ cursor:default; }
.result{ max-width:460px; margin:0 auto; text-align:center; border-radius:18px; padding:48px 30px;
border:1px solid var(--sand); background:
radial-gradient(circle at 50% 0%, color-mix(in srgb, var(--accent) 26%, transparent), transparent 72%), #fff8f0;
box-shadow:0 20px 44px -28px rgba(43,29,36,.4), 0 0 70px -18px color-mix(in srgb, var(--accent) 45%, transparent);
animation:rise .7s ease both;
}
.result-eyebrow{ margin:0 0 10px; font-size:12px; letter-spacing:.28em; color:rgba(43,29,36,.5); }
.result-color{ margin:0 0 20px; font-family:'Noto Serif TC', serif; font-size:clamp(30px,6vw,42px); color:var(--accent); font-weight:700; }
.result-desc{ margin:0 0 28px; font-size:14px; line-height:1.85; color:rgba(43,29,36,.72); }
.trail{ display:flex; justify-content:center; gap:8px; margin-bottom:30px; }
.trail span{ width:10px; height:10px; border-radius:50%; display:inline-block; }
.retry-btn{
appearance:none; border:1px solid var(--wine); background:transparent; color:var(--wine);
font-family:'Noto Serif TC', sans-serif; font-size:13px; letter-spacing:.08em;
padding:12px 30px; border-radius:999px; cursor:pointer; transition:background .2s ease, color .2s ease;
}
.retry-btn:hover{ background:var(--wine); color:var(--paper); box-shadow:0 0 26px -8px rgba(122,46,58,.6); }
.subscribe{
max-width:460px; margin:90px auto 0; text-align:center; border-radius:18px; padding:44px 32px;
border:1px solid var(--sand); background:
radial-gradient(circle at 50% 0%, rgba(201,166,107,.22), transparent 72%), #fff8f0;
box-shadow:0 20px 44px -28px rgba(43,29,36,.4), 0 0 60px -20px rgba(201,166,107,.35), inset 0 1px 0 rgba(255,255,255,.7);
}
.subscribe .section-title{ margin-bottom:10px; }
.subscribe .section-sub{ margin-bottom:28px; }
.sub-form{ display:flex; gap:10px; flex-wrap:wrap; justify-content:center; }
.sub-form input{
flex:1; min-width:200px; padding:13px 16px; border-radius:999px;
border:1px solid rgba(43,29,36,.18); background:var(--paper); color:var(--ink);
font-family:'Noto Serif TC', serif; font-size:13.5px; outline:none;
transition:border-color .2s ease, box-shadow .2s ease;
}
.sub-form input:focus{ border-color:var(--gold); box-shadow:0 0 0 4px rgba(201,166,107,.18); }
.sub-btn{
appearance:none; border:none; cursor:pointer; background:var(--wine); color:var(--paper);
font-family:'Noto Serif TC', serif; font-size:13.5px; letter-spacing:.06em;
padding:13px 28px; border-radius:999px; transition:background .2s ease, box-shadow .2s ease, transform .2s ease;
}
.sub-btn:hover{ background:var(--wine-deep,#5c222c); transform:translateY(-1px); box-shadow:0 12px 26px -12px rgba(122,46,58,.6); }
.sub-note{ margin:16px 0 0; font-size:11.5px; color:rgba(43,29,36,.5); }
footer{ margin-top:70px; text-align:center; font-size:11px; letter-spacing:.18em; color:rgba(43,29,36,.4); }
@keyframes rise{ from{ opacity:0; transform:translateY(14px); } to{ opacity:1; transform:translateY(0); } }
@media (prefers-reduced-motion: reduce){ *{ animation:none !important; transition:none !important; } }
@media (max-width:560px){
.card-grid{ grid-template-columns:1fr; }
.card-flip{ height:190px; }
main{ padding:54px 18px 40px; }
}
</style>
</head>
<body>
<div class="grain"></div>
<div class="light light-1"></div>
<div class="light light-2"></div>
<div class="light light-3"></div>
<main>
<header class="hero">
<p class="eyebrow">情感篇</p>
<h1>忽冷忽熱、已讀不回?<br>他到底在想什麼,顏色會告訴妳</h1>
<p class="sub">他今天為什麼這麼冷淡?這句話到底有沒有別的意思?<br>與其每天猜測他的心思、把自己搞得很累,不如透過色彩測驗,直接看穿他沒說出口的情緒。</p>
<p class="sub-emphasis">讀懂他,也放過妳自己。</p>
</header>
<section class="reading">
<h2 class="section-title">先讀懂他</h2>
<p class="section-sub">要怎麼知道他在想什麼?</p>
<div class="card-grid">
<div class="card-flip c-red" tabindex="0" role="button" aria-label="翻面看紅色情境解讀">
<div class="card-inner">
<div class="card-face card-front">
<div>
<div class="head"><span class="swatch"></span><span class="name">紅色情境</span></div>
<p class="scenario">他突然密集傳訊息、想馬上見到你</p>
</div>
<p class="flip-hint">點擊翻面看解讀</p>
</div>
<div class="card-face card-back">
<p class="insight">紅色的本質是熱烈,情緒會隨事件起伏——他不是突然變黏人,而是此刻有某種強烈的感受正在燃燒。這時候他要的不是道理,是被回應的速度感。</p>
</div>
</div>
</div>
<div class="card-flip c-gray" tabindex="0" role="button" aria-label="翻面看灰色情境解讀">
<div class="card-inner">
<div class="card-face card-front">
<div>
<div class="head"><span class="swatch"></span><span class="name">灰色情境</span></div>
<p class="scenario">你問他怎麼了,他只回「沒事」</p>
</div>
<p class="flip-hint">點擊翻面看解讀</p>
</div>
<div class="card-face card-back">
<p class="insight">灰色偏理性,較不擅長處理情感面。他不是不在乎,而是還沒把感受翻譯成語言,給他一點時間整理,比催促更有用。</p>
</div>
</div>
</div>
<div class="card-flip c-yellow" tabindex="0" role="button" aria-label="翻面看黃色情境解讀">
<div class="card-inner">
<div class="card-face card-front">
<div>
<div class="head"><span class="swatch"></span><span class="name">黃色情境</span></div>
<p class="scenario">他像小孩一樣直接說「我今天很開心/不開心」</p>
</div>
<p class="flip-hint">點擊翻面看解讀</p>
</div>
<div class="card-face card-back">
<p class="insight">黃色是最不修飾的顏色,情緒和情感是直接表達的。他說的就是他想的,不用過度解讀。</p>
</div>
</div>
</div>
<div class="card-flip c-blue" tabindex="0" role="button" aria-label="翻面看藍色情境解讀">
<div class="card-inner">
<div class="card-face card-front">
<div>
<div class="head"><span class="swatch"></span><span class="name">藍色情境</span></div>
<p class="scenario">他看起來很穩定,但你總覺得摸不透他的心</p>
</div>
<p class="flip-hint">點擊翻面看解讀</p>
</div>
<div class="card-face card-back">
<p class="insight">藍色是平行線的關係——習慣保持距離感,情緒不輕易外露。這不代表冷漠,而是他習慣的親密方式比較安靜、比較有邊界。</p>
</div>
</div>
</div>
</div>
</section>
<section class="quiz" id="quizSection">
<h2 class="section-title">再讀懂自己</h2>
<p class="section-sub">六個情境,最直覺的答案就是最貼近你的顏色</p>
<div class="progress" id="progress"></div>
<div class="quiz-card" id="quizCard">
<p class="q-count" id="qCount">1 / 6</p>
<p class="q-text" id="qText"></p>
<div class="options" id="options"></div>
</div>
<div class="result" id="result" hidden>
<p class="result-eyebrow">你是</p>
<h3 class="result-color" id="resultColor"></h3>
<p class="result-desc" id="resultDesc"></p>
<div class="trail" id="trail"></div>
<button class="retry-btn" id="retryBtn">重新測一次</button>
</div>
</section>
<section class="subscribe">
<h2 class="section-title">收到更多情感篇</h2>
<p class="section-sub">留下 Email,下一篇顏色解讀先讓你看</p>
<form class="sub-form" id="subForm">
<input type="email" id="subEmail" placeholder="你的 Email" required>
<button type="submit" class="sub-btn">訂閱</button>
</form>
<p class="sub-note" id="subNote">不定期發送,隨時可以取消訂閱</p>
</section>
<footer>一心一憶 · Oncian Studio</footer>
</main>
<script>
const colorMeta = {
red: { name:'紅', hex:'#B5453A', desc:'愛得熱烈,情緒也跟著起伏,容易受傷也容易感動。' },
gray: { name:'灰', hex:'#8B8378', desc:'理性內斂,感受需要時間醞釀才說得出口。' },
yellow: { name:'黃', hex:'#C99A34', desc:'坦率得像個孩子,喜怒都藏不住,攤在陽光下。' },
blue: { name:'藍', hex:'#5B7C99', desc:'習慣保持一點距離,親密的方式安靜而有分寸。' }
};
const questions = [
{ text:'跟另一半吵架後,你通常會——', options:[
{ label:'A', text:'馬上想找他把話說開,一刻都靜不下來', color:'red' },
{ label:'B', text:'先自己一個人冷靜,理清楚再說', color:'gray' },
{ label:'C', text:'直接說出當下的委屈或生氣,藏不住', color:'yellow' },
{ label:'D', text:'表面照常過日子,情緒留給自己消化', color:'blue' }
]},
{ text:'收到一份意外的驚喜禮物,你的反應是——', options:[
{ label:'A', text:'立刻衝過去抱住對方,情緒整個上來', color:'red' },
{ label:'B', text:'心裡開心,但表情可能還是很淡定', color:'gray' },
{ label:'C', text:'開心得直接叫出來,藏不住笑容', color:'yellow' },
{ label:'D', text:'心裡溫暖了一下,但不會有太大反應', color:'blue' }
]},
{ text:'對方最近突然變得比較安靜,你會——', options:[
{ label:'A', text:'忍不住一直追問「你怎麼了」', color:'red' },
{ label:'B', text:'覺得他大概需要空間,先不打擾', color:'gray' },
{ label:'C', text:'直接問清楚,不喜歡猜來猜去', color:'yellow' },
{ label:'D', text:'觀察一陣子,等他自己開口', color:'blue' }
]},
{ text:'你形容自己在感情裡的狀態,比較像——', options:[
{ label:'A', text:'忽冷忽熱,情緒會隨對方反應起伏', color:'red' },
{ label:'B', text:'穩定但不太外露,理性大於感性', color:'gray' },
{ label:'C', text:'有什麼說什麼,情緒都寫在臉上', color:'yellow' },
{ label:'D', text:'保持一定的距離感,習慣自己消化', color:'blue' }
]},
{ text:'朋友問你「最近感情如何」,你通常——', options:[
{ label:'A', text:'一股腦把最近的心情全部說出來', color:'red' },
{ label:'B', text:'簡單帶過,不太想深聊細節', color:'gray' },
{ label:'C', text:'很直接地分享開心或不開心', color:'yellow' },
{ label:'D', text:'回答得體面,但心裡想的不一定全說', color:'blue' }
]},
{ text:'你最害怕在感情裡變成——', options:[
{ label:'A', text:'情緒被對方牽著走,失去自己', color:'red' },
{ label:'B', text:'被說「太冷漠」、不懂表達', color:'gray' },
{ label:'C', text:'被說「太直接」、不夠成熟', color:'yellow' },
{ label:'D', text:'被說「太有距離感」、難以親近', color:'blue' }
]}
];
const progressEl = document.getElementById('progress');
const qCountEl = document.getElementById('qCount');
const qTextEl = document.getElementById('qText');
const optionsEl = document.getElementById('options');
const quizCardEl = document.getElementById('quizCard');
const resultEl = document.getElementById('result');
const resultColorEl = document.getElementById('resultColor');
const resultDescEl = document.getElementById('resultDesc');
const trailEl = document.getElementById('trail');
const retryBtn = document.getElementById('retryBtn');
let index = 0;
let answers = [];
let locked = false;
function buildDots(){
progressEl.innerHTML = '';
questions.forEach((_, i) => {
const d = document.createElement('div');
d.className = 'dot';
d.dataset.index = i;
progressEl.appendChild(d);
});
}
function refreshDots(){
const dots = progressEl.querySelectorAll('.dot');
dots.forEach((d, i) => {
d.classList.toggle('active', i === index);
if(answers[i]){
d.style.background = colorMeta[answers[i]].hex;
d.style.borderColor = colorMeta[answers[i]].hex;
} else {
d.style.background = 'transparent';
d.style.borderColor = 'rgba(43,29,36,.22)';
}
});
}
function renderQuestion(){
locked = false;
const q = questions[index];
qCountEl.textContent = (index + 1) + ' / ' + questions.length;
qTextEl.textContent = q.text;
optionsEl.innerHTML = '';
q.options.forEach(opt => {
const btn = document.createElement('button');
btn.className = 'option-btn';
btn.textContent = opt.label + '. ' + opt.text;
btn.addEventListener('click', () => selectOption(btn, opt.color));
optionsEl.appendChild(btn);
});
refreshDots();
}
function selectOption(btn, color){
if(locked) return;
locked = true;
btn.classList.add('selected');
optionsEl.querySelectorAll('.option-btn').forEach(b => b.disabled = true);
answers[index] = color;
refreshDots();
window.setTimeout(() => {
if(index < questions.length - 1){
index += 1;
renderQuestion();
} else {
showResult();
}
}, 420);
}
function showResult(){
const counts = { red:0, gray:0, yellow:0, blue:0 };
answers.forEach(c => counts[c]++);
let winner = answers[answers.length - 1];
let max = -1;
Object.keys(counts).forEach(c => {
if(counts[c] > max){ max = counts[c]; winner = c; }
});
const meta = colorMeta[winner];
resultEl.style.setProperty('--accent', meta.hex);
resultColorEl.textContent = meta.name + '色的人';
resultDescEl.textContent = meta.desc;
trailEl.innerHTML = '';
answers.forEach(c => {
const s = document.createElement('span');
s.style.background = colorMeta[c].hex;
trailEl.appendChild(s);
});
quizCardEl.hidden = true;
resultEl.hidden = false;
}
retryBtn.addEventListener('click', () => {
index = 0;
answers = [];
resultEl.hidden = true;
quizCardEl.hidden = false;
renderQuestion();
});
buildDots();
renderQuestion();
const subForm = document.getElementById('subForm');
const subNote = document.getElementById('subNote');
subForm.addEventListener('submit', (e) => {
e.preventDefault();
subNote.textContent = '謝謝訂閱,期待與你分享更多 🤍';
subForm.reset();
});
document.querySelectorAll('.card-flip').forEach(card => {
const toggle = () => card.classList.toggle('flipped');
card.addEventListener('click', toggle);
card.addEventListener('keydown', (e) => {
if(e.key === 'Enter' || e.key === ' '){
e.preventDefault();
toggle();
}
});
});
</script>
</body>
</html>