pictureCube.vue 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. <template>
  2. <!-- 图片魔方 -->
  3. <view class="pictureCube skeleton-rect" :style="[boxStyle]" v-if="picList.length&&(imageH>0||style==3)">
  4. <view class="grid_box" :style="[gridColumns]" v-if="[0,1,2,4,5].includes(style)">
  5. <image class="center" v-for="(item,index) in picList" :key="index" @click="goDetail(item)" :src="item.image"
  6. :mode="item.radioVal === '0' ? 'scaleToFill' : item.radioVal === '1' ? 'aspectFit' : 'aspectFill'"
  7. :style="[imageStyle]"></image>
  8. </view>
  9. <view class="advertItem04" v-if="style==3" :style="[widthStyle]">
  10. <view class="item" @click="goDetail(picList[0])">
  11. <image class="img-left center" :src="picList[0].image" :style="[radiusStyle]"
  12. :mode="picList[0].radioVal === '0' ? 'scaleToFill' : picList[0].radioVal === '1' ? 'aspectFit' : 'aspectFill'">
  13. </image>
  14. </view>
  15. <view class="item item-right" :style="[gapStyle]">
  16. <view class="pic" @click="goDetail(picList[1])">
  17. <image class="img-right center" :src="picList[1].image" :style="[radiusStyle]"
  18. :mode="picList[1].radioVal === '0' ? 'scaleToFill' : picList[1].radioVal === '1' ? 'aspectFit' : 'aspectFill'">
  19. </image>
  20. </view>
  21. <view class="pic" @click="goDetail(picList[2])">
  22. <image class="img-right center" :src="picList[2].image" :style="[radiusStyle]"
  23. :mode="picList[2].radioVal === '0' ? 'scaleToFill' : picList[2].radioVal === '1' ? 'aspectFit' : 'aspectFill'">
  24. </image>
  25. </view>
  26. </view>
  27. </view>
  28. </view>
  29. </template>
  30. <script>
  31. // +----------------------------------------------------------------------
  32. // | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
  33. // +----------------------------------------------------------------------
  34. // | Copyright (c) 2016~2025 https://www.crmeb.com All rights reserved.
  35. // +----------------------------------------------------------------------
  36. // | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
  37. // +----------------------------------------------------------------------
  38. // | Author: CRMEB Team <admin@crmeb.com>
  39. // +----------------------------------------------------------------------
  40. export default {
  41. name: 'pictureCube',
  42. props: {
  43. dataConfig: {
  44. type: Object,
  45. default: () => {}
  46. },
  47. },
  48. data() {
  49. return {
  50. picList: this.dataConfig.picStyle.picList,
  51. style: this.dataConfig.tabConfig.tabVal,
  52. prConfig: this.dataConfig.lrConfig.val,
  53. widthC: '',
  54. imageH: 0,
  55. };
  56. },
  57. computed: {
  58. //最外层盒子的样式
  59. boxStyle() {
  60. return {
  61. borderRadius: this.dataConfig.bgStyle.val * 2 + 'rpx',
  62. background: `linear-gradient(${this.dataConfig.bgColor.color[0].item}, ${this.dataConfig.bgColor.color[1].item})`,
  63. margin: this.dataConfig.mbConfig.val * 2 + 'rpx' + ' ' + this.dataConfig.lrConfig.val * 2 + 'rpx' +
  64. ' ' + 0,
  65. padding: this.dataConfig.upConfig.val * 2 + 'rpx' + ' ' + '0' + ' ' + this.dataConfig.downConfig.val *
  66. 2 + 'rpx'
  67. }
  68. },
  69. imageStyle() {
  70. return {
  71. height: this.imageH + 'rpx',
  72. 'border-radius': this.dataConfig.contantStyle.val ? this.dataConfig.contantStyle.val + 'px' :
  73. '0'
  74. }
  75. },
  76. widthStyle(){
  77. return {width :750-this.dataConfig.lrConfig.val * 4 + 'rpx',gap: 2 * this.dataConfig.spaceConfig.val + 'rpx'}
  78. },
  79. radiusStyle(){
  80. return {'border-radius': this.dataConfig.contantStyle.val ? this.dataConfig.contantStyle.val + 'px' :
  81. '0'}
  82. },
  83. gapStyle(){
  84. return{gap: 2 * this.dataConfig.spaceConfig.val + 'rpx',}
  85. },
  86. //图片魔方排版
  87. gridColumns() {
  88. if ([1, 5].includes(this.dataConfig.tabConfig.tabVal)) {
  89. return {
  90. gridTemplateColumns: 'repeat(2, 1fr)',
  91. gap: 2 * this.dataConfig.spaceConfig.val + 'rpx',
  92. }
  93. } else if (this.dataConfig.tabConfig.tabVal == 0) {
  94. return {
  95. gridTemplateColumns: 'repeat(1, 1fr)',
  96. gap: 2 * this.dataConfig.spaceConfig.val + 'rpx',
  97. }
  98. } else if (this.dataConfig.tabConfig.tabVal == 2) {
  99. return {
  100. gridTemplateColumns: 'repeat(3, 1fr)',
  101. gap: 2 * this.dataConfig.spaceConfig.val + 'rpx',
  102. }
  103. } else if (this.dataConfig.tabConfig.tabVal == 4) {
  104. return {
  105. gridTemplateColumns: 'repeat(4, 1fr)',
  106. gap: 2 * this.dataConfig.spaceConfig.val + 'rpx',
  107. }
  108. }
  109. },
  110. },
  111. mounted() {
  112. if (this.picList.length) {
  113. let that = this;
  114. this.$nextTick((e) => {
  115. // 宽度
  116. if (this.style == 0) {
  117. this.widthC = 750
  118. } else if (this.style == 1) {
  119. this.widthC = 375
  120. } else if (this.style == 2) {
  121. this.widthC = 250
  122. } else if (this.style == 4) {
  123. this.widthC = 187.5
  124. }
  125. //高度计算
  126. if (this.style == 5) {
  127. that.$set(that, 'imageH', 187.5);
  128. } else {
  129. let maxHeight = 0
  130. this.picList.forEach((val, index) => {
  131. let height = val.height * ((that.widthC - that.prConfig *
  132. 2) / val
  133. .width)
  134. if (height > maxHeight) {
  135. maxHeight = height
  136. }
  137. })
  138. that.$set(that, 'imageH', maxHeight);
  139. }
  140. })
  141. }
  142. },
  143. methods: {
  144. goDetail(item) {
  145. this.$util.navigateTo(item.link);
  146. }
  147. }
  148. }
  149. </script>
  150. <style lang="scss">
  151. .grid_box {
  152. display: grid;
  153. grid-template-rows: auto;
  154. image {
  155. width: 100%;
  156. }
  157. }
  158. .pictureCube {
  159. uni-image {
  160. width: 100%;
  161. max-width: 100%;
  162. height: 100%;
  163. }
  164. .advertItem04 {
  165. display: grid;
  166. grid-template-columns: repeat(2, 1fr);
  167. .item-right{
  168. display: grid;
  169. grid-template-columns: repeat(1, 1fr);
  170. height: 375rpx;
  171. }
  172. .item{
  173. height: 375rpx;
  174. }
  175. .img-left{
  176. width: 100%;
  177. height: 100%;
  178. }
  179. .img-right{
  180. width: 100%;
  181. height: 100%;
  182. }
  183. }
  184. }
  185. .center {
  186. justify-content: center;
  187. align-items: center;
  188. }
  189. </style>