123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- <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>
|