|
|
<template> <view :class="[ 'uni-row', typeClass , justifyClass, alignClass, ]" :style="{ marginLeft:`${Number(marginValue)}rpx`, marginRight:`${Number(marginValue)}rpx`, }"> <slot></slot> </view> </template>
<script> const ComponentClass = 'uni-row'; const modifierSeparator = '--'; /** * Row 布局-行 * @description 流式栅格系统,随着屏幕或视口分为 24 份,可以迅速简便地创建布局。 * @tutorial https://ext.dcloud.net.cn/plugin?id=3958
* * @property {gutter} type = Number 栅格间隔 * @property {justify} type = String flex 布局下的水平排列方式 * 可选 start/end/center/space-around/space-between start * 默认值 start * @property {align} type = String flex 布局下的垂直排列方式 * 可选 top/middle/bottom * 默认值 top * @property {width} type = String|Number nvue下需要自行配置宽度用于计算 * 默认值 750 */
export default { name: 'uniRow', componentName: 'uniRow', // #ifdef MP-WEIXIN
options: { virtualHost: true // 在微信小程序中将组件节点渲染为虚拟节点,更加接近Vue组件的表现,可使用flex布局
}, // #endif
props: { type: String, gutter: Number, justify: { type: String, default: 'start' }, align: { type: String, default: 'top' }, // nvue如果使用span等属性,需要配置宽度
width: { type: [String, Number], default: 750 } }, created() { // #ifdef APP-NVUE
this.type = 'flex'; // #endif
}, computed: { marginValue() { // #ifndef APP-NVUE
if (this.gutter) { return -(this.gutter / 2); } // #endif
return 0; }, typeClass() { return this.type === 'flex' ? `${ComponentClass + modifierSeparator}flex` : ''; }, justifyClass() { return this.justify !== 'start' ? `${ComponentClass + modifierSeparator}flex-justify-${this.justify}` : '' }, alignClass() { return this.align !== 'top' ? `${ComponentClass + modifierSeparator}flex-align-${this.align}` : '' } } }; </script>
<style lang="scss"> $layout-namespace: ".uni-"; $row:$layout-namespace+"row"; $modifier-separator: "--";
@mixin utils-clearfix { $selector: &;
@at-root {
/* #ifndef APP-NVUE */ #{$selector}::before, #{$selector}::after { display: table; content: ""; }
#{$selector}::after { clear: both; }
/* #endif */ }
}
@mixin utils-flex ($direction: row) { /* #ifndef APP-NVUE */ display: flex; /* #endif */ flex-direction: $direction; }
@mixin set-flex($state) { @at-root &-#{$state} { @content } }
#{$row} { position: relative; flex-direction: row;
/* #ifdef APP-NVUE */ flex: 1; /* #endif */
/* #ifndef APP-NVUE */ box-sizing: border-box; /* #endif */
// 非nvue使用float布局
@include utils-clearfix;
// 在QQ、字节、百度小程序平台,编译后使用shadow dom,不可使用flex布局,使用float
@at-root {
/* #ifndef MP-QQ || MP-TOUTIAO || MP-BAIDU */ &#{$modifier-separator}flex { @include utils-flex; flex-wrap: wrap; flex: 1;
&:before, &:after { /* #ifndef APP-NVUE */ display: none; /* #endif */ }
@include set-flex(justify-center) { justify-content: center; }
@include set-flex(justify-end) { justify-content: flex-end; }
@include set-flex(justify-space-between) { justify-content: space-between; }
@include set-flex(justify-space-around) { justify-content: space-around; }
@include set-flex(align-middle) { align-items: center; }
@include set-flex(align-bottom) { align-items: flex-end; } }
/* #endif */ }
}
// 字节、QQ配置后不生效
// 此处用法无法使用scoped
/* #ifdef MP-WEIXIN || MP-TOUTIAO || MP-QQ */ :host { display: block; }
/* #endif */ </style>
|