admin/app/shop/view/diy/icon_style.html

350 lines
12 KiB
HTML

{extend name="base"/}
{block name="resources"}
<style>
.layui-form {
padding: 15px;
}
.icon-block {
width: 60px;
height: 60px;
font-size: 60px;
border: 1px dashed #eee;
}
.main-icon {
width: 100px;
height: 100px;
font-size: 100px;
}
.icon-block .icon {
width: inherit;
height: inherit;
font-size: 100%;
color: #000;
display: flex;
align-items: center;
justify-content: center;
}
.icon-block .js-icon {
font-size: 50%;
line-height:1;
}
.icon-block .js-icon.gradient {
-webkit-background-clip:text!important;
-webkit-text-fill-color:transparent;
}
.icon-style {
display: flex;
flex-wrap: wrap;
}
.icon-style .icon-block {
margin: 0 10px 10px 0;
cursor: pointer;
}
.icon-style .no-style .icon {
color: #eee;
}
.icon-style .active, .icon-style .icon-block:hover {
border-color: var(--base-color);
}
.title {
font-weight: bold;
margin-bottom: 10px;
padding-left: 10px;
border-left: 2px solid var(--base-color);
line-height: 1;
margin-left: 10px;
}
.slide-wrap {
display: flex;
align-items: center;
padding-left: 10px;
}
.slide-wrap > div {
flex: 1;
}
.icon-color {
display: flex;
}
.icon-color .color-item {
border: 2px solid #d7d7d7;
width: 20px;
height: 20px;
border-radius: 50%;
margin-right: 10px;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
}
.icon-color .color-item .js-icon {
font-size: 12px;
color: #aaa;
}
.icon-color .color-item.disabled {
cursor: not-allowed;
}
.icon-color .color-item.disabled .js-icon {
color: #eee;
border-color: #eee;
}
.flexbox-fix-btn .btn {
margin: 0px;
line-height: 18px;
font-size: 12px;
}
</style>
{/block}
{block name="body"}
<div id="app" class="layui-form icon-style-set">
<div class="layui-form-item">
<label class="layui-form-label">图标:</label>
<div class="layui-input-block icon-block main-icon">
<div class="icon" :style="iconBgStyle">
<i class="js-icon {$icon}" :class="{gradient: style.iconColor.length > 1}" :style="iconStyle"></i>
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">图标风格:</label>
<div class="layui-input-block icon-style">
<div class="icon-block no-style" :class="{active: styleIndex == -1}" title="无风格" @click="selectStyle(-1)">
<div class="icon">
<i class="iconfont iconzhuanliwuxiao"></i>
</div>
</div>
<div class="icon-block" :class="{active: styleIndex == index}" v-for="(item, index) in styleList" :key="index" @click="selectStyle(index)">
<iconfont icon="{$icon}" :value="item"></iconfont>
</div>
</div>
</div>
<div class="title">图标设置</div>
<div class="layui-form-item">
<label class="layui-form-label">背景颜色</label>
<div class="layui-input-block slide-wrap len-mid">
<div class="icon-color">
<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>
<div class="color-item" :class="{disabled: style.iconBgColor.length >= 6}" @click="addColor('iconBgColor')">
<i class="iconfont iconjia"></i>
</div>
</div>
</div>
</div>
<div class="layui-form-item" v-show="style.iconBgColor.length > 1">
<label class="layui-form-label">渐变角度</label>
<div class="layui-input-block slide-wrap len-mid">
<div class="icon-bgcolor-deg"></div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">圆角大小</label>
<div class="layui-input-block slide-wrap len-mid">
<div class="bg-radius"></div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">图标大小</label>
<div class="layui-input-block slide-wrap len-mid">
<div class="font-size"></div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">图标颜色</label>
<div class="layui-input-block slide-wrap len-mid">
<div class="icon-color">
<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>
<div class="color-item" :class="{disabled: style.iconColor.length >= 6}" @click="addColor('iconColor')">
<i class="iconfont iconjia"></i>
</div>
</div>
</div>
</div>
<div class="layui-form-item" v-show="style.iconColor.length > 1">
<label class="layui-form-label">渐变角度</label>
<div class="layui-input-block slide-wrap len-mid">
<div class="icon-color-deg"></div>
</div>
</div>
</div>
{/block}
{block name="script"}
<script src="STATIC_EXT/colorPicker/js/colorpicker.js"></script>
<script src="STATIC_JS/vue.js"></script>
{include file="diy/iconfont_component"/}
<script>
var form,slider,colorpicker,vue,_colorPicker = {};
layui.use(['form', 'slider', 'colorpicker'], function() {
form = layui.form;
slider = layui.slider;
colorpicker = layui.colorpicker;
vue = new Vue({
el: "#app",
data: {
style: {
fontSize: 50,
iconBgColor: [],
iconBgColorDeg: 0,
iconBgImg: '',
bgRadius: 0,
iconColor: ['#000'],
iconColorDeg: 0,
},
styleIndex: -1,
styleList:{:json_encode($icon_style)}
},
methods: {
addColor(key) {
if (this.style[key].length >= 6) return;
this.style[key].push('#fff');
},
colorRender(id, color, callback){
if (_colorPicker[id]) {
_colorPicker[id].setColorByInput(color);
return;
}
_colorPicker[id] = Colorpicker.create({
el: id,
color: color,
change: function (elem, hex) {
callback(hex, elem)
}
});
},
updateArray(key){
this.style[key].push('')
this.style[key].pop()
},
selectStyle(index){
this.styleIndex = index;
if (index == -1) {
this.style = {
fontSize: 50,
iconBgColor: [],
iconBgColorDeg: 0,
iconBgImg: '',
bgRadius: 0,
iconColor: ['#000'],
iconColorDeg: 0,
}
} else {
this.style = ns.deepclone(this.styleList[index]);
}
var self = this;
setTimeout(function () {
self.style.iconBgColor.forEach(function (item, index) {
self.colorRender('iconBgColor' + index, self.style.iconBgColor[index])
})
self.style.iconColor.forEach(function (item, index) {
self.colorRender('iconColor' + index, self.style.iconColor[index])
})
})
},
img(src){
return ns.img(src);
}
},
mounted(){
if (localStorage.getItem('iconStyle')) this.style = JSON.parse(localStorage.getItem('iconStyle'));
var self = this;
slider.render({
elem: '.icon-style-set .font-size',
input: true,
value: self.style.fontSize,
min: 10,
max: 100,
change: function (value) {
self.style.fontSize = value;
}
});
slider.render({
elem: '.icon-style-set .icon-color-deg',
input: true,
max: 360,
value: self.style.iconColorDeg,
change: function (value) {
self.style.iconColorDeg = value;
}
});
slider.render({
elem: '.icon-style-set .icon-bgcolor-deg',
input: true,
max: 360,
value: self.style.iconBgColorDeg,
change: function (value) {
self.style.iconBgColorDeg = value;
}
});
slider.render({
elem: '.icon-style-set .bg-radius',
input: true,
value: self.style.bgRadius,
max: 50,
change: function (value) {
self.style.bgRadius = value;
}
});
setTimeout(function () {
for (var index = 0; index < 6; index++) {
self.colorRender('iconBgColor' + index, self.style.iconBgColor[index] ? self.style.iconBgColor[index] : '', function (color, elem) {
var _index = $(elem).index();
self.style.iconBgColor[_index] = color;
self.updateArray('iconBgColor')
})
self.colorRender('iconColor' + index, self.style.iconColor[index] ? self.style.iconColor[index] : '', function (color, elem) {
var _index = $(elem).index();
self.style.iconColor[_index] = color;
self.updateArray('iconColor')
})
}
})
},
computed: {
iconBgStyle(){
var style = {
'border-radius': this.style.bgRadius + '%',
'background': ''
};
if (this.style.iconBgImg) style['background'] += 'url('+ this.img(this.style.iconBgImg) +') no-repeat bottom / contain'
if (this.style.iconBgColor.length) {
if (style.background) style.background += ',';
if (this.style.iconBgColor.length == 1) {
style.background += this.style.iconBgColor[0];
} else {
style['background'] += 'linear-gradient('+ this.style.iconBgColorDeg +'deg, '+ this.style.iconBgColor.join(',') +')';
}
}
return style;
},
iconStyle(){
var style = {
fontSize: this.style.fontSize + '%'
}
if (this.style.iconColor.length == 1) {
style.color = this.style.iconColor[0];
} else {
style['background'] = 'linear-gradient('+ this.style.iconColorDeg +'deg, '+ this.style.iconColor.join(',') +')';
}
return style;
}
}
})
})
function iconStyle(callback) {
var data = ns.deepclone(vue._data.style);
callback(data);
}
</script>
{/block}