diff --git a/src/components/iconSelector/index.vue b/src/components/iconSelector/index.vue new file mode 100644 index 0000000..a7911b3 --- /dev/null +++ b/src/components/iconSelector/index.vue @@ -0,0 +1,95 @@ + + + \ No newline at end of file diff --git a/src/theme/element.scss b/src/theme/element.scss index 248e354..82dd496 100644 --- a/src/theme/element.scss +++ b/src/theme/element.scss @@ -957,3 +957,44 @@ height: 100%; overflow: auto; } + +/* Popover 弹出框 +------------------------------- */ +.icon-selector-popper { + padding: 0 !important; + .icon-selector-warp-title { + height: 40px; + line-height: 40px; + padding: 0 15px; + } + .icon-selector-warp { + .icon-selector-warp-row { + border-top: 1px solid #ebeef5; + border-left: 1px solid #ebeef5; + max-height: 260px; + overflow-y: auto; + .icon-selector-warp-item { + display: flex; + border-right: 1px solid #ebeef5; + border-bottom: 1px solid #ebeef5; + padding: 10px; + .icon-selector-warp-item-value { + transition: all 0.3s ease; + i { + font-size: 20px; + color: #606266; + } + } + &:hover { + cursor: pointer; + .icon-selector-warp-item-value { + i { + color: var(--color-primary); + transition: all 0.3s ease; + } + } + } + } + } + } +} diff --git a/src/utils/getStyleSheets.ts b/src/utils/getStyleSheets.ts new file mode 100644 index 0000000..6cae6b5 --- /dev/null +++ b/src/utils/getStyleSheets.ts @@ -0,0 +1,111 @@ +import { nextTick } from "vue" + +// 获取阿里字体图标 +const getAlicdnIconfont = () => { + return new Promise((resolve, reject) => { + nextTick(() => { + const styles: any = document.styleSheets + let sheetsList = [] + let sheetsIconList = [] + 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 自带图标 +const elementPlusIconfont = () => { + return new Promise((resolve, reject) => { + nextTick(() => { + const styles: any = document.styleSheets + let sheetsIconList = [] + for (let i = 0; i < styles.length; i++) { + for (let j = 0; j < styles[i].cssRules.length; j++) { + if ( + styles[i].cssRules[j].selectorText && + styles[i].cssRules[j].selectorText.indexOf(".el-icon-") === 0 + ) { + sheetsIconList.push( + `${styles[i].cssRules[j].selectorText + .substring(1, styles[i].cssRules[j].selectorText.length) + .replace(/\:\:before/gi, "")}` + ) + } + } + } + if (sheetsIconList.length > 0) resolve(sheetsIconList) + else reject('未获取到值,请刷新重试') + }) + }) +} + +// 初始化获取 css 样式,这里使用 fontawesome 的图标 +const awesomeIconfont = () => { + return new Promise((resolve, reject) => { + nextTick(() => { + const styles: any = document.styleSheets + let sheetsList = [] + let sheetsIconList = [] + for (let i = 0; i < styles.length; i++) { + if ( + styles[i].href && + styles[i].href.indexOf("netdna.bootstrapcdn.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(".fa-") === 0 && + sheetsList[i].cssRules[j].selectorText.indexOf(",") === -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('未获取到值,请刷新重试') + }) + }) +} + +// 定义导出方法集合 +const initIconfont = { + ali: () => { + return getAlicdnIconfont() + }, + ele: () => { + return elementPlusIconfont() + }, + awe: () => { + return awesomeIconfont() + } +} + +// 导出方法 +export default initIconfont \ No newline at end of file diff --git a/src/views/fun/selector/index.vue b/src/views/fun/selector/index.vue index 7769595..eafaef4 100644 --- a/src/views/fun/selector/index.vue +++ b/src/views/fun/selector/index.vue @@ -1,14 +1,26 @@