icon_style.html 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
  1. {extend name="base"/}
  2. {block name="resources"}
  3. <style>
  4. .layui-form {
  5. padding: 15px;
  6. }
  7. .icon-block {
  8. width: 60px;
  9. height: 60px;
  10. font-size: 60px;
  11. border: 1px dashed #eee;
  12. }
  13. .main-icon {
  14. width: 100px;
  15. height: 100px;
  16. font-size: 100px;
  17. }
  18. .icon-block .icon {
  19. width: inherit;
  20. height: inherit;
  21. font-size: 100%;
  22. color: #000;
  23. display: flex;
  24. align-items: center;
  25. justify-content: center;
  26. }
  27. .icon-block .js-icon {
  28. font-size: 50%;
  29. line-height:1;
  30. }
  31. .icon-block .js-icon.gradient {
  32. -webkit-background-clip:text!important;
  33. -webkit-text-fill-color:transparent;
  34. }
  35. .icon-style {
  36. display: flex;
  37. flex-wrap: wrap;
  38. }
  39. .icon-style .icon-block {
  40. margin: 0 10px 10px 0;
  41. cursor: pointer;
  42. }
  43. .icon-style .no-style .icon {
  44. color: #eee;
  45. }
  46. .icon-style .active, .icon-style .icon-block:hover {
  47. border-color: var(--base-color);
  48. }
  49. .title {
  50. font-weight: bold;
  51. margin-bottom: 10px;
  52. padding-left: 10px;
  53. border-left: 2px solid var(--base-color);
  54. line-height: 1;
  55. margin-left: 10px;
  56. }
  57. .slide-wrap {
  58. display: flex;
  59. align-items: center;
  60. padding-left: 10px;
  61. }
  62. .slide-wrap > div {
  63. flex: 1;
  64. }
  65. .icon-color {
  66. display: flex;
  67. }
  68. .icon-color .color-item {
  69. border: 2px solid #d7d7d7;
  70. width: 20px;
  71. height: 20px;
  72. border-radius: 50%;
  73. margin-right: 10px;
  74. display: flex;
  75. align-items: center;
  76. justify-content: center;
  77. cursor: pointer;
  78. }
  79. .icon-color .color-item .js-icon {
  80. font-size: 12px;
  81. color: #aaa;
  82. }
  83. .icon-color .color-item.disabled {
  84. cursor: not-allowed;
  85. }
  86. .icon-color .color-item.disabled .js-icon {
  87. color: #eee;
  88. border-color: #eee;
  89. }
  90. .flexbox-fix-btn .btn {
  91. margin: 0px;
  92. line-height: 18px;
  93. font-size: 12px;
  94. }
  95. </style>
  96. {/block}
  97. {block name="body"}
  98. <div id="app" class="layui-form icon-style-set">
  99. <div class="layui-form-item">
  100. <label class="layui-form-label">图标:</label>
  101. <div class="layui-input-block icon-block main-icon">
  102. <div class="icon" :style="iconBgStyle">
  103. <i class="js-icon {$icon}" :class="{gradient: style.iconColor.length > 1}" :style="iconStyle"></i>
  104. </div>
  105. </div>
  106. </div>
  107. <div class="layui-form-item">
  108. <label class="layui-form-label">图标风格:</label>
  109. <div class="layui-input-block icon-style">
  110. <div class="icon-block no-style" :class="{active: styleIndex == -1}" title="无风格" @click="selectStyle(-1)">
  111. <div class="icon">
  112. <i class="iconfont iconzhuanliwuxiao"></i>
  113. </div>
  114. </div>
  115. <div class="icon-block" :class="{active: styleIndex == index}" v-for="(item, index) in styleList" :key="index" @click="selectStyle(index)">
  116. <iconfont icon="{$icon}" :value="item"></iconfont>
  117. </div>
  118. </div>
  119. </div>
  120. <div class="title">图标设置</div>
  121. <div class="layui-form-item">
  122. <label class="layui-form-label">背景颜色</label>
  123. <div class="layui-input-block slide-wrap len-mid">
  124. <div class="icon-color">
  125. <div class="color-item" :id="'iconBgColor' + index" v-show="style.iconBgColor[index]" :style="{background: style.iconBgColor[index] ?? '#fff'}" v-for="(item, index) in 6" :key="index"></div>
  126. <div class="color-item" :class="{disabled: style.iconBgColor.length >= 6}" @click="addColor('iconBgColor')">
  127. <i class="iconfont iconjia"></i>
  128. </div>
  129. </div>
  130. </div>
  131. </div>
  132. <div class="layui-form-item" v-show="style.iconBgColor.length > 1">
  133. <label class="layui-form-label">渐变角度</label>
  134. <div class="layui-input-block slide-wrap len-mid">
  135. <div class="icon-bgcolor-deg"></div>
  136. </div>
  137. </div>
  138. <div class="layui-form-item">
  139. <label class="layui-form-label">圆角大小</label>
  140. <div class="layui-input-block slide-wrap len-mid">
  141. <div class="bg-radius"></div>
  142. </div>
  143. </div>
  144. <div class="layui-form-item">
  145. <label class="layui-form-label">图标大小</label>
  146. <div class="layui-input-block slide-wrap len-mid">
  147. <div class="font-size"></div>
  148. </div>
  149. </div>
  150. <div class="layui-form-item">
  151. <label class="layui-form-label">图标颜色</label>
  152. <div class="layui-input-block slide-wrap len-mid">
  153. <div class="icon-color">
  154. <div class="color-item" :id="'iconColor' + index" v-show="style.iconColor[index]" :style="{background: style.iconColor[index] ?? '#fff'}" v-for="(item, index) in 6" :key="index"></div>
  155. <div class="color-item" :class="{disabled: style.iconColor.length >= 6}" @click="addColor('iconColor')">
  156. <i class="iconfont iconjia"></i>
  157. </div>
  158. </div>
  159. </div>
  160. </div>
  161. <div class="layui-form-item" v-show="style.iconColor.length > 1">
  162. <label class="layui-form-label">渐变角度</label>
  163. <div class="layui-input-block slide-wrap len-mid">
  164. <div class="icon-color-deg"></div>
  165. </div>
  166. </div>
  167. </div>
  168. {/block}
  169. {block name="script"}
  170. <script src="STATIC_EXT/colorPicker/js/colorpicker.js"></script>
  171. <script src="STATIC_JS/vue.js"></script>
  172. {include file="diy/iconfont_component"/}
  173. <script>
  174. var form,slider,colorpicker,vue,_colorPicker = {};
  175. layui.use(['form', 'slider', 'colorpicker'], function() {
  176. form = layui.form;
  177. slider = layui.slider;
  178. colorpicker = layui.colorpicker;
  179. vue = new Vue({
  180. el: "#app",
  181. data: {
  182. style: {
  183. fontSize: 50,
  184. iconBgColor: [],
  185. iconBgColorDeg: 0,
  186. iconBgImg: '',
  187. bgRadius: 0,
  188. iconColor: ['#000'],
  189. iconColorDeg: 0,
  190. },
  191. styleIndex: -1,
  192. styleList:{:json_encode($icon_style)}
  193. },
  194. methods: {
  195. addColor(key) {
  196. if (this.style[key].length >= 6) return;
  197. this.style[key].push('#fff');
  198. },
  199. colorRender(id, color, callback){
  200. if (_colorPicker[id]) {
  201. _colorPicker[id].setColorByInput(color);
  202. return;
  203. }
  204. _colorPicker[id] = Colorpicker.create({
  205. el: id,
  206. color: color,
  207. change: function (elem, hex) {
  208. callback(hex, elem)
  209. }
  210. });
  211. },
  212. updateArray(key){
  213. this.style[key].push('')
  214. this.style[key].pop()
  215. },
  216. selectStyle(index){
  217. this.styleIndex = index;
  218. if (index == -1) {
  219. this.style = {
  220. fontSize: 50,
  221. iconBgColor: [],
  222. iconBgColorDeg: 0,
  223. iconBgImg: '',
  224. bgRadius: 0,
  225. iconColor: ['#000'],
  226. iconColorDeg: 0,
  227. }
  228. } else {
  229. this.style = ns.deepclone(this.styleList[index]);
  230. }
  231. var self = this;
  232. setTimeout(function () {
  233. self.style.iconBgColor.forEach(function (item, index) {
  234. self.colorRender('iconBgColor' + index, self.style.iconBgColor[index])
  235. })
  236. self.style.iconColor.forEach(function (item, index) {
  237. self.colorRender('iconColor' + index, self.style.iconColor[index])
  238. })
  239. })
  240. },
  241. img(src){
  242. return ns.img(src);
  243. }
  244. },
  245. mounted(){
  246. if (localStorage.getItem('iconStyle')) this.style = JSON.parse(localStorage.getItem('iconStyle'));
  247. var self = this;
  248. slider.render({
  249. elem: '.icon-style-set .font-size',
  250. input: true,
  251. value: self.style.fontSize,
  252. min: 10,
  253. max: 100,
  254. change: function (value) {
  255. self.style.fontSize = value;
  256. }
  257. });
  258. slider.render({
  259. elem: '.icon-style-set .icon-color-deg',
  260. input: true,
  261. max: 360,
  262. value: self.style.iconColorDeg,
  263. change: function (value) {
  264. self.style.iconColorDeg = value;
  265. }
  266. });
  267. slider.render({
  268. elem: '.icon-style-set .icon-bgcolor-deg',
  269. input: true,
  270. max: 360,
  271. value: self.style.iconBgColorDeg,
  272. change: function (value) {
  273. self.style.iconBgColorDeg = value;
  274. }
  275. });
  276. slider.render({
  277. elem: '.icon-style-set .bg-radius',
  278. input: true,
  279. value: self.style.bgRadius,
  280. max: 50,
  281. change: function (value) {
  282. self.style.bgRadius = value;
  283. }
  284. });
  285. setTimeout(function () {
  286. for (var index = 0; index < 6; index++) {
  287. self.colorRender('iconBgColor' + index, self.style.iconBgColor[index] ? self.style.iconBgColor[index] : '', function (color, elem) {
  288. var _index = $(elem).index();
  289. self.style.iconBgColor[_index] = color;
  290. self.updateArray('iconBgColor')
  291. })
  292. self.colorRender('iconColor' + index, self.style.iconColor[index] ? self.style.iconColor[index] : '', function (color, elem) {
  293. var _index = $(elem).index();
  294. self.style.iconColor[_index] = color;
  295. self.updateArray('iconColor')
  296. })
  297. }
  298. })
  299. },
  300. computed: {
  301. iconBgStyle(){
  302. var style = {
  303. 'border-radius': this.style.bgRadius + '%',
  304. 'background': ''
  305. };
  306. if (this.style.iconBgImg) style['background'] += 'url('+ this.img(this.style.iconBgImg) +') no-repeat bottom / contain'
  307. if (this.style.iconBgColor.length) {
  308. if (style.background) style.background += ',';
  309. if (this.style.iconBgColor.length == 1) {
  310. style.background += this.style.iconBgColor[0];
  311. } else {
  312. style['background'] += 'linear-gradient('+ this.style.iconBgColorDeg +'deg, '+ this.style.iconBgColor.join(',') +')';
  313. }
  314. }
  315. return style;
  316. },
  317. iconStyle(){
  318. var style = {
  319. fontSize: this.style.fontSize + '%'
  320. }
  321. if (this.style.iconColor.length == 1) {
  322. style.color = this.style.iconColor[0];
  323. } else {
  324. style['background'] = 'linear-gradient('+ this.style.iconColorDeg +'deg, '+ this.style.iconColor.join(',') +')';
  325. }
  326. return style;
  327. }
  328. }
  329. })
  330. })
  331. function iconStyle(callback) {
  332. var data = ns.deepclone(vue._data.style);
  333. callback(data);
  334. }
  335. </script>
  336. {/block}