2026-01-18 10:24:35 +08:00
|
|
|
|
<template>
|
|
|
|
|
|
<div class="css-props-ref">
|
|
|
|
|
|
<div class="intro">
|
2026-01-18 12:21:49 +08:00
|
|
|
|
CSS
|
|
|
|
|
|
属性就像装修队的“施工指令”。常用的其实只有几十个,这里有一份“装修菜单”供你参考:
|
2026-01-18 10:24:35 +08:00
|
|
|
|
</div>
|
2026-01-18 12:21:49 +08:00
|
|
|
|
|
2026-01-18 10:24:35 +08:00
|
|
|
|
<div class="categories">
|
2026-02-18 17:38:10 +08:00
|
|
|
|
<div
|
|
|
|
|
|
v-for="(cat, index) in categories"
|
|
|
|
|
|
:key="index"
|
|
|
|
|
|
class="category"
|
|
|
|
|
|
>
|
|
|
|
|
|
<div class="cat-title">
|
|
|
|
|
|
{{ cat.title }}
|
|
|
|
|
|
</div>
|
2026-01-18 10:24:35 +08:00
|
|
|
|
<div class="props-grid">
|
2026-01-18 12:21:49 +08:00
|
|
|
|
<div
|
|
|
|
|
|
v-for="prop in cat.props"
|
2026-01-18 10:24:35 +08:00
|
|
|
|
:key="prop.name"
|
|
|
|
|
|
class="prop-item"
|
|
|
|
|
|
:class="{ active: activeProp && activeProp.name === prop.name }"
|
2026-02-18 17:38:10 +08:00
|
|
|
|
@click="activeProp = prop"
|
2026-01-18 10:24:35 +08:00
|
|
|
|
>
|
2026-02-18 17:38:10 +08:00
|
|
|
|
<div class="prop-name">
|
|
|
|
|
|
{{ prop.name }}
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="prop-desc">
|
|
|
|
|
|
{{ prop.desc }}
|
|
|
|
|
|
</div>
|
2026-01-18 10:24:35 +08:00
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
2026-02-18 17:38:10 +08:00
|
|
|
|
<div
|
|
|
|
|
|
v-if="activeProp"
|
|
|
|
|
|
class="prop-detail"
|
|
|
|
|
|
>
|
2026-01-18 10:24:35 +08:00
|
|
|
|
<div class="detail-header">
|
|
|
|
|
|
<span class="detail-name">{{ activeProp.name }}</span>
|
|
|
|
|
|
<span class="detail-cat-badge">{{ activeProp.categoryLabel }}</span>
|
|
|
|
|
|
</div>
|
2026-02-18 17:38:10 +08:00
|
|
|
|
<div class="detail-desc">
|
|
|
|
|
|
{{ activeProp.fullDesc }}
|
|
|
|
|
|
</div>
|
2026-01-18 10:24:35 +08:00
|
|
|
|
<div class="detail-code">
|
2026-02-18 17:38:10 +08:00
|
|
|
|
<div class="code-label">
|
|
|
|
|
|
示例代码:
|
|
|
|
|
|
</div>
|
2026-01-18 10:24:35 +08:00
|
|
|
|
<pre><code>{{ activeProp.example }}</code></pre>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
2026-02-18 17:38:10 +08:00
|
|
|
|
<div
|
|
|
|
|
|
v-else
|
|
|
|
|
|
class="prop-detail empty"
|
|
|
|
|
|
>
|
|
|
|
|
|
点击上面的属性看看它能做什么 👆
|
|
|
|
|
|
</div>
|
2026-01-18 10:24:35 +08:00
|
|
|
|
</div>
|
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
|
|
<script setup>
|
|
|
|
|
|
import { ref } from 'vue'
|
|
|
|
|
|
|
|
|
|
|
|
const activeProp = ref(null)
|
|
|
|
|
|
|
|
|
|
|
|
const categories = [
|
|
|
|
|
|
{
|
|
|
|
|
|
title: '📝 文字与排版',
|
|
|
|
|
|
props: [
|
2026-01-18 12:21:49 +08:00
|
|
|
|
{
|
|
|
|
|
|
name: 'color',
|
|
|
|
|
|
desc: '文字颜色',
|
|
|
|
|
|
categoryLabel: '文字',
|
|
|
|
|
|
fullDesc:
|
|
|
|
|
|
'改变文字的颜色。可以使用英文单词(red)、十六进制(#ff0000)或RGB值。',
|
|
|
|
|
|
example: 'color: #333333;'
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
name: 'font-size',
|
|
|
|
|
|
desc: '字号大小',
|
|
|
|
|
|
categoryLabel: '文字',
|
|
|
|
|
|
fullDesc: '设置文字的大小。常用单位是 px (像素) 或 rem。',
|
|
|
|
|
|
example: 'font-size: 16px;'
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
name: 'font-weight',
|
|
|
|
|
|
desc: '字体粗细',
|
|
|
|
|
|
categoryLabel: '文字',
|
|
|
|
|
|
fullDesc: '设置文字的粗细。bold 是加粗,normal 是正常。',
|
|
|
|
|
|
example: 'font-weight: bold;'
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
name: 'text-align',
|
|
|
|
|
|
desc: '对齐方式',
|
|
|
|
|
|
categoryLabel: '排版',
|
|
|
|
|
|
fullDesc:
|
|
|
|
|
|
'设置文字水平对齐方式:左对齐(left)、居中(center)、右对齐(right)。',
|
|
|
|
|
|
example: 'text-align: center;'
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
name: 'line-height',
|
|
|
|
|
|
desc: '行高',
|
|
|
|
|
|
categoryLabel: '排版',
|
|
|
|
|
|
fullDesc: '设置行间距。通常设为 1.5 左右让阅读更舒服。',
|
|
|
|
|
|
example: 'line-height: 1.5;'
|
|
|
|
|
|
}
|
2026-01-18 10:24:35 +08:00
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
title: '📦 盒子与大小',
|
|
|
|
|
|
props: [
|
2026-01-18 12:21:49 +08:00
|
|
|
|
{
|
|
|
|
|
|
name: 'width / height',
|
|
|
|
|
|
desc: '宽 / 高',
|
|
|
|
|
|
categoryLabel: '尺寸',
|
|
|
|
|
|
fullDesc: '设置元素的宽度和高度。',
|
|
|
|
|
|
example: 'width: 100px;\nheight: 50px;'
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
name: 'padding',
|
|
|
|
|
|
desc: '内边距',
|
|
|
|
|
|
categoryLabel: '间距',
|
|
|
|
|
|
fullDesc:
|
|
|
|
|
|
'盒子内部的空间(内容距离边框的距离)。像填充泡沫一样撑大盒子。',
|
|
|
|
|
|
example: 'padding: 20px;'
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
name: 'margin',
|
|
|
|
|
|
desc: '外边距',
|
|
|
|
|
|
categoryLabel: '间距',
|
|
|
|
|
|
fullDesc: '盒子外部的空间(盒子与其他元素之间的距离)。',
|
|
|
|
|
|
example: 'margin: 20px;'
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
name: 'background',
|
|
|
|
|
|
desc: '背景',
|
|
|
|
|
|
categoryLabel: '外观',
|
|
|
|
|
|
fullDesc: '设置背景颜色或背景图片。',
|
|
|
|
|
|
example: 'background: #f0f0f0;'
|
|
|
|
|
|
}
|
2026-01-18 10:24:35 +08:00
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
title: '🎨 边框与装饰',
|
|
|
|
|
|
props: [
|
2026-01-18 12:21:49 +08:00
|
|
|
|
{
|
|
|
|
|
|
name: 'border',
|
|
|
|
|
|
desc: '边框',
|
|
|
|
|
|
categoryLabel: '边框',
|
|
|
|
|
|
fullDesc: '设置边框的粗细、样式和颜色。',
|
|
|
|
|
|
example: 'border: 1px solid #ccc;'
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
name: 'border-radius',
|
|
|
|
|
|
desc: '圆角',
|
|
|
|
|
|
categoryLabel: '边框',
|
|
|
|
|
|
fullDesc: '让盒子的角变圆润。现在的按钮通常都有点圆角。',
|
2026-02-14 20:23:34 +08:00
|
|
|
|
example: 'border-radius: 6px;'
|
2026-01-18 12:21:49 +08:00
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
name: 'box-shadow',
|
|
|
|
|
|
desc: '阴影',
|
|
|
|
|
|
categoryLabel: '装饰',
|
|
|
|
|
|
fullDesc: '给盒子添加阴影效果,增加立体感和层次感。',
|
|
|
|
|
|
example: 'box-shadow: 0 4px 6px rgba(0,0,0,0.1);'
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
name: 'opacity',
|
|
|
|
|
|
desc: '透明度',
|
|
|
|
|
|
categoryLabel: '装饰',
|
|
|
|
|
|
fullDesc: '设置元素的透明度,0 是全透明(看不见但还在),1 是不透明。',
|
|
|
|
|
|
example: 'opacity: 0.8;'
|
|
|
|
|
|
}
|
2026-01-18 10:24:35 +08:00
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
title: '📐 布局与定位',
|
|
|
|
|
|
props: [
|
2026-01-18 12:21:49 +08:00
|
|
|
|
{
|
|
|
|
|
|
name: 'display',
|
|
|
|
|
|
desc: '显示模式',
|
|
|
|
|
|
categoryLabel: '布局',
|
|
|
|
|
|
fullDesc:
|
|
|
|
|
|
'决定盒子怎么摆。block(独占一行), flex(弹性布局), none(隐藏)。',
|
|
|
|
|
|
example: 'display: flex;'
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
name: 'position',
|
|
|
|
|
|
desc: '定位方式',
|
|
|
|
|
|
categoryLabel: '定位',
|
|
|
|
|
|
fullDesc:
|
|
|
|
|
|
'决定盒子怎么定位。relative(相对), absolute(绝对), fixed(固定在屏幕)。',
|
|
|
|
|
|
example: 'position: absolute;\ntop: 0;\nleft: 0;'
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
name: 'z-index',
|
|
|
|
|
|
desc: '层级',
|
|
|
|
|
|
categoryLabel: '定位',
|
|
|
|
|
|
fullDesc: '决定谁叠在谁上面。数字越大越靠上。',
|
|
|
|
|
|
example: 'z-index: 100;'
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
name: 'cursor',
|
|
|
|
|
|
desc: '鼠标手势',
|
|
|
|
|
|
categoryLabel: '交互',
|
|
|
|
|
|
fullDesc: '鼠标移上去变成什么样。pointer(小手), text(输入光标)。',
|
|
|
|
|
|
example: 'cursor: pointer;'
|
|
|
|
|
|
}
|
2026-01-18 10:24:35 +08:00
|
|
|
|
]
|
|
|
|
|
|
}
|
|
|
|
|
|
]
|
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
|
|
<style scoped>
|
|
|
|
|
|
.css-props-ref {
|
|
|
|
|
|
border: 1px solid var(--vp-c-divider);
|
2026-02-14 20:23:34 +08:00
|
|
|
|
border-radius: 6px;
|
2026-01-18 10:24:35 +08:00
|
|
|
|
background: var(--vp-c-bg-soft);
|
|
|
|
|
|
padding: 20px;
|
|
|
|
|
|
margin: 20px 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.intro {
|
|
|
|
|
|
font-size: 14px;
|
|
|
|
|
|
color: var(--vp-c-text-2);
|
|
|
|
|
|
margin-bottom: 16px;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.categories {
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
flex-direction: column;
|
|
|
|
|
|
gap: 16px;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.cat-title {
|
|
|
|
|
|
font-size: 13px;
|
|
|
|
|
|
font-weight: 700;
|
|
|
|
|
|
color: var(--vp-c-text-1);
|
|
|
|
|
|
margin-bottom: 8px;
|
|
|
|
|
|
border-left: 3px solid var(--vp-c-brand);
|
|
|
|
|
|
padding-left: 8px;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.props-grid {
|
|
|
|
|
|
display: grid;
|
|
|
|
|
|
grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
|
|
|
|
|
|
gap: 8px;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.prop-item {
|
|
|
|
|
|
background: var(--vp-c-bg);
|
|
|
|
|
|
border: 1px solid var(--vp-c-divider);
|
|
|
|
|
|
border-radius: 6px;
|
|
|
|
|
|
padding: 8px 12px;
|
|
|
|
|
|
cursor: pointer;
|
|
|
|
|
|
transition: all 0.2s;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.prop-item:hover {
|
|
|
|
|
|
border-color: var(--vp-c-brand);
|
|
|
|
|
|
transform: translateY(-1px);
|
2026-01-18 12:21:49 +08:00
|
|
|
|
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
|
2026-01-18 10:24:35 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.prop-item.active {
|
|
|
|
|
|
border-color: var(--vp-c-brand);
|
|
|
|
|
|
background: var(--vp-c-brand-dimm);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.prop-name {
|
|
|
|
|
|
font-family: var(--vp-font-family-mono);
|
|
|
|
|
|
font-size: 13px;
|
|
|
|
|
|
color: var(--vp-c-brand);
|
|
|
|
|
|
font-weight: 600;
|
|
|
|
|
|
margin-bottom: 2px;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.prop-desc {
|
|
|
|
|
|
font-size: 12px;
|
|
|
|
|
|
color: var(--vp-c-text-2);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.prop-detail {
|
|
|
|
|
|
margin-top: 20px;
|
|
|
|
|
|
background: var(--vp-c-bg);
|
|
|
|
|
|
border: 1px solid var(--vp-c-divider);
|
2026-02-14 20:23:34 +08:00
|
|
|
|
border-radius: 6px;
|
2026-01-18 10:24:35 +08:00
|
|
|
|
padding: 16px;
|
|
|
|
|
|
animation: fadeIn 0.3s ease;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.prop-detail.empty {
|
|
|
|
|
|
text-align: center;
|
|
|
|
|
|
color: var(--vp-c-text-3);
|
|
|
|
|
|
font-size: 13px;
|
|
|
|
|
|
border-style: dashed;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.detail-header {
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
align-items: center;
|
|
|
|
|
|
gap: 10px;
|
|
|
|
|
|
margin-bottom: 8px;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.detail-name {
|
|
|
|
|
|
font-family: var(--vp-font-family-mono);
|
|
|
|
|
|
font-size: 16px;
|
|
|
|
|
|
font-weight: 700;
|
|
|
|
|
|
color: var(--vp-c-text-1);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.detail-cat-badge {
|
|
|
|
|
|
font-size: 11px;
|
|
|
|
|
|
background: var(--vp-c-bg-soft);
|
|
|
|
|
|
border: 1px solid var(--vp-c-divider);
|
|
|
|
|
|
padding: 2px 6px;
|
|
|
|
|
|
border-radius: 4px;
|
|
|
|
|
|
color: var(--vp-c-text-2);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.detail-desc {
|
|
|
|
|
|
font-size: 14px;
|
|
|
|
|
|
color: var(--vp-c-text-2);
|
|
|
|
|
|
line-height: 1.5;
|
|
|
|
|
|
margin-bottom: 12px;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.detail-code {
|
|
|
|
|
|
background: var(--vp-c-bg-alt);
|
|
|
|
|
|
padding: 12px;
|
|
|
|
|
|
border-radius: 6px;
|
|
|
|
|
|
border: 1px solid var(--vp-c-divider);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.code-label {
|
|
|
|
|
|
font-size: 11px;
|
|
|
|
|
|
color: var(--vp-c-text-3);
|
|
|
|
|
|
margin-bottom: 4px;
|
|
|
|
|
|
font-weight: 600;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pre {
|
|
|
|
|
|
margin: 0;
|
|
|
|
|
|
background: transparent !important;
|
|
|
|
|
|
padding: 0 !important;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
code {
|
|
|
|
|
|
font-family: var(--vp-font-family-mono);
|
|
|
|
|
|
font-size: 13px;
|
|
|
|
|
|
color: var(--vp-c-text-1);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@keyframes fadeIn {
|
2026-01-18 12:21:49 +08:00
|
|
|
|
from {
|
|
|
|
|
|
opacity: 0;
|
|
|
|
|
|
transform: translateY(5px);
|
|
|
|
|
|
}
|
|
|
|
|
|
to {
|
|
|
|
|
|
opacity: 1;
|
|
|
|
|
|
transform: translateY(0);
|
|
|
|
|
|
}
|
2026-01-18 10:24:35 +08:00
|
|
|
|
}
|
|
|
|
|
|
</style>
|