customTool.vue 31 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066
  1. <template>
  2. <div class="customTool" :class="'terminal' + terminal">
  3. <h3 class="toolTit">自定义</h3>
  4. <div class="toolBox">
  5. <div class="selectBox">
  6. <div class="selectLayTit">选择模板<span>{{selectTemplateName}}</span></div>
  7. <div class="layoutList">
  8. <span class="item iconfont" :class="{active: activeComponent.componentContent.layoutType === item.type}" @click="selectLayout(item, index)" v-for="(item, index) of layoutList" :key="item.id" v-html="item.Icon"></span>
  9. </div>
  10. </div>
  11. <div class="itemBox flexStyle">
  12. <label>图片间隙</label>
  13. <div class="block">
  14. <el-slider
  15. :show-input-controls=false
  16. input-size="mini"
  17. v-model="activeComponent.componentContent.imgClearance"
  18. show-input>
  19. </el-slider>
  20. </div>
  21. </div>
  22. <div class="itemBox flexStyle">
  23. <label>页面间距</label>
  24. <div class="block">
  25. <el-slider
  26. :show-input-controls=false
  27. input-size="mini"
  28. v-model="activeComponent.componentContent.pageSpacing"
  29. show-input>
  30. </el-slider>
  31. </div>
  32. </div>
  33. <div class="itemBox">
  34. <div v-if="activeComponent.componentContent.layoutType !== 'average'">
  35. <div class="textTit">布局</div>
  36. <p>选定布局区域,在下方添加图片,建议添加比例一致的图片</p>
  37. <div class="layoutBox"
  38. :class="activeComponent.componentContent.layoutType"
  39. >
  40. <div class="item" :class="{active: activeComponent.componentContent.imgBoxActive === index-1}" @click="changeLayout(index-1)" v-for="index of activeComponent.componentContent.elementNum" :key="index">
  41. <!--<span>宽度375像素</span>-->
  42. <img class="img" :src="activeComponent.componentContent.imgData[index-1].src" v-show="activeComponent.componentContent.imgData[index-1].src">
  43. </div>
  44. </div>
  45. </div>
  46. <div v-else>
  47. <dl class="densityLiist">
  48. <dt>密度</dt>
  49. <dd>
  50. <el-select v-model="activeComponent.componentContent.density" placeholder="" @change="densityChange">
  51. <el-option label="4*4" value="4"></el-option>
  52. <el-option label="5*5" value="5"></el-option>
  53. <el-option label="6*6" value="6"></el-option>
  54. <el-option label="7*7" value="7"></el-option>
  55. <el-option label="10*10" value="10"></el-option>
  56. </el-select>
  57. </dd>
  58. </dl>
  59. <div class="textTit">布局</div>
  60. <p>移动鼠标选定布局区域大小</p>
  61. <div class="averageBoxWarp">
  62. <div class="averageBox" @mouseleave="averageBoxLeave">
  63. <ul v-for="i of parseInt(activeComponent.componentContent.density)" :key="'y'+i" :class="'col'+activeComponent.componentContent.density">
  64. <li v-for="j of parseInt(activeComponent.componentContent.density)" :key="'x'+j" :class="{'on':activeComponent.componentContent.averageBoxData[i-1][j-1].hover}" @click="averageBoxClick(i-1,j-1)" @mouseover="averageBoxMouseover(i-1,j-1)"></li>
  65. </ul>
  66. </div>
  67. <div class="selectedCube">
  68. <ul>
  69. <li v-for="(item,index) of activeComponent.componentContent.imgData" :class="{active: activeComponent.componentContent.imgBoxActive === index}" :key="index" :style="{'width':getItemValue(item.width) + '%','height':getItemValue(item.height) + '%','left':getItemValue(item.left) + '%','top':getItemValue(item.top) + '%'}">
  70. <div class="box" @click="changeLayout(index)">
  71. <span>
  72. {{parseInt(getItemValue(item.width) * 12)}}x{{parseInt(getItemValue(item.height) * 12)}}
  73. </span>
  74. <img class="img" :src="activeComponent.componentContent.imgData[index].src" v-if="activeComponent.componentContent.imgData[index].src">
  75. </div>
  76. <a class="btn-close" @click="delsSlectedCube(item,index)"><i class="icon iconfont icon-close"></i></a>
  77. </li>
  78. </ul>
  79. </div>
  80. </div>
  81. </div>
  82. <div v-if="activeComponent.componentContent.imgData.length !== 0">
  83. <div class="addImgTit">请添加图片</div>
  84. <div class="addImgBox">
  85. <div class="addImgBoxInner">
  86. <div class="addImg">
  87. <el-upload
  88. drag
  89. :action="fileUploadApi.fileUpload"
  90. :on-success="handleAvatarSuccess"
  91. :before-upload="beforeAvatarUpload"
  92. :show-file-list="false"
  93. >
  94. <img v-if="activeComponent.componentContent.imgData[activeComponent.componentContent.imgBoxActive].src" :src="activeComponent.componentContent.imgData[activeComponent.componentContent.imgBoxActive].src" class="avatar">
  95. <div v-if="activeComponent.componentContent.imgData[activeComponent.componentContent.imgBoxActive].src" class="tips">更换图片</div>
  96. <i v-else class="el-icon-plus avatar-uploader-icon"></i>
  97. <span>添加图片</span>
  98. </el-upload>
  99. </div>
  100. <div class="addLink">
  101. <tool-select-link :linkObj.sync='activeComponent.componentContent.imgData[activeComponent.componentContent.imgBoxActive].linkObj' title="链接"></tool-select-link>
  102. </div>
  103. </div>
  104. </div>
  105. </div>
  106. </div>
  107. </div>
  108. </div>
  109. </template>
  110. <script>
  111. import { mapGetters } from 'vuex'
  112. import {toolMixin} from '@@/config/mixin'
  113. import ToolSelectLink from '../toolModule/tool-select-link'
  114. import api from '@@/components/canvasShow/config/api'
  115. export default {
  116. name: 'customTool',
  117. mixins: [toolMixin],
  118. components: {
  119. ToolSelectLink
  120. },
  121. data () {
  122. return {
  123. title: '', // 标题内容
  124. // imgClearance: 0, // 图片间隙
  125. // pageSpacing: 0, // 页面间距
  126. imgBoxActive: 0,
  127. imageUrl: '', // 图片地址
  128. linkValue: '', // 链接地址
  129. linkOptions: [
  130. {
  131. value: '/index',
  132. label: '首页'
  133. },
  134. {
  135. value: '/list',
  136. label: '列表页'
  137. },
  138. {
  139. value: '/detail',
  140. label: '详情页'
  141. },
  142. {
  143. value: '/about',
  144. label: '关于我们'
  145. }
  146. ],
  147. layoutList: [
  148. {
  149. id: 0,
  150. type: 'L1',
  151. name: '单图',
  152. number: 1, // 显示格子数
  153. Icon: '&#xe607;'
  154. },
  155. {
  156. id: 1,
  157. type: 'L2',
  158. name: '一行二个',
  159. number: 2, // 显示格子数
  160. Icon: '&#xe643;'
  161. },
  162. {
  163. id: 2,
  164. type: 'L3',
  165. name: '一行三个',
  166. number: 3,
  167. Icon: '&#xe644;'
  168. },
  169. {
  170. id: 3,
  171. type: 'L4',
  172. name: '一行四个',
  173. number: 4,
  174. Icon: '&#xe645;'
  175. },
  176. {
  177. id: 4,
  178. type: 'T2B2',
  179. name: '二左二右',
  180. number: 4,
  181. Icon: '&#xe647;'
  182. },
  183. {
  184. id: 5,
  185. type: 'L1R2',
  186. name: '一左二右',
  187. number: 3,
  188. Icon: '&#xe646;'
  189. },
  190. {
  191. id: 6,
  192. type: 'T1B2',
  193. name: '一上二下',
  194. number: 3,
  195. Icon: '&#xe648;'
  196. },
  197. {
  198. id: 7,
  199. type: 'L1T1B2',
  200. name: '一左三右',
  201. number: 4,
  202. Icon: '&#xe646;'
  203. },
  204. {
  205. id: 8,
  206. type: 'average',
  207. name: '自定义',
  208. number: 0,
  209. Icon: '&#xe642;'
  210. }
  211. ],
  212. activeLay: 0,
  213. elementNum: 2, // 生成格子数量
  214. // layoutType: 'L2',
  215. // density: '4',
  216. // averageBoxData: [], // 记录格子的激活状态
  217. beginAverageBox: [], // 记录开始点击的格子
  218. endAverageBox: [], // 记录结束点击的格子
  219. imgData: [], // 图片数据
  220. fileUploadApi: {
  221. fileUpload: ''
  222. }
  223. }
  224. },
  225. computed: {
  226. ...mapGetters([
  227. 'terminal'
  228. ]),
  229. selectTemplateName () {
  230. for (let i = 0; i < this.layoutList.length; i++) {
  231. if (this.layoutList[i].type === this.activeComponent.componentContent.layoutType) {
  232. return this.layoutList[i].name
  233. }
  234. }
  235. }
  236. },
  237. mounted () {
  238. this.fileUploadApi = api
  239. },
  240. methods: {
  241. handleAvatarSuccess (res, file) {
  242. this.activeComponent.componentContent.imgData[this.activeComponent.componentContent.imgBoxActive].src = res.data.url
  243. },
  244. beforeAvatarUpload (file) {
  245. const isLt1M = file.size / 1024 / 1024 < 1
  246. if (!isLt1M) {
  247. this.$message.error('上传图片大小不能超过 1MB!')
  248. }
  249. return isLt1M
  250. },
  251. // 计算生成格子百分比
  252. getItemValue (val) {
  253. const density = parseInt(this.activeComponent.componentContent.density)
  254. if (val === 0 || density === 0) {
  255. return 0
  256. }
  257. return (val / density * 10000 / 100.00)// 小数点后两位百分比
  258. },
  259. // 选择布局
  260. selectLayout (item, index) {
  261. this.activeComponent.componentContent.imgBoxActive = 0
  262. this.activeComponent.componentContent.maxH = 0
  263. this.activeLay = index
  264. this.activeComponent.componentContent.elementNum = item.number
  265. this.activeComponent.componentContent.layoutType = item.type
  266. if (item.type === 'average') {
  267. this.densityChange(this.activeComponent.componentContent.density)
  268. } else {
  269. this.activeComponent.componentContent.imgData = []
  270. let obj = {
  271. src: '',
  272. linkObj: {
  273. selsectValue: '',
  274. selectName: '',
  275. typeText: '',
  276. url: ''
  277. }
  278. }
  279. for (let i = 0; i < item.number; i++) {
  280. this.activeComponent.componentContent.imgData.push(JSON.parse(JSON.stringify(obj)))
  281. }
  282. }
  283. },
  284. // 选择格子
  285. changeLayout (index) {
  286. this.activeComponent.componentContent.imgBoxActive = index
  287. },
  288. // 添加图片
  289. imgChange (file, fileList) {
  290. this.activeComponent.componentContent.imgData[this.activeComponent.componentContent.imgBoxActive].src = URL.createObjectURL(file.raw)
  291. },
  292. // 切换密度
  293. densityChange (val) {
  294. this.activeComponent.componentContent.imgBoxActive = 0
  295. const densityVal = parseInt(val)
  296. this.activeComponent.componentContent.averageBoxData = []
  297. for (let i = 0; i < densityVal; i++) {
  298. this.activeComponent.componentContent.averageBoxData[i] = []
  299. for (let j = 0; j < densityVal; j++) {
  300. this.activeComponent.componentContent.averageBoxData[i].push({
  301. hover: false, // 判断经过激活的位置
  302. takeUp: false // 判断占击占用的位置
  303. })
  304. }
  305. }
  306. this.activeComponent.componentContent.maxH = 0
  307. this.activeComponent.componentContent.imgData = []
  308. },
  309. // 自定义格子点击
  310. averageBoxClick (x, y) {
  311. if (this.beginAverageBox.length === 0) {
  312. this.beginAverageBox = [x, y]
  313. this.endAverageBox = [x, y]
  314. this.activeComponent.componentContent.averageBoxData[x][y].hover = true
  315. this.activeComponent.componentContent.averageBoxData = this.activeComponent.componentContent.averageBoxData.concat([]) // 触发视图更新
  316. } else {
  317. const bx = this.beginAverageBox[0] // 起点X
  318. const by = this.beginAverageBox[1] // 起点Y
  319. // 使用最后一次合理经过的位置
  320. x = this.endAverageBox[0]
  321. y = this.endAverageBox[1]
  322. // 计算占用位置
  323. if (x >= bx) {
  324. for (let i = bx; i <= x; i++) {
  325. if (y >= by) {
  326. for (let j = by; j <= y; j++) {
  327. this.activeComponent.componentContent.averageBoxData[i][j].takeUp = true
  328. }
  329. } else {
  330. for (let j = y; j <= by; j++) {
  331. this.activeComponent.componentContent.averageBoxData[i][j].takeUp = true
  332. }
  333. }
  334. }
  335. } else {
  336. for (let i = x; i <= bx; i++) {
  337. if (y >= by) {
  338. for (let j = by; j <= y; j++) {
  339. this.activeComponent.componentContent.averageBoxData[i][j].takeUp = true
  340. }
  341. } else {
  342. for (let j = y; j <= by; j++) {
  343. this.activeComponent.componentContent.averageBoxData[i][j].takeUp = true
  344. }
  345. }
  346. }
  347. }
  348. // 生成图片框
  349. var obj = {
  350. src: '',
  351. linkObj: {
  352. selsectValue: '',
  353. selectName: '',
  354. typeText: '',
  355. url: ''
  356. }
  357. }
  358. if (x >= bx) {
  359. obj.width = x - bx + 1
  360. obj.left = bx
  361. } else {
  362. obj.width = bx - x + 1
  363. obj.left = x
  364. }
  365. const maxH = this.activeComponent.componentContent.maxH
  366. if (y >= by) {
  367. obj.height = y - by + 1
  368. obj.top = by
  369. if (y + 1 > maxH) {
  370. this.activeComponent.componentContent.maxH = y + 1
  371. }
  372. } else {
  373. obj.height = by - y + 1
  374. obj.top = y
  375. if (by + 1 > maxH) {
  376. this.activeComponent.componentContent.maxH = by + 1
  377. }
  378. }
  379. this.activeComponent.componentContent.imgData.push(JSON.parse(JSON.stringify(obj)))
  380. this.beginAverageBox = []
  381. }
  382. },
  383. // 自定义格子经过
  384. averageBoxMouseover (x, y) {
  385. if (this.beginAverageBox.length !== 0) {
  386. // 计算有没有经过有占用的位置
  387. let flag = this.isBoxTakeUp(x, y)
  388. if (!flag) {
  389. return false
  390. }
  391. // 每次经过洗白格子
  392. const bx = this.beginAverageBox[0] // 起点X
  393. const by = this.beginAverageBox[1] // 起点Y
  394. const densityVal = parseInt(this.activeComponent.componentContent.density)
  395. for (let i = 0; i < densityVal; i++) {
  396. for (let j = 0; j < densityVal; j++) {
  397. this.activeComponent.componentContent.averageBoxData[i][j].hover = false
  398. }
  399. }
  400. this.activeComponent.componentContent.averageBoxData[x][y].hover = true
  401. // 起终点中间位置激活
  402. if (x >= bx) {
  403. for (let i = bx; i <= x; i++) {
  404. if (y >= by) {
  405. for (let j = by; j <= y; j++) {
  406. this.activeComponent.componentContent.averageBoxData[i][j].hover = true
  407. }
  408. } else {
  409. for (let j = y; j <= by; j++) {
  410. this.activeComponent.componentContent.averageBoxData[i][j].hover = true
  411. }
  412. }
  413. }
  414. } else {
  415. for (let i = x; i <= bx; i++) {
  416. if (y >= by) {
  417. for (let j = by; j <= y; j++) {
  418. this.activeComponent.componentContent.averageBoxData[i][j].hover = true
  419. }
  420. } else {
  421. for (let j = y; j <= by; j++) {
  422. this.activeComponent.componentContent.averageBoxData[i][j].hover = true
  423. }
  424. }
  425. }
  426. }
  427. this.endAverageBox = [x, y] // 记录结束位置
  428. this.activeComponent.componentContent.averageBoxData = this.activeComponent.componentContent.averageBoxData.concat([]) // 触发视图更新
  429. }
  430. },
  431. // 计算有没有经过有占用的位置
  432. isBoxTakeUp (x, y) {
  433. if (this.beginAverageBox.length !== 0) {
  434. const bx = this.beginAverageBox[0] // 起点X
  435. const by = this.beginAverageBox[1] // 起点Y
  436. let flag = true
  437. if (x >= bx) {
  438. for (let i = bx; i <= x; i++) {
  439. if (y >= by) {
  440. for (let j = by; j <= y; j++) {
  441. if (this.activeComponent.componentContent.averageBoxData[i][j].takeUp) {
  442. flag = false
  443. break
  444. }
  445. }
  446. } else {
  447. for (let j = y; j <= by; j++) {
  448. if (this.activeComponent.componentContent.averageBoxData[i][j].takeUp) {
  449. flag = false
  450. break
  451. }
  452. }
  453. }
  454. }
  455. } else {
  456. for (let i = x; i <= bx; i++) {
  457. if (y >= by) {
  458. for (let j = by; j <= y; j++) {
  459. if (this.activeComponent.componentContent.averageBoxData[i][j].takeUp) {
  460. flag = false
  461. break
  462. }
  463. }
  464. } else {
  465. for (let j = y; j <= by; j++) {
  466. if (this.activeComponent.componentContent.averageBoxData[i][j].takeUp) {
  467. flag = false
  468. break
  469. }
  470. }
  471. }
  472. }
  473. }
  474. return flag
  475. }
  476. },
  477. // 移出盒子清空
  478. averageBoxLeave () {
  479. this.beginAverageBox = []
  480. this.endAverageBox = []
  481. const densityVal = parseInt(this.activeComponent.componentContent.density)
  482. for (let i = 0; i < densityVal; i++) {
  483. for (let j = 0; j < densityVal; j++) {
  484. this.activeComponent.componentContent.averageBoxData[i][j].hover = false
  485. }
  486. }
  487. },
  488. // 删除选中格子
  489. delsSlectedCube (item, index) {
  490. // 清除占用位置
  491. let bx = item.left
  492. let by = item.top
  493. let xl = item.width
  494. let yl = item.height
  495. for (let i = bx; i < bx + xl; i++) {
  496. for (let j = by; j < by + yl; j++) {
  497. this.activeComponent.componentContent.averageBoxData[i][j].takeUp = false
  498. }
  499. }
  500. this.activeComponent.componentContent.imgBoxActive = 0
  501. this.activeComponent.componentContent.imgData.splice(index, 1)
  502. // 重新计算最大高度
  503. const imgData = this.activeComponent.componentContent.imgData
  504. let maxH = 0
  505. for (let i = 0; i < imgData.length; i++) {
  506. if (imgData[i].top + imgData[i].height > maxH) {
  507. maxH = imgData[i].top + imgData[i].height
  508. }
  509. }
  510. this.activeComponent.componentContent.maxH = maxH
  511. }
  512. }
  513. }
  514. </script>
  515. <style lang="scss" scoped>
  516. .customTool {
  517. padding: 20px 20px 0 20px;
  518. h3 {
  519. font-size: 18px;
  520. font-weight: 500;
  521. height: 35px;
  522. line-height: 35px;
  523. color: #333333;
  524. margin-bottom: 20px;
  525. }
  526. .toolBox {
  527. .selectLayTit {
  528. margin-bottom: 20px;
  529. font-size: 14px;
  530. color: #333333;
  531. span {
  532. font-size: 14px;
  533. color: $mainColor;
  534. margin-left: 20px;
  535. }
  536. }
  537. .layoutList {
  538. display: flex;
  539. flex-direction: row;
  540. flex-wrap: wrap;
  541. margin-bottom: 30px;
  542. span {
  543. margin: -1px 0 0 -1px;
  544. flex: 0 0 15.9%;
  545. display: flex;
  546. align-items: center;
  547. justify-content: center;
  548. border: 1px solid #E8EAEC;
  549. color: #999999;
  550. font-size: 18px;
  551. text-align: center;
  552. height: 28px;
  553. cursor: pointer;
  554. position: relative;
  555. &.active,&:hover {
  556. color: $mainColor;
  557. &:after{
  558. content: '';
  559. width: 100%;
  560. height: 100%;
  561. border: 1px solid $mainColor;
  562. position: absolute;
  563. left: 0;
  564. top: 0;
  565. z-index: 2;
  566. }
  567. }
  568. }
  569. }
  570. padding-bottom: 10px;
  571. .flexStyle {
  572. display: flex;
  573. label {
  574. margin-right: 20px;
  575. }
  576. .block {
  577. flex: 1;
  578. }
  579. ::v-deep .el-slider__input {
  580. width: 50px;
  581. }
  582. ::v-deep .el-slider__runway {
  583. height: 4px;
  584. margin: 18px 65px 18px 0;
  585. }
  586. ::v-deep .el-slider__bar {
  587. height: 4px;
  588. }
  589. ::v-deep .el-slider__button-wrapper {
  590. top: -17px;
  591. }
  592. ::v-deep .el-slider__button {
  593. width: 12px;
  594. height: 12px;
  595. }
  596. ::v-deep .el-input-number.is-without-controls .el-input__inner {
  597. padding: 10px;
  598. }
  599. }
  600. .itemBox {
  601. width: 100%;
  602. label {
  603. font-size: 14px;
  604. color: #666666;
  605. height: 40px;
  606. line-height: 40px;
  607. }
  608. margin-bottom: 15px;
  609. p {
  610. font-size: 12px;
  611. color: #666666;
  612. }
  613. .layoutBox {
  614. margin-top: 20px;
  615. display: flex;
  616. .item {
  617. margin: -1px 0 0 -1px;
  618. flex: 0 0 50%;
  619. height: 142px;
  620. border: 1px solid #E8EAEC;
  621. box-sizing: border-box;
  622. display: flex;
  623. align-items: center;
  624. justify-content: center;
  625. cursor: pointer;
  626. position: relative;
  627. &:before {
  628. content: '600像素';
  629. font-size: 12px;
  630. color: #666666;
  631. padding: 0 10px;
  632. text-align: center;
  633. }
  634. .img{
  635. position: absolute;
  636. width: 100%;
  637. height: 100%;
  638. left: 0;
  639. top: 0;
  640. }
  641. &.active {
  642. background: #FBF9F8;
  643. &:before {
  644. color: $mainColor;
  645. }
  646. &:after{
  647. content: '';
  648. width: 100%;
  649. height: 100%;
  650. border: 1px solid $mainColor;
  651. position: absolute;
  652. left: 0;
  653. top: 0;
  654. z-index: 2;
  655. }
  656. }
  657. }
  658. }
  659. .L1 {
  660. .item {
  661. flex: 0 0 100%;
  662. height: 93px;
  663. &:before {
  664. content: '1200像素';
  665. }
  666. }
  667. }
  668. .L3 {
  669. .item {
  670. flex: 0 0 33.3%;
  671. height: 93px;
  672. &:before {
  673. content: '400像素';
  674. }
  675. }
  676. }
  677. .L4 {
  678. .item {
  679. flex:0 0 25%;
  680. height: 71px;
  681. &:before {
  682. content: '300像素';
  683. }
  684. }
  685. }
  686. .T2B2 {
  687. flex-wrap: wrap;
  688. .item {
  689. flex: 0 0 50%;
  690. height: 142px;
  691. &:before {
  692. content: '600x600像素';
  693. }
  694. }
  695. }
  696. .L1R2 {
  697. flex-wrap: wrap;
  698. .item{
  699. &:before {
  700. content: '600x600像素';
  701. }
  702. }
  703. .item:nth-child(1) {
  704. height: 284px;
  705. &:before {
  706. content: '600x1200像素';
  707. }
  708. }
  709. .item:nth-child(3) {
  710. margin-left: 138px;
  711. margin-top: -143px;
  712. }
  713. }
  714. .T1B2 {
  715. flex-wrap: wrap;
  716. .item{
  717. &:before {
  718. content: '600x600像素';
  719. }
  720. }
  721. .item:nth-child(1) {
  722. flex: 0 0 100%;
  723. &:before {
  724. content: '1200x600像素';
  725. }
  726. }
  727. }
  728. .L1T1B2 {
  729. flex-wrap: wrap;
  730. .item{
  731. &:before {
  732. content: '300x300像素';
  733. }
  734. }
  735. .item:nth-child(1) {
  736. &:before {
  737. content: '600x600像素';
  738. }
  739. }
  740. .item:nth-child(2) {
  741. height: 72px;
  742. &:before {
  743. content: '600x300像素';
  744. }
  745. }
  746. .item:nth-child(3) {
  747. flex: 0 0 25%;
  748. height: 72px;
  749. margin: -71px 0 0 138px;
  750. }
  751. .item:nth-child(4) {
  752. margin-top: -71px;
  753. flex: 0 0 25%;
  754. height: 72px;
  755. }
  756. }
  757. .average {
  758. flex-wrap: wrap;
  759. .item {
  760. flex: 0 0 33.33%;
  761. height: 93px;
  762. }
  763. }
  764. .addImgTit {
  765. margin-top: 20px;
  766. color: #FF3737;
  767. font-size: 12px;
  768. }
  769. .addImgBox {
  770. width: 100%;
  771. margin-top: 10px;
  772. box-sizing: border-box;
  773. position: relative;
  774. padding-bottom: 50px;
  775. .addImgBoxInner{
  776. background: #F6F7F9;
  777. display: flex;
  778. }
  779. .addImg {
  780. width: 60px;
  781. height: 60px;
  782. margin-right: 10px;
  783. ::v-deep .el-upload-dragger {
  784. width: 60px;
  785. height: 60px;
  786. text-align: center;
  787. .avatar{
  788. width: 100%;
  789. height: 100%;
  790. }
  791. i {
  792. margin-top: 10px;
  793. }
  794. .el-icon-plus:before {
  795. color: $mainColor;
  796. }
  797. span {
  798. display: block;
  799. font-size: 12px;
  800. color: $mainColor;
  801. }
  802. .tips{
  803. }
  804. }
  805. }
  806. .addLink {
  807. flex:1;
  808. ::v-deep .link-select{
  809. margin-bottom: 0;
  810. line-height: 60px;
  811. width: 100%;
  812. &__warp{
  813. display: flex;
  814. }
  815. .module-box__title{
  816. font-size: 12px;
  817. color: #333333;
  818. margin-bottom: 0;
  819. .module-box__label{
  820. line-height: 60px;
  821. }
  822. }
  823. &__select{
  824. flex: 1;
  825. .el-input__inner {
  826. border: none;
  827. background: none;
  828. font-size: 12px;
  829. color: $mainColor;
  830. }
  831. .el-input__inner::placeholder {
  832. color: $mainColor;
  833. }
  834. .el-icon-arrow-up:before {
  835. color: $mainColor;
  836. }
  837. }
  838. &__confirm{
  839. position: absolute;
  840. bottom: 0;
  841. left: 0;
  842. width: 100%;
  843. }
  844. }
  845. }
  846. }
  847. .averageBoxWarp{
  848. position: relative;
  849. }
  850. .averageBox{
  851. margin-top: 20px;
  852. display: flex;
  853. flex-wrap: wrap;
  854. ul{
  855. li{
  856. margin: -1px 0 0 -1px;
  857. border: 1px solid #E8EAEC;
  858. background-color: #f8f8f8;
  859. &.on{
  860. background-color: #fbbe73;
  861. }
  862. }
  863. &.col4{
  864. flex: 0 0 25%;
  865. li{
  866. height: 70px;
  867. }
  868. }
  869. &.col5{
  870. flex: 0 0 20%;
  871. li{
  872. height: 56px;
  873. }
  874. }
  875. &.col6{
  876. flex: 0 0 16.6%;
  877. li{
  878. height: 46px;
  879. }
  880. }
  881. &.col7{
  882. flex: 0 0 14.2%;
  883. li{
  884. height: 40px;
  885. }
  886. }
  887. &.col10{
  888. flex: 0 0 10%;
  889. li{
  890. height: 29px;
  891. }
  892. }
  893. }
  894. }
  895. .selectedCube{
  896. li{
  897. position: absolute;
  898. font-size: 12px;
  899. border: 1px solid #E8EAEC;
  900. background-color: #fff;
  901. z-index: 2;
  902. margin: -1px 0 0 -1px;
  903. box-sizing: content-box;
  904. .box{
  905. width: 100%;
  906. height: 100%;
  907. display: flex;
  908. justify-content: center;
  909. align-items: center;
  910. cursor: pointer;
  911. }
  912. span{
  913. /*transform: scale(0.9);*/
  914. /*white-space: nowrap;*/
  915. /*text-align: center;*/
  916. }
  917. .img{
  918. position: absolute;
  919. width: 100%;
  920. height: 100%;
  921. left: 0;
  922. top: 0;
  923. }
  924. .btn-close{
  925. position: absolute;
  926. top: -10px;
  927. right: -10px;
  928. z-index: 4;
  929. cursor: pointer;
  930. opacity: 0.6;
  931. font-size: 20px;
  932. display: none;
  933. }
  934. &.active {
  935. z-index: 3;
  936. background: #FBF9F8;
  937. &:hover{
  938. .btn-close{
  939. display: block;
  940. }
  941. }
  942. span {
  943. color: $mainColor;
  944. }
  945. &:after{
  946. content: '';
  947. width: 100%;
  948. height: 100%;
  949. border: 1px solid $mainColor;
  950. position: absolute;
  951. left: 0;
  952. top: 0;
  953. z-index: 2;
  954. }
  955. }
  956. }
  957. }
  958. }
  959. .textTit {
  960. height: 35px;
  961. line-height: 35px;
  962. font-size: 16px;
  963. color: #333333;
  964. margin-top: 30px;
  965. font-weight: bold;
  966. }
  967. }
  968. .densityLiist{
  969. display: flex;
  970. justify-content: space-between;
  971. dt{
  972. line-height: 40px;
  973. }
  974. }
  975. }
  976. .terminal1,.terminal2,.terminal3{
  977. &.customTool {
  978. .toolBox {
  979. .itemBox {
  980. .layoutBox {
  981. .item {
  982. &:before {
  983. content: '360像素';
  984. }
  985. }
  986. }
  987. .L1 {
  988. .item {
  989. &:before {
  990. content: '720像素';
  991. }
  992. }
  993. }
  994. .L3 {
  995. .item {
  996. &:before {
  997. content: '240像素';
  998. }
  999. }
  1000. }
  1001. .L4 {
  1002. .item {
  1003. &:before {
  1004. content: '180像素';
  1005. }
  1006. }
  1007. }
  1008. .T2B2 {
  1009. .item {
  1010. &:before {
  1011. content: '360x360像素';
  1012. }
  1013. }
  1014. }
  1015. .L1R2 {
  1016. .item{
  1017. &:before {
  1018. content: '360x360像素';
  1019. }
  1020. }
  1021. .item:nth-child(1) {
  1022. &:before {
  1023. content: '360x720像素';
  1024. }
  1025. }
  1026. }
  1027. .T1B2 {
  1028. .item{
  1029. &:before {
  1030. content: '360x360像素';
  1031. }
  1032. }
  1033. .item:nth-child(1) {
  1034. &:before {
  1035. content: '720x360像素';
  1036. }
  1037. }
  1038. }
  1039. .L1T1B2 {
  1040. .item{
  1041. &:before {
  1042. content: '180x180像素';
  1043. }
  1044. }
  1045. .item:nth-child(1) {
  1046. &:before {
  1047. content: '360x360像素';
  1048. }
  1049. }
  1050. .item:nth-child(2) {
  1051. &:before {
  1052. content: '360x180像素';
  1053. }
  1054. }
  1055. }
  1056. }
  1057. }
  1058. }
  1059. }
  1060. </style>