customTool.vue 32 KB

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