悬浮Yaml区的CSS,使Front matter悬浮显示

如图所示,悬浮Yaml区的CSS,使Front matter悬浮显示。可根据自己的需求,调整参数
屏幕录制-2025-07-09-14-28-38

/* =================== 浮动式YAML元数据 =================== */
/* 整体容器样式 - 修复悬停区域问题 */
.metadata-container {
    position: absolute;      /* 绝对定位脱离文档流 */
    top: 5%;                /* 距离顶部5%位置 */
    left: 88%;              /* 默认靠右显示(距离左侧) */
    min-width: 59%;         /* 最小宽度 */
    max-width: 59%;         /* 最大宽度 */
    padding: 1px 1px;       /* 内边距 */
    border: 1px solid transparent; /* 透明边框(为悬停效果预留) */
    border-radius: var(--radius-m); /* 使用主题定义的圆角 */
    font-size: var(--font-ui-big); /* 使用主题大字体 */
    z-index: 500;           /* 确保悬浮在其他内容上方 */
    transition: all 0.4s ease; /* 所有属性添加0.2秒渐变效果 */
    background-color: hsla(var(--color-accent-hsl), 0.01); /* 半透明背景 */
    backdrop-filter: blur(10px); /* 背景模糊效果 */
    
    /* 关键修复:确保容器包含所有子元素 */
    overflow: visible !important; /* 允许内容溢出容器 */
    contain: layout style paint !important; /* 优化渲染性能 */
}

/* 悬停状态 - 包含下拉菜单区域 */
.metadata-container:hover, 
.metadata-container:focus-within, /* 当内部元素获得焦点时 */
.metadata-container:focus {       /* 容器本身获得焦点时 */
    background-color: hsla(var(--color-accent-hsl), 0.01); /* 保持半透明背景 */
    border: 1px solid var(--background-modifier-border); /* 显示边框 */
    box-shadow: 0 4px 12px rgba(0,0,0,0.08); /* 添加阴影 */
    left: 40%;  /* 悬停时左移,展开显示位置 */
}

/* 标题样式 */
.metadata-properties-title {
    display: block;         /* 块级显示 */
    padding: 1px 20px;      /* 内边距 */
    margin: 0;              /* 外边距清零 */
    font-weight: 600;       /* 加粗字体 */
    font-size: var(--font-smaller); /* 较小字体 */
    color: var(--text-accent); /* 使用主题强调色 */
    border: 1px solid hsla(var(--color-accent-hsl), 0.2); /* 半透明边框 */
    background-color: hsla(var(--color-accent-hsl), 0.1); /* 半透明背景 */
    border-radius: var(--radius-m); /* 圆角 */
    transition: all 0.2s ease; /* 过渡动画 */
    cursor: default;        /* 默认光标(非可点击) */
    width: fit-content;     /* 宽度自适应内容 */
}

/* 悬停时的标题样式 */
.metadata-container:hover .metadata-properties-title,
.metadata-container:focus .metadata-properties-title,
.metadata-container:focus-within .metadata-properties-title {
    border: none;           /* 移除边框 */
    background-color: transparent; /* 透明背景 */
    color: var(--text-normal); /* 使用正常文本颜色 */
    padding: 0;             /* 移除内边距 */
    margin-bottom: 12px;    /* 底部外边距 */
}

/* 标题前的文本 */
.metadata-container:hover .metadata-properties-title::before,
.metadata-container:focus .metadata-properties-title::before,
.metadata-container:focus-within .metadata-properties-title::before {
    content: "属性: ";       /* 添加前缀文本 */
    font-weight: normal;    /* 正常字重 */
    color: var(--text-faint); /* 使用弱化文本色 */
}

/* 内容区域默认隐藏 */
.metadata-content {
    display: none;          /* 初始隐藏内容 */
    position: relative;     /* 相对定位(为子元素定位参考) */
}

/* 悬停时显示内容区域 */
.metadata-container:hover .metadata-content,
.metadata-container:focus .metadata-content,
.metadata-container:focus-within .metadata-content {
    display: block;         /* 显示内容区域 */
}

/* 属性项样式 */
.metadata-property {
    display: flex;          /* 弹性布局 */
    padding: 8px 0;         /* 垂直内边距 */
    border-bottom: 1px solid var(--background-modifier-border); /* 底部分隔线 */
    transition: all 0.2s ease; /* 过渡动画 */
    position: relative;     /* 相对定位 */
}

.metadata-property:last-child {
    border-bottom: none;    /* 最后一项无底部分隔线 */
}

.metadata-property:hover {
    background-color: hsla(var(--color-accent-hsl), 0.05); /* 悬停背景色 */
    border-radius: var(--radius-s); /* 圆角 */
    padding: 8px;           /* 增加内边距 */
    margin: 0 -8px;         /* 负外边距扩展悬停区域 */
}

.metadata-property-key {
    min-width: 100px;       /* 键名最小宽度 */
    font-weight: 500;       /* 中等字重 */
    font-size: var(--font-big); /* 大字体 */
    color: var(--text-normal); /* 正常文本色 */
}

.metadata-property-key::after {
    content: ':';           /* 添加冒号后缀 */
    margin-right: 8px;      /* 右侧间距 */
    color: var(--text-faint); /* 弱化文本色 */
}

.metadata-property-value {
    flex: 1;                /* 占据剩余空间 */
    font-size: var(--font-big); /* 大字体 */
}

/* 标签样式 */
.multi-select-pill {
    display: inline-block;  /* 行内块显示 */
    background: hsla(var(--color-accent-hsl), 0.1); /* 半透明背景 */
    color: var(--color-accent); /* 强调色文本 */
    border-radius: var(--radius-s); /* 小圆角 */
    padding: 3px 8px;       /* 内边距 */
    margin: 2px 4px 2px 0;  /* 外边距 */
    font-size: var(--font-big); /* 大字体 */
    border: 1px solid hsla(var(--color-accent-hsl), 0.3); /* 半透明边框 */
}

/* 下拉菜单容器  */
.metadata-content .multi-select-container {
    position: relative;     /* 相对定位 */
    z-index: 600;           /* 高于容器层级 */
    display: inline-block;  /* 行内块显示 */
}

.metadata-content .multi-select-dropdown {
    position: absolute;     /* 绝对定位 */
    top: 100%;              /* 从容器底部开始 */
    left: 0;                /* 左侧对齐 */
    z-index: 700;           /* 最高层级 */
    width: auto;            /* 自适应宽度 */
    min-width: 100%;        /* 最小宽度100% */
    background: var(--background-primary); /* 使用主题背景色 */
    border: 1px solid var(--background-modifier-border); /* 边框 */
    border-radius: var(--radius-m); /* 圆角 */
    box-shadow: 0 4px 12px rgba(0,0,0,0.15); /* 阴影 */
    margin-top: 4px;        /* 顶部间距 */
}

/* 确保下拉菜单被视为容器的一部分 */
.metadata-container .multi-select-dropdown {
    position: absolute;     /* 绝对定位 */
    top: 100%;              /* 从容器底部开始 */
    left: 0;                /* 左侧对齐 */
}

/* 防止下拉菜单关闭  */
.metadata-container:has(.multi-select-dropdown:hover) {
    left: 40% !important;   /* 保持展开位置 */
    background-color: hsla(var(--color-accent-hsl), 0.01) !important; /* 背景 */
    border: 1px solid var(--background-modifier-border) !important; /* 边框 */
    box-shadow: 0 4px 12px rgba(0,0,0,0.08) !important; /* 阴影 */
}

.metadata-container:has(.multi-select-dropdown:hover) .metadata-content {
    display: block !important; /* 保持内容显示 */
}

/* 使用:focus-within保持状态 */
.metadata-container:has(.multi-select-dropdown:focus-within) {
    left: 40% !important;   /* 保持展开位置 */
    background-color: hsla(var(--color-accent-hsl), 0.01) !important; /* 背景 */
    border: 1px solid var(--background-modifier-border) !important; /* 边框 */
    box-shadow: 0 4px 12px rgba(0,0,0,0.08) !important; /* 阴影 */
}

.metadata-container:has(.multi-select-dropdown:focus-within) .metadata-content {
    display: block !important; /* 保持内容显示 */
}
4 个赞

挺好,巧妙地利用了右键菜单时,容器中也大多有元素处于聚焦状态这一点来控制,弥补了同类代码右键菜单掉 hover 的问题。当然,同理,在二者不同步的情况下,还是可以复现的。见图。

20250709_151502

1 个赞

更新了一下,之前css会把编辑区撑开。

/* =================== 浮动式YAML元数据 =================== */
/* 整体容器样式 - 修复悬停区域问题 */
.metadata-container {
    position: absolute;      /* 绝对定位脱离文档流 */
    top: 45px;                /* 距离顶部5%位置 */
    right: 0px;              /* 默认靠右显示 */
    min-width: 45px;         /* 收起时最小宽度 */
    max-width: 45px;         /* 收起时最大宽度 */
    padding: 1px 1px;       /* 内边距 */
    border: 1px solid transparent; /* 透明边框(为悬停效果预留) */
    border-radius: var(--radius-m); /* 使用主题定义的圆角 */
    font-size: var(--font-ui-big); /* 使用主题大字体 */
    z-index: 500;           /* 确保悬浮在其他内容上方 */
    transition: all 0.4s ease; /* 所有属性添加0.2秒渐变效果 */
    background-color: hsla(var(--color-accent-hsl), 0.01); /* 半透明背景 */
    backdrop-filter: blur(10px); /* 背景模糊效果 */
    
    /* 关键修复:确保容器包含所有子元素 */
    overflow: visible !important; /* 允许内容溢出容器 */
    contain: layout style paint !important; /* 优化渲染性能 */
}

/* 悬停状态 - 包含下拉菜单区域 */
.metadata-container:hover, 
.metadata-container:focus-within, /* 当内部元素获得焦点时 */
.metadata-container:focus {       /* 容器本身获得焦点时 */
    background-color: hsla(var(--color-accent-hsl), 0.01); /* 保持半透明背景 */
    border: 1px solid var(--background-modifier-border); /* 显示边框 */
    box-shadow: 0 4px 12px rgba(0,0,0,0.08); /* 添加阴影 */
    right: 5px;  /* 展开显示位置 */
    min-width: 60%;         /* 展开后最小宽度 */
    max-width: 60%;         /* 展开后最大宽度 */
}

/* 标题样式 */
.metadata-properties-title {
    display: block;         /* 块级显示 */
    padding: 1px 20px;      /* 内边距 */
    margin: 0;              /* 外边距清零 */
    font-weight: 600;       /* 加粗字体 */
    font-size: var(--font-smaller); /* 较小字体 */
    color: var(--text-accent); /* 使用主题强调色 */
    border: 1px solid hsla(var(--color-accent-hsl), 0.2); /* 半透明边框 */
    background-color: hsla(var(--color-accent-hsl), 0.1); /* 半透明背景 */
    border-radius: var(--radius-m); /* 圆角 */
    transition: all 0.2s ease; /* 过渡动画 */
    cursor: default;        /* 默认光标(非可点击) */
    width: fit-content;     /* 宽度自适应内容 */
}

/* 悬停时的标题样式 */
.metadata-container:hover .metadata-properties-title,
.metadata-container:focus .metadata-properties-title,
.metadata-container:focus-within .metadata-properties-title {
    border: none;           /* 移除边框 */
    background-color: transparent; /* 透明背景 */
    color: var(--text-normal); /* 使用正常文本颜色 */
    padding: 0;             /* 移除内边距 */
    margin-bottom: 12px;    /* 底部外边距 */
}

/* 标题前的文本 */
.metadata-container:hover .metadata-properties-title::before,
.metadata-container:focus .metadata-properties-title::before,
.metadata-container:focus-within .metadata-properties-title::before {
    content: "属性: ";       /* 添加前缀文本 */
    font-weight: normal;    /* 正常字重 */
    color: var(--text-faint); /* 使用弱化文本色 */
}

/* 内容区域默认隐藏 */
.metadata-content {
    display: none;          /* 初始隐藏内容 */
    position: relative;     /* 相对定位(为子元素定位参考) */
}

/* 悬停时显示内容区域 */
.metadata-container:hover .metadata-content,
.metadata-container:focus .metadata-content,
.metadata-container:focus-within .metadata-content {
    display: block;         /* 显示内容区域 */
}

/* 属性项样式 */
.metadata-property {
    display: flex;          /* 弹性布局 */
    padding: 8px 0;         /* 垂直内边距 */
    border-bottom: 1px solid var(--background-modifier-border); /* 底部分隔线 */
    transition: all 0.2s ease; /* 过渡动画 */
    position: relative;     /* 相对定位 */
}

.metadata-property:last-child {
    border-bottom: none;    /* 最后一项无底部分隔线 */
}

.metadata-property:hover {
    background-color: hsla(var(--color-accent-hsl), 0.05); /* 悬停背景色 */
    border-radius: var(--radius-s); /* 圆角 */
    padding: 8px;           /* 增加内边距 */
    margin: 0 -8px;         /* 负外边距扩展悬停区域 */
}

.metadata-property-key {
    min-width: 100px;       /* 键名最小宽度 */
    font-weight: 500;       /* 中等字重 */
    font-size: var(--font-big); /* 大字体 */
    color: var(--text-normal); /* 正常文本色 */
}

.metadata-property-key::after {
    content: ':';           /* 添加冒号后缀 */
    margin-right: 8px;      /* 右侧间距 */
    color: var(--text-faint); /* 弱化文本色 */
}

.metadata-property-value {
    flex: 1;                /* 占据剩余空间 */
    font-size: var(--font-big); /* 大字体 */
}

/* 标签样式 */
.multi-select-pill {
    display: inline-block;  /* 行内块显示 */
    background: hsla(var(--color-accent-hsl), 0.1); /* 半透明背景 */
    color: var(--color-accent); /* 强调色文本 */
    border-radius: var(--radius-s); /* 小圆角 */
    padding: 3px 8px;       /* 内边距 */
    margin: 2px 4px 2px 0;  /* 外边距 */
    font-size: var(--font-big); /* 大字体 */
    border: 1px solid hsla(var(--color-accent-hsl), 0.3); /* 半透明边框 */
}

/* 下拉菜单容器  */
.metadata-content .multi-select-container {
    position: relative;     /* 相对定位 */
    z-index: 600;           /* 高于容器层级 */
    display: inline-block;  /* 行内块显示 */
}

.metadata-content .multi-select-dropdown {
    position: absolute;     /* 绝对定位 */
    top: 100%;              /* 从容器底部开始 */
    left: 0;                /* 左侧对齐 */
    z-index: 700;           /* 最高层级 */
    width: auto;            /* 自适应宽度 */
    min-width: 100%;        /* 最小宽度100% */
    background: var(--background-primary); /* 使用主题背景色 */
    border: 1px solid var(--background-modifier-border); /* 边框 */
    border-radius: var(--radius-m); /* 圆角 */
    box-shadow: 0 4px 12px rgba(0,0,0,0.15); /* 阴影 */
    margin-top: 4px;        /* 顶部间距 */
}

/* 确保下拉菜单被视为容器的一部分 */
.metadata-container .multi-select-dropdown {
    position: absolute;     /* 绝对定位 */
    top: 100%;              /* 从容器底部开始 */
    left: 0;                /* 左侧对齐 */
}

/* 防止下拉菜单关闭  */
.metadata-container:has(.multi-select-dropdown:hover) {
    left: 40% !important;   /* 保持展开位置 */
    background-color: hsla(var(--color-accent-hsl), 0.01) !important; /* 背景 */
    border: 1px solid var(--background-modifier-border) !important; /* 边框 */
    box-shadow: 0 4px 12px rgba(0,0,0,0.08) !important; /* 阴影 */
}

.metadata-container:has(.multi-select-dropdown:hover) .metadata-content {
    display: block !important; /* 保持内容显示 */
}

/* 使用:focus-within保持状态 */
.metadata-container:has(.multi-select-dropdown:focus-within) {
    left: 40% !important;   /* 保持展开位置 */
    background-color: hsla(var(--color-accent-hsl), 0.01) !important; /* 背景 */
    border: 1px solid var(--background-modifier-border) !important; /* 边框 */
    box-shadow: 0 4px 12px rgba(0,0,0,0.08) !important; /* 阴影 */
}

.metadata-container:has(.multi-select-dropdown:focus-within) .metadata-content {
    display: block !important; /* 保持内容显示 */
}```
1 个赞