Files
school-developer/src/utils/getStyleSheets.ts
guochunsi 74c06bb8a0 a
2025-12-31 17:40:01 +08:00

146 lines
4.4 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { nextTick } from 'vue';
import * as svg from '@element-plus/icons-vue';
// 获取阿里字体图标
const getAlicdnIconfont = () => {
return new Promise((resolve, reject) => {
nextTick(() => {
const styles: any = document.styleSheets;
let sheetsList = [] as any[];
let sheetsIconList = [] as any[];
for (let i = 0; i < styles.length; i++) {
if (styles[i].href && styles[i].href.indexOf('at.alicdn.com') > -1) {
sheetsList.push(styles[i]);
}
}
for (let i = 0; i < sheetsList.length; i++) {
for (let j = 0; j < sheetsList[i].cssRules.length; j++) {
if (sheetsList[i].cssRules[j].selectorText && sheetsList[i].cssRules[j].selectorText.indexOf('.icon-') > -1) {
sheetsIconList.push(
`${sheetsList[i].cssRules[j].selectorText.substring(1, sheetsList[i].cssRules[j].selectorText.length).replace(/\:\:before/gi, '')}`
);
}
}
}
if (sheetsIconList.length > 0) resolve(sheetsIconList);
else reject('未获取到值,请刷新重试');
});
});
};
// 初始化获取 css 样式,获取 element plus 自带 svg 图标,增加了 ele- 前缀使用时ele-Aim
const getElementPlusIconfont = () => {
return new Promise((resolve, reject) => {
nextTick(() => {
const icons = svg as any;
const sheetsIconList = [] as any[];
for (const i in icons) {
sheetsIconList.push(`ele-${icons[i].name}`);
}
if (sheetsIconList.length > 0) resolve(sheetsIconList);
else reject('未获取到值,请刷新重试');
});
});
};
// 初始化获取 css 样式,这里使用 fontawesome 的图标
const getAwesomeIconfont = () => {
return new Promise((resolve, reject) => {
nextTick(() => {
const styles: any = document.styleSheets;
let sheetsList = [] as any[];
let sheetsIconList = [] as any[];
for (let i = 0; i < styles.length; i++) {
// 支持检测 fontawesome 和 fortawesome
if (styles[i].href && (styles[i].href.indexOf('fontawesome') > -1 || styles[i].href.indexOf('fortawesome') > -1)) {
sheetsList.push(styles[i]);
}
}
for (let i = 0; i < sheetsList.length; i++) {
try {
for (let j = 0; j < sheetsList[i].cssRules.length; j++) {
const rule = sheetsList[i].cssRules[j];
if (rule.selectorText) {
// 支持 Font Awesome 7.x 新格式:.fa-solid, .fa-regular, .fa-brands, .fa-xxx
// 也支持旧格式:.fa-xxx
if (
(rule.selectorText.indexOf('.fa-solid') === 0 ||
rule.selectorText.indexOf('.fa-regular') === 0 ||
rule.selectorText.indexOf('.fa-brands') === 0 ||
rule.selectorText.indexOf('.fa-') === 0) &&
rule.selectorText.indexOf(',') === -1
) {
if (/::before/.test(rule.selectorText)) {
const iconClass = rule.selectorText
.substring(1, rule.selectorText.length)
.replace(/\:\:before/gi, '');
// 如果是新格式fa-solid fa-xxx只取图标名部分
const iconName = iconClass.replace(/^(fa-solid|fa-regular|fa-brands)\s+/, '');
if (iconName && !sheetsIconList.includes(iconName)) {
sheetsIconList.push(iconName);
}
}
}
}
}
} catch (e) {
// 跨域样式表可能无法访问,忽略错误
continue;
}
}
if (sheetsIconList.length > 0) resolve(sheetsIconList.reverse());
else reject('未获取到值,请刷新重试');
});
});
};
/*
* 获取本地自带的图标
* /src/assets/icons文件夹内的svg文件
*/
const getLocalIconfontNames = () => {
return new Promise<string[]>((resolve, reject) => {
nextTick(() => {
let iconfonts: string[] = [];
const svgEl = document.getElementById('local-icon');
if (svgEl?.dataset.iconName) {
iconfonts = (svgEl?.dataset.iconName as string).split(',');
}
if (iconfonts.length > 0) {
resolve(iconfonts);
} else {
reject('No Local Icons');
}
});
});
};
/**
* 获取字体图标 `document.styleSheets`
* @method ali 获取阿里字体图标 `<i class="iconfont 图标类名"></i>`
* @method ele 获取 element plus 自带图标 `<i class="图标类名"></i>`
* @method ali 获取 fontawesome 的图标 `<i class="fa 图标类名"></i>`
*/
const initIconfont = {
// iconfont
ali: () => {
return getAlicdnIconfont();
},
// element plus
ele: () => {
return getElementPlusIconfont();
},
// fontawesome
awe: () => {
return getAwesomeIconfont();
},
local: () => {
return getLocalIconfontNames();
},
};
// 导出方法
export default initIconfont;