@wu529778790/floating-ad 0.0.0-stage → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +258 -2
- package/dist/floating-ad.css +254 -0
- package/dist/floating-ad.wc.js +391 -0
- package/dist/index.d.cts +88 -0
- package/dist/index.d.ts +88 -0
- package/dist/index.esm.js +208 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/index.umd.cjs +235 -0
- package/dist/index.umd.cjs.map +1 -0
- package/dist/index.umd.js +242 -0
- package/package.json +48 -4
package/README.md
CHANGED
|
@@ -1,3 +1,259 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @wu529778790/floating-ad
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
极简、零依赖的广告浮窗组件:在网站左侧(或任意边角)常驻一张广告卡片,支持多张图片广告混排、点击跳转、关闭后刷新重现。
|
|
4
|
+
|
|
5
|
+
与 [`@wu529778790/floating-qr`](../floating-qr) 视觉同源:同一套圆角卡片、半透明背景、右上角关闭按钮、跟随系统深浅色,左边挂广告、右边挂二维码可以完全对齐。
|
|
6
|
+
|
|
7
|
+
## 特性
|
|
8
|
+
|
|
9
|
+
- 🧩 Web Component 封装,一行 `<script>` 注入、改一处全站生效
|
|
10
|
+
- 🎯 声明式标签 `<floating-ad>`,属性改动即时热更新
|
|
11
|
+
- 🖼 图片固定 120×120 方形(与右侧公众号浮窗的二维码同尺寸),`cover` / `contain` 可选,多张混排自动分隔线
|
|
12
|
+
- 🏷 可选的「广告」标识(默认不显示),开启后压首图左上角、不占排版行高
|
|
13
|
+
- 🎨 CSS 变量主题化(`--fa-*`),一行覆盖背景色 / 强调色 / 圆角 / 边框
|
|
14
|
+
- 📱 移动端小一号展示(卡片 140 / 图片 112),默认落在左下角,可配置隐藏
|
|
15
|
+
- 🧹 关闭即消失,默认不记住状态(刷新必重新出现)
|
|
16
|
+
- 🚫 没有广告数据时不渲染任何节点,不会留一张空白卡片
|
|
17
|
+
- 📦 NPM + CDN 双通道引入,TypeScript 类型齐全
|
|
18
|
+
|
|
19
|
+
## 安装
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
pnpm add @wu529778790/floating-ad
|
|
23
|
+
# 或 npm i @wu529778790/floating-ad / yarn add @wu529778790/floating-ad
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## 快速开始(推荐 · Web Component)
|
|
27
|
+
|
|
28
|
+
### 方式一:CDN + 声明式标签(单条广告)
|
|
29
|
+
|
|
30
|
+
```html
|
|
31
|
+
<floating-ad
|
|
32
|
+
ad-src="https://.../ad.jpg"
|
|
33
|
+
ad-title="云服务器 · 2 核 4G"
|
|
34
|
+
ad-desc="新用户首年 99 元"
|
|
35
|
+
ad-href="https://..."
|
|
36
|
+
ad-badge="限时">
|
|
37
|
+
</floating-ad>
|
|
38
|
+
<script src="https://unpkg.com/@wu529778790/floating-ad@latest/dist/floating-ad.wc.js"></script>
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### 方式二:多条广告(`ads-json`)
|
|
42
|
+
|
|
43
|
+
```html
|
|
44
|
+
<floating-ad ads-json='[
|
|
45
|
+
{ "src": "https://.../a.jpg", "title": "云服务器特惠", "href": "https://..." },
|
|
46
|
+
{ "title": "周刊订阅", "desc": "每周一封,只讲有用的工具", "href": "https://..." }
|
|
47
|
+
]'></floating-ad>
|
|
48
|
+
<script src="https://unpkg.com/@wu529778790/floating-ad@latest/dist/floating-ad.wc.js"></script>
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### 方式三:全局配置(无标签时自动注入)
|
|
52
|
+
|
|
53
|
+
```html
|
|
54
|
+
<script>
|
|
55
|
+
window.__FLOATING_AD_OPTIONS__ = {
|
|
56
|
+
ads: [{ src: 'https://.../ad.jpg', title: '云服务器特惠', href: 'https://...' }],
|
|
57
|
+
position: 'left-center',
|
|
58
|
+
width: 180
|
|
59
|
+
}
|
|
60
|
+
</script>
|
|
61
|
+
<script src="https://unpkg.com/@wu529778790/floating-ad@latest/dist/floating-ad.wc.js"></script>
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
> **没有默认素材**:不传 `ads` / 全局配置时不会自动注入(避免空白广告卡片)。
|
|
65
|
+
> 不想自动注入:给 `<html>` 加 `data-fa-auto="false"`,此时只有页面中的 `<floating-ad>` 标签生效。
|
|
66
|
+
>
|
|
67
|
+
> 备选 CDN(GitHub 直连,push 即生效、不依赖 npm 发布):
|
|
68
|
+
> `https://cdn.jsdmirror.com/gh/wu529778790/components@main/cdn/floating-ad.wc.js`
|
|
69
|
+
>
|
|
70
|
+
> 上面的 unpkg 地址依赖 npm 包已发布;若该包在 npm 上尚不存在(unpkg 返回 404),请先用这条 GitHub 直连,发布之后 unpkg 自动可用。
|
|
71
|
+
|
|
72
|
+
### 方式四:NPM 双轨(React/Vue 项目照旧)
|
|
73
|
+
|
|
74
|
+
```ts
|
|
75
|
+
import FloatingAd from '@wu529778790/floating-ad'
|
|
76
|
+
import '@wu529778790/floating-ad/style.css'
|
|
77
|
+
|
|
78
|
+
new FloatingAd({
|
|
79
|
+
ads: [{ src: '/ad.jpg', title: '广告位招租', desc: '联系微信 xxx', href: '/' }]
|
|
80
|
+
})
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Web Component 属性
|
|
84
|
+
|
|
85
|
+
`<floating-ad>` 全部属性均可选,不设即用默认值。
|
|
86
|
+
|
|
87
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
88
|
+
| --- | --- | --- | --- |
|
|
89
|
+
| `position` | `string` | 桌面 `left-center`<br>移动 `left-bottom` | `left-center` / `left-bottom` / `left-top` / `right-center` / `right-bottom` / `right-top` |
|
|
90
|
+
| `width` | `number` | 桌面 150<br>移动 140 | 浮窗宽度(px) |
|
|
91
|
+
| `offset` | `number` | 桌面 16<br>移动 12 | 距视口边缘距离(px) |
|
|
92
|
+
| `close-persistence` | `boolean` | 关 | 打开时关闭写入 localStorage,刷新不再出现 |
|
|
93
|
+
| `hide-on-mobile` | `boolean` | 关 | `<768px` 时是否隐藏(默认展示小一号浮窗) |
|
|
94
|
+
| `z-index` | `number` | `9999` | 浮窗层级 |
|
|
95
|
+
| `ad-label` | `string` | 不显示 | 标识文案(压在首图左上角,不占行高);空值 / `true` 显示「广告」,`false` / `none` / `off` / `0` 关闭 |
|
|
96
|
+
| `image-fit` | `string` | `'cover'` | 图片填充方式:`cover` / `contain` |
|
|
97
|
+
| `image-size` | `number` | 桌面 120<br>移动 112 | 广告图片边长(px,正方形) |
|
|
98
|
+
| `ad-src` | `string` | - | 单条广告图片 URL(必填,缺省不渲染) |
|
|
99
|
+
| `ad-title` | `string` | - | 单条广告标题 |
|
|
100
|
+
| `ad-desc` | `string` | - | 单条广告副文案 |
|
|
101
|
+
| `ad-href` | `string` | - | 单条广告跳转链接 |
|
|
102
|
+
| `ad-target` | `string` | `'_blank'` | `_blank` / `_self` |
|
|
103
|
+
| `ad-badge` | `string` | - | 图片右上角角标,如「限时」 |
|
|
104
|
+
| `ads-json` | `string` | - | 多条广告的 JSON 数组,优先级高于 `ad-*` 单一属性 |
|
|
105
|
+
| `theme-bg` | `string` | 半透明白 | 背景色 |
|
|
106
|
+
| `theme-accent` | `string` | `#333` | 强调色(标题 / 角标) |
|
|
107
|
+
| `theme-radius` | `string` | `12px` | 圆角 |
|
|
108
|
+
| `theme-border` | `string` | `rgba(0,0,0,.1)` | 边框色 |
|
|
109
|
+
|
|
110
|
+
> 样式已隔离在 shadow DOM,外部可用 `--fa-*` 变量覆盖(见下文「自定义主题」)。
|
|
111
|
+
|
|
112
|
+
## JS API(NPM 双轨)
|
|
113
|
+
|
|
114
|
+
### `new FloatingAd(options, container?)`
|
|
115
|
+
|
|
116
|
+
**所有参数均可选**;没有有效广告时不渲染。
|
|
117
|
+
|
|
118
|
+
| 字段 | 类型 | 默认值 | 说明 |
|
|
119
|
+
| --- | --- | --- | --- |
|
|
120
|
+
| `ads` | `FloatingAdItem[]` | `[]` | 广告列表,见下 |
|
|
121
|
+
| `position` | `Position` | 桌面 `left-center`<br>移动 `left-bottom` | 位置 |
|
|
122
|
+
| `closePersistence` | `boolean` | `false` | `true` 时关闭写入 localStorage,刷新不再出现 |
|
|
123
|
+
| `hideOnMobile` | `boolean` | `true` | `<768px` 时不渲染 |
|
|
124
|
+
| `zIndex` | `number` | `9999` | 浮窗层级 |
|
|
125
|
+
| `adLabel` | `string \| false` | `false` | 标识文案,默认不显示;传字符串如 `'广告'` 显示 |
|
|
126
|
+
| `width` | `number` | 桌面 150<br>移动 140 | 宽度(px) |
|
|
127
|
+
| `offset` | `number` | 桌面 16<br>移动 12 | 距边缘(px) |
|
|
128
|
+
| `imageFit` | `'cover' \| 'contain'` | `'cover'` | 图片填充 |
|
|
129
|
+
| `imageSize` | `number` | 桌面 120<br>移动 112 | 广告图片边长(px,正方形) |
|
|
130
|
+
| `theme.bg` | `string` | 半透明白 | 背景色 |
|
|
131
|
+
| `theme.accent` | `string` | `#333` | 强调色 |
|
|
132
|
+
| `theme.radius` | `string` | `12px` | 圆角 |
|
|
133
|
+
| `theme.border` | `string` | `rgba(0,0,0,.1)` | 边框色 |
|
|
134
|
+
| `onClick` | `(ad, event) => void` | - | 点击广告回调(不阻止默认跳转) |
|
|
135
|
+
|
|
136
|
+
#### 广告项 `FloatingAdItem`
|
|
137
|
+
|
|
138
|
+
| 字段 | 类型 | 说明 |
|
|
139
|
+
| --- | --- | --- |
|
|
140
|
+
| `src` | `string` | 图片 URL(必填;没有图片的条目会被忽略) |
|
|
141
|
+
| `title` | `string` | 标题 |
|
|
142
|
+
| `desc` | `string` | 副文案 |
|
|
143
|
+
| `href` | `string` | 跳转链接;`javascript:` / `data:` 等危险协议会被忽略 |
|
|
144
|
+
| `target` | `'_blank' \| '_self'` | 跳转方式,默认 `_blank` |
|
|
145
|
+
| `alt` | `string` | 图片 alt,缺省用 `title` |
|
|
146
|
+
| `badge` | `string` | 图片右上角角标 |
|
|
147
|
+
|
|
148
|
+
```ts
|
|
149
|
+
new FloatingAd({
|
|
150
|
+
ads: [
|
|
151
|
+
{ src: '/ad-1.jpg', title: '云服务器特惠', desc: '首年 99 元', href: 'https://...', badge: '限时' },
|
|
152
|
+
{ title: '周刊订阅', desc: '每周一封,只讲有用的工具', href: 'https://...' }
|
|
153
|
+
],
|
|
154
|
+
position: 'left-center',
|
|
155
|
+
onClick: (ad) => console.log('ad clicked', ad.title)
|
|
156
|
+
})
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### 实例方法
|
|
160
|
+
|
|
161
|
+
| 方法 | 说明 |
|
|
162
|
+
| --- | --- |
|
|
163
|
+
| `open()` | 重新打开(忽略 localStorage 关闭标记) |
|
|
164
|
+
| `close()` | 关闭并移除浮窗(`closePersistence` 为 `true` 时同时写入 localStorage) |
|
|
165
|
+
| `destroy()` | 从页面移除并解绑事件 |
|
|
166
|
+
| `update(options)` | 用新配置重渲染(保留原容器) |
|
|
167
|
+
| `isMounted()` | 当前是否已挂载 |
|
|
168
|
+
|
|
169
|
+
Web Component 元素同样提供 `open()` / `close()`。
|
|
170
|
+
|
|
171
|
+
## 响应式(桌面 / 移动)
|
|
172
|
+
|
|
173
|
+
同一份配置自动适配两端,断点为 `768px`:
|
|
174
|
+
|
|
175
|
+
| 项 | 桌面(≥768px) | 移动端(<768px) |
|
|
176
|
+
| --- | --- | --- |
|
|
177
|
+
| 位置 | `left-center`(左侧垂直居中) | `left-bottom`(左下角) |
|
|
178
|
+
| 卡片宽度 | 150px | 140px |
|
|
179
|
+
| 图片边长 | 120px | 112px |
|
|
180
|
+
| 距视口边缘 | 16px | 12px |
|
|
181
|
+
| 关闭按钮 | 悬停出现 | 常显(触屏无 hover) |
|
|
182
|
+
|
|
183
|
+
- 显式设置 `position` / `width` / `offset` / `imageSize` 时会覆盖两端默认值(移动端也用同一尺寸)
|
|
184
|
+
- 想彻底不在移动端出现:`hide-on-mobile`
|
|
185
|
+
- 想改移动端尺寸又保留响应式:直接覆盖 CSS 变量(不要传 `width` 等 JS 参数)
|
|
186
|
+
|
|
187
|
+
```css
|
|
188
|
+
@media (max-width: 767px) {
|
|
189
|
+
.fa-widget {
|
|
190
|
+
--fa-width: 130px;
|
|
191
|
+
--fa-img-size: 104px;
|
|
192
|
+
--fa-offset: 10px;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
## 自定义主题
|
|
198
|
+
|
|
199
|
+
组件通过 CSS 变量暴露主题,直接在宿主页面覆盖即可:
|
|
200
|
+
|
|
201
|
+
```css
|
|
202
|
+
.fa-widget {
|
|
203
|
+
--fa-bg: #fffbe6; /* 背景 */
|
|
204
|
+
--fa-accent: #c0392b; /* 强调色 */
|
|
205
|
+
--fa-radius: 8px; /* 圆角 */
|
|
206
|
+
--fa-border: #e0d5a0; /* 边框 */
|
|
207
|
+
--fa-offset: 24px; /* 距视口边缘距离 */
|
|
208
|
+
--fa-width: 180px; /* 浮窗宽度 */
|
|
209
|
+
--fa-img-fit: cover; /* 图片填充方式 */
|
|
210
|
+
--fa-img-size: 120px; /* 广告图片边长(正方形) */
|
|
211
|
+
}
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
## 在线演示
|
|
215
|
+
|
|
216
|
+
**https://blog.shenzjd.com/components/packages/floating-ad/demo/**
|
|
217
|
+
|
|
218
|
+
## 本地演示
|
|
219
|
+
|
|
220
|
+
```bash
|
|
221
|
+
pnpm build # 仓库根目录执行,产出 dist/
|
|
222
|
+
pnpm preview # 启动静态服务器 http://localhost:8317
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
浏览器打开 `http://localhost:8317/packages/floating-ad/demo/index.html`,左侧即组件实时样式,左侧面板可调参。
|
|
226
|
+
|
|
227
|
+
## 浏览器兼容
|
|
228
|
+
|
|
229
|
+
现代浏览器(Chrome / Firefox / Safari / Edge),无 IE 支持计划。
|
|
230
|
+
|
|
231
|
+
## 发布(维护者)
|
|
232
|
+
|
|
233
|
+
本包的日常发版由 CI 完成,但**首次发布必须手动**——npm 的 OIDC Trusted Publishing 只能给「已存在且已绑定 Trusted Publisher」的包发布,对从未创建过的包名直接 PUT 会被 registry 拒绝(返回 E404,看起来像权限问题)。
|
|
234
|
+
|
|
235
|
+
首次发布:
|
|
236
|
+
|
|
237
|
+
```bash
|
|
238
|
+
cd packages/floating-ad
|
|
239
|
+
pnpm build # 仓库根目录也可直接 pnpm build 全量构建
|
|
240
|
+
npm login
|
|
241
|
+
npm publish --access public
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
发布成功后,到 npmjs.com → 该包 → **Settings → Trusted publishing** 添加:
|
|
245
|
+
|
|
246
|
+
| 字段 | 值 |
|
|
247
|
+
| --- | --- |
|
|
248
|
+
| Provider | GitHub Actions |
|
|
249
|
+
| Organization / user | `wu529778790` |
|
|
250
|
+
| Repository | `components` |
|
|
251
|
+
| Workflow filename | `release.yml` |
|
|
252
|
+
|
|
253
|
+
绑定后**必须在 2 天内**成功跑通一次 OIDC 发布完成验证,否则配置作废且不可编辑(只能删除重建)。
|
|
254
|
+
|
|
255
|
+
之后的发版全自动:push 到 `main` → `Release` workflow 检测有变更的包 → `npm version patch` → 回写 commit(`[skip ci]`)→ OIDC 发布。无需配置 `NPM_TOKEN` / `NODE_AUTH_TOKEN`,**配了反而会禁用 OIDC**。
|
|
256
|
+
|
|
257
|
+
## License
|
|
258
|
+
|
|
259
|
+
MIT
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
.fa-widget {
|
|
2
|
+
--fa-bg: rgba(255, 255, 255, 0.96);
|
|
3
|
+
--fa-accent: #333;
|
|
4
|
+
--fa-radius: 12px;
|
|
5
|
+
--fa-border: rgba(0, 0, 0, 0.1);
|
|
6
|
+
--fa-offset: 16px;
|
|
7
|
+
--fa-width: 150px;
|
|
8
|
+
--fa-img-size: 120px;
|
|
9
|
+
--fa-img-fit: cover;
|
|
10
|
+
|
|
11
|
+
position: fixed;
|
|
12
|
+
z-index: 9999;
|
|
13
|
+
box-sizing: border-box;
|
|
14
|
+
width: var(--fa-width);
|
|
15
|
+
padding: 14px;
|
|
16
|
+
background: var(--fa-bg);
|
|
17
|
+
border: 1px solid var(--fa-border);
|
|
18
|
+
border-radius: var(--fa-radius);
|
|
19
|
+
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.04);
|
|
20
|
+
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
|
|
21
|
+
"Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei",
|
|
22
|
+
sans-serif;
|
|
23
|
+
color: var(--fa-accent);
|
|
24
|
+
line-height: 1.5;
|
|
25
|
+
color-scheme: light dark;
|
|
26
|
+
transition: box-shadow 0.2s ease;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.fa-widget:hover {
|
|
30
|
+
box-shadow: 0 6px 20px rgba(0, 0, 0, 0.08);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.fa-widget[data-position="right-bottom"] {
|
|
34
|
+
right: var(--fa-offset);
|
|
35
|
+
bottom: var(--fa-offset);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.fa-widget[data-position="right-top"] {
|
|
39
|
+
right: var(--fa-offset);
|
|
40
|
+
top: var(--fa-offset);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
.fa-widget[data-position="left-bottom"] {
|
|
44
|
+
left: var(--fa-offset);
|
|
45
|
+
bottom: var(--fa-offset);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.fa-widget[data-position="left-top"] {
|
|
49
|
+
left: var(--fa-offset);
|
|
50
|
+
top: var(--fa-offset);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.fa-widget[data-position="right-center"] {
|
|
54
|
+
right: var(--fa-offset);
|
|
55
|
+
top: 50%;
|
|
56
|
+
transform: translateY(-50%);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.fa-widget[data-position="left-center"] {
|
|
60
|
+
left: var(--fa-offset);
|
|
61
|
+
top: 50%;
|
|
62
|
+
transform: translateY(-50%);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.fa-close {
|
|
66
|
+
position: absolute;
|
|
67
|
+
top: -2px;
|
|
68
|
+
right: -2px;
|
|
69
|
+
display: flex;
|
|
70
|
+
align-items: center;
|
|
71
|
+
justify-content: center;
|
|
72
|
+
width: 22px;
|
|
73
|
+
height: 22px;
|
|
74
|
+
padding: 0;
|
|
75
|
+
margin: 0;
|
|
76
|
+
border: none;
|
|
77
|
+
border-radius: 50%;
|
|
78
|
+
background: transparent;
|
|
79
|
+
color: rgba(0, 0, 0, 0.35);
|
|
80
|
+
cursor: pointer;
|
|
81
|
+
transition: color 0.15s ease, opacity 0.15s ease;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
.fa-close:hover {
|
|
85
|
+
color: rgba(0, 0, 0, 0.7);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/* 触屏设备(无 hover):关闭按钮常显,保证可关闭 */
|
|
89
|
+
.fa-close {
|
|
90
|
+
opacity: 1;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/* 支持 hover 的设备(鼠标):平时隐藏,悬停卡片时浮现 */
|
|
94
|
+
@media (hover: hover) and (pointer: fine) {
|
|
95
|
+
.fa-close {
|
|
96
|
+
opacity: 0;
|
|
97
|
+
pointer-events: none;
|
|
98
|
+
}
|
|
99
|
+
.fa-widget:hover .fa-close,
|
|
100
|
+
.fa-close:focus-visible {
|
|
101
|
+
opacity: 1;
|
|
102
|
+
pointer-events: auto;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/* 「广告」标识:压在首图左上角,不占排版行高
|
|
107
|
+
(《广告法》要求广告可识别,标识保留,但不必单独占一行) */
|
|
108
|
+
.fa-label {
|
|
109
|
+
position: absolute;
|
|
110
|
+
top: 6px;
|
|
111
|
+
left: 6px;
|
|
112
|
+
z-index: 1;
|
|
113
|
+
display: inline-block;
|
|
114
|
+
font-size: 10px;
|
|
115
|
+
line-height: 1;
|
|
116
|
+
letter-spacing: 0.06em;
|
|
117
|
+
padding: 3px 5px;
|
|
118
|
+
border-radius: 4px;
|
|
119
|
+
background: rgba(0, 0, 0, 0.45);
|
|
120
|
+
color: rgba(255, 255, 255, 0.92);
|
|
121
|
+
backdrop-filter: blur(4px);
|
|
122
|
+
-webkit-backdrop-filter: blur(4px);
|
|
123
|
+
pointer-events: none;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
.fa-item {
|
|
127
|
+
display: block;
|
|
128
|
+
text-decoration: none;
|
|
129
|
+
color: inherit;
|
|
130
|
+
border-radius: 8px;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
a.fa-item {
|
|
134
|
+
cursor: pointer;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/* 图片固定方形(默认 120×120,与右侧公众号浮窗的二维码尺寸一致) */
|
|
138
|
+
.fa-media {
|
|
139
|
+
position: relative;
|
|
140
|
+
display: block;
|
|
141
|
+
width: var(--fa-img-size, 120px);
|
|
142
|
+
height: var(--fa-img-size, 120px);
|
|
143
|
+
margin: 0 auto;
|
|
144
|
+
overflow: hidden;
|
|
145
|
+
border-radius: 8px;
|
|
146
|
+
background: rgba(0, 0, 0, 0.04);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
.fa-img {
|
|
150
|
+
display: block;
|
|
151
|
+
width: 100%;
|
|
152
|
+
height: 100%;
|
|
153
|
+
object-fit: var(--fa-img-fit, cover);
|
|
154
|
+
transition: transform 0.25s ease;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
a.fa-item:hover .fa-img {
|
|
158
|
+
transform: scale(1.04);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/* 图片加载失败:隐藏空图框,只留文字;连文字都没有就整条隐藏 */
|
|
162
|
+
.fa-media--failed,
|
|
163
|
+
.fa-item--failed {
|
|
164
|
+
display: none;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
.fa-tag {
|
|
168
|
+
position: absolute;
|
|
169
|
+
top: 6px;
|
|
170
|
+
right: 6px;
|
|
171
|
+
padding: 1px 6px;
|
|
172
|
+
font-size: 10px;
|
|
173
|
+
line-height: 1.5;
|
|
174
|
+
border-radius: 999px;
|
|
175
|
+
background: var(--fa-accent);
|
|
176
|
+
color: var(--fa-bg);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
.fa-body {
|
|
180
|
+
display: block;
|
|
181
|
+
margin-top: 8px;
|
|
182
|
+
text-align: left;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
.fa-item > .fa-body:first-child {
|
|
186
|
+
margin-top: 0;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
.fa-title {
|
|
190
|
+
display: block;
|
|
191
|
+
font-size: 12px;
|
|
192
|
+
font-weight: 500;
|
|
193
|
+
color: var(--fa-accent);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
.fa-desc {
|
|
197
|
+
display: block;
|
|
198
|
+
margin-top: 2px;
|
|
199
|
+
font-size: 11px;
|
|
200
|
+
color: rgba(0, 0, 0, 0.45);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
.fa-divider {
|
|
204
|
+
height: 1px;
|
|
205
|
+
margin: 10px 0;
|
|
206
|
+
background: var(--fa-border);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/* 移动端:比桌面略小一号(卡片 140 / 图片 112 / 距边 12),缺省落在左下角 */
|
|
210
|
+
@media (max-width: 767px) {
|
|
211
|
+
.fa-widget {
|
|
212
|
+
--fa-width: 140px;
|
|
213
|
+
--fa-img-size: 112px;
|
|
214
|
+
--fa-offset: 12px;
|
|
215
|
+
padding: 13px;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/* 触屏点按区域稍放大 */
|
|
219
|
+
.fa-close {
|
|
220
|
+
width: 24px;
|
|
221
|
+
height: 24px;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/* 跟随系统深色模式 —— 必须放文件末尾,确保优先级高于上面的浅色规则
|
|
226
|
+
(仅影响默认值;用户显式设置的 --fa-* inline 变量仍优先) */
|
|
227
|
+
@media (prefers-color-scheme: dark) {
|
|
228
|
+
.fa-widget {
|
|
229
|
+
--fa-bg: rgba(28, 28, 30, 0.96);
|
|
230
|
+
--fa-accent: rgba(255, 255, 255, 0.92);
|
|
231
|
+
--fa-border: rgba(255, 255, 255, 0.14);
|
|
232
|
+
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.5);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
.fa-widget:hover {
|
|
236
|
+
box-shadow: 0 6px 22px rgba(0, 0, 0, 0.6);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
.fa-media {
|
|
240
|
+
background: rgba(255, 255, 255, 0.06);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
.fa-close {
|
|
244
|
+
color: rgba(255, 255, 255, 0.4);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
.fa-close:hover {
|
|
248
|
+
color: rgba(255, 255, 255, 0.8);
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
.fa-desc {
|
|
252
|
+
color: rgba(255, 255, 255, 0.55);
|
|
253
|
+
}
|
|
254
|
+
}
|