tm-col.vue 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. <!-- 需要配合,tm-row使用。,也可以单独使用。tm-col -->
  2. <template >
  3. <view class="tm-col" :class="[widths?'':'tm-col-'+grid, 'ma-' + margin,'mb-'+bma[1],'mx-'+bma[0]]"
  4. :style="{
  5. width:widths,
  6. order: order,
  7. verticalAlign: align,
  8. }">
  9. <view class="tm-col-body " @click="click" :style="{
  10. textAlign:justify
  11. }" :class="['pa-' + padding, aligns,` ${customClass} `,'round-'+round,color]"><slot></slot></view>
  12. </view>
  13. </template>
  14. <script>
  15. /**
  16. * 栅格排版COL
  17. * @description 请注意,可以单独使用,也可搭配row使用。
  18. * @property {String} color = [white|blue] 主题颜色名称更多请见文档
  19. * @property {String} align = [top|bottom|middle] 默认top,内容纵向对齐方式
  20. * @property {String} justify = [left|right|center] 内容横向对齐方式
  21. * @property {String|Number} width = [100%] 宽度,可以是数字其它百分比,数字时单位为upx
  22. * @property {String|Number} grid = [1|2|3|6|12] 列宽默认1 1-12自动计算百分比。
  23. * @property {String|Number} padding = [0] 内间距默认0
  24. * @property {String|Number} margin = [0] 外间距默认0
  25. * @property {String} custom-class = [] 自定义类。
  26. * @property {Number} round = [] 默认:0,圆角。
  27. * @property {Function} click = [] 点击事件
  28. * @property {Number} maxCol = [] 默认:12,布局的列表,比如我想一行5个,就可以用到此属性,设置为10,然后grid=2即可。
  29. * @property {String|Number} order = [0|1|2|3|4] 排列的顺序 默认0 可以是1-12的数字或者字符串
  30. */
  31. export default {
  32. props: {
  33. // 自定义类。
  34. customClass: {
  35. type: String,
  36. default: ''
  37. },
  38. // 圆角。
  39. round: {
  40. type: String|Number,
  41. default: '0'
  42. },
  43. // 主题色。
  44. color: {
  45. type: String,
  46. default: ''
  47. },
  48. // 自定义宽度。可以是数字,单位如:100vw,5%,auto,优先级高于grid
  49. width: {
  50. type: String | Number,
  51. default: ''
  52. },
  53. // 列宽1-12自动计算百分比。
  54. grid: {
  55. type: String | Number,
  56. default: 1
  57. },
  58. // 内间距。
  59. padding: {
  60. type: String | Number,
  61. default: '0'
  62. },
  63. // 外间距。
  64. margin: {
  65. type: String | Number,
  66. default: '0'
  67. },
  68. // 子项目横向对齐方式。 left|right|center
  69. justify:{
  70. type:String,
  71. default:'center'
  72. },
  73. // 子项目纵向对齐方式。 top|bottom|middle
  74. align:{
  75. type:String,
  76. default:'top'
  77. },
  78. // 排列的顺序。
  79. order: {
  80. type: String | Number,
  81. default: '0'
  82. },
  83. maxCol:{
  84. type:Number,
  85. default:12
  86. }
  87. },
  88. data() {
  89. return {
  90. widths:'',
  91. bma:[0,0],
  92. };
  93. },
  94. computed: {
  95. maxCol_count:function() {
  96. return this.maxCol||12;
  97. },
  98. aligns: function() {
  99. if(this.justify == 'left') return 'flex-start';
  100. if(this.justify == 'right') return 'flex-end';
  101. if(this.justify == 'center') return 'flex-center';
  102. },
  103. },
  104. async mounted() {
  105. let pd = this.$tm.getParentAttr("tm-row",'gutter',this.$parent);
  106. if(pd) this.bma = pd;
  107. this.$nextTick(function(){
  108. this.c_width();
  109. })
  110. },
  111. methods: {
  112. click(e){
  113. this.$emit('click',e);
  114. },
  115. c_width() {
  116. let t = this;
  117. // 如果有自定义宽度,优先使用自定的宽度,否则使用grid的比例。
  118. if (t.width.indexOf('%') > -1 || t.width.indexOf('vw') > -1 || t.width.indexOf('vh') > -1) {
  119. t.widths = t.width;
  120. return ;
  121. }
  122. if (t.width === 'auto') {
  123. t.widths = "100%";
  124. return;
  125. }
  126. if (!isNaN(parseFloat(t.width))) {
  127. t.widths = uni.upx2px(parseInt(t.width)) + 'px';
  128. return ;
  129. }
  130. t.widths = (parseInt(t.grid) / t.maxCol_count) * 100 + '%';
  131. // console.log(t.maxCol_count);
  132. }
  133. },
  134. };
  135. </script>
  136. <style lang="scss" scoped>
  137. .tm-col{
  138. height: inherit;
  139. display: inline-block;
  140. // #ifndef H5
  141. height: 100%;
  142. // #endif
  143. .tm-col-body{
  144. display: block;
  145. }
  146. }
  147. </style>