做换行内容的注意点

833 阅读1分钟

需求

下面的列表有两种思路,一个是用inline-block来做,一个是用flex。

我这里两种都试了一下,代码其实差不多的,总结几个注意点。

注意点

inline-block/flex会触发BFC

其实这里margin塌陷是我们希望的,那就只需要一个margin: 12px就齐活。

但是没办法有BFC,margin是会叠加的,这就只能在偶数个元素上加一个类来把margin-left消掉了。我在Vue里是这么做的。

<div class="content">
    <div
        v-for="(item, idx) in selected"
        :key="idx"
        class="list-item"
        :class="{'right-item': idx % 2}"
        :style="{width: itemWidth + 'px'}"
    >
        {{item}}
        <div class="del">
        </div>
    </div>
</div>

每行只有两个item的实现

设计稿上所有的间隔都是12px,我期望实现在所有宽度上都能准确地显示两个条目。

核心是需要计算条目的宽度,为了方便,我把整体的width作为一个prop来让用户指定并给一个默认值。

这个项目是用TS写的,稍后会写一篇Vue + TS的工程实践总结,非常得爽,墙裂安利

import { Vue, Component, Prop, Model } from 'vue-property-decorator'

@Component
export default class selectedList extends Vue {
    @Prop({ type: Number, default: 480 }) width
    get itemWidth () {
        return (this.width - 12 * 3) / 2
    }
}

这个元素记得用boder-box,不然计算出来的宽度不是总宽度

border-box的坑

这里单单计算width是不行的,会分行,就像这样。

border-box中border是占宽度的,所以需要加一个margin: -1px把border的宽度抵消掉。