integrated_traffic_uniapp/node_modules/@dcloudio/uni-ui/lib/uni-row/uni-row.vue

191 lines
3.8 KiB
Vue
Raw Normal View History

2024-02-06 15:39:22 +08:00
<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配置后不生效
// 此处用法无法使用
/* #ifdef MP-WEIXIN || MP-TOUTIAO || MP-QQ */
:host {
display: block;
}
/* #endif */
</style>