feat(md-bg): Add solid color background support
This commit is contained in:
parent
936ccb7433
commit
f337acd142
|
|
@ -168,17 +168,20 @@
|
||||||
```markdown
|
```markdown
|
||||||
:md-bg[./images/background.jpg]
|
:md-bg[./images/background.jpg]
|
||||||
:md-bg[./images/pattern.png]{fit="contain"}
|
:md-bg[./images/pattern.png]{fit="contain"}
|
||||||
|
:md-bg[#ff00dd]
|
||||||
|
:md-bg[rgb(100,200,50)]
|
||||||
```
|
```
|
||||||
|
|
||||||
**功能:**
|
**功能:**
|
||||||
- 将图片设置为当前文章卡片的背景
|
- 将图片设置为当前文章卡片的背景
|
||||||
|
- 支持纯色背景(CSS 颜色值)
|
||||||
- 自动覆盖整个卡片区域
|
- 自动覆盖整个卡片区域
|
||||||
|
|
||||||
**属性:**
|
**属性:**
|
||||||
|
|
||||||
| 属性 | 类型 | 默认值 | 说明 |
|
| 属性 | 类型 | 默认值 | 说明 |
|
||||||
|------|------|--------|------|
|
|------|------|--------|------|
|
||||||
| `fit` | `cover` \| `contain` \| `fill` \| `none` \| `scale-down` | `cover` | 背景适配方式 |
|
| `fit` | `cover` \| `contain` \| `fill` \| `none` \| `scale-down` | `cover` | 背景适配方式(仅图片时生效) |
|
||||||
|
|
||||||
**示例:**
|
**示例:**
|
||||||
|
|
||||||
|
|
@ -188,6 +191,14 @@
|
||||||
# 地牢探险
|
# 地牢探险
|
||||||
|
|
||||||
这里是地牢的描述内容...
|
这里是地牢的描述内容...
|
||||||
|
|
||||||
|
:md-bg[#2a1a3a]
|
||||||
|
|
||||||
|
# 暗紫色背景
|
||||||
|
|
||||||
|
:md-bg[rgb(200,50,50)]
|
||||||
|
|
||||||
|
# 红色背景
|
||||||
```
|
```
|
||||||
|
|
||||||
### 📍 标记组件 (md-pins)
|
### 📍 标记组件 (md-pins)
|
||||||
|
|
|
||||||
|
|
@ -7,10 +7,17 @@ export interface BgProps {
|
||||||
fit?: "cover" | "contain" | "fill" | "none" | "scale-down";
|
fit?: "cover" | "contain" | "fill" | "none" | "scale-down";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function isImagePath(value: string): boolean {
|
||||||
|
return (
|
||||||
|
/^(\.{0,2}\/|[a-zA-Z]:\\|https?:\/\/)/i.test(value) ||
|
||||||
|
/\.(png|jpg|jpeg|gif|svg|webp|bmp)(\?|$)/i.test(value)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
customElement("md-bg", { fit: "cover" }, (props, { element }) => {
|
customElement("md-bg", { fit: "cover" }, (props, { element }) => {
|
||||||
noShadowDOM();
|
noShadowDOM();
|
||||||
|
|
||||||
const rawSrc = element?.textContent?.trim() || "";
|
const rawValue = element?.textContent?.trim() || "";
|
||||||
|
|
||||||
if (element) {
|
if (element) {
|
||||||
element.textContent = "";
|
element.textContent = "";
|
||||||
|
|
@ -20,17 +27,24 @@ customElement("md-bg", { fit: "cover" }, (props, { element }) => {
|
||||||
const articlePath =
|
const articlePath =
|
||||||
element?.closest("article[data-src]")?.getAttribute("data-src") || "";
|
element?.closest("article[data-src]")?.getAttribute("data-src") || "";
|
||||||
|
|
||||||
const resolvedSrc = resolvePath(articlePath, rawSrc);
|
const isImage = isImagePath(rawValue);
|
||||||
|
|
||||||
|
const styles: Partial<CSSStyleDeclaration> = {} as any;
|
||||||
|
|
||||||
|
if (isImage) {
|
||||||
|
const resolvedSrc = resolvePath(articlePath, rawValue);
|
||||||
|
styles.backgroundImage = `url(${resolvedSrc})`;
|
||||||
|
styles.backgroundSize = props.fit || "cover";
|
||||||
|
styles.backgroundPosition = "center";
|
||||||
|
styles.backgroundRepeat = "no-repeat";
|
||||||
|
} else {
|
||||||
|
styles.backgroundColor = rawValue || undefined;
|
||||||
|
}
|
||||||
|
|
||||||
const handle = registerStyle({
|
const handle = registerStyle({
|
||||||
key: "backgroundImage",
|
key: "backgroundImage",
|
||||||
article: articleEl,
|
article: articleEl,
|
||||||
styles: {
|
styles,
|
||||||
backgroundImage: `url(${resolvedSrc})`,
|
|
||||||
backgroundSize: props.fit || "cover",
|
|
||||||
backgroundPosition: "center",
|
|
||||||
backgroundRepeat: "no-repeat",
|
|
||||||
} as any,
|
|
||||||
});
|
});
|
||||||
|
|
||||||
onCleanup(() => handle.dispose());
|
onCleanup(() => handle.dispose());
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue