選項(xiàng)菜單自動(dòng)換行的簡(jiǎn)單實(shí)現(xiàn)(Vue)

在做列表篩選的時(shí)候經(jīng)常會(huì)按照不同的維度來(lái)過(guò)濾篩選數(shù)據(jù),多標(biāo)簽可供選擇就比較常見(jiàn),但是標(biāo)簽較多時(shí),就涉及到選項(xiàng)標(biāo)簽的展開(kāi)與折疊,這與展示區(qū)域、選項(xiàng)個(gè)數(shù)有關(guān)系,下面的實(shí)現(xiàn)就是解決了頁(yè)面寬度不確定、標(biāo)簽個(gè)數(shù)不確定、標(biāo)簽寬度不確定時(shí)的自動(dòng)折疊。

效果示意

實(shí)現(xiàn)思路:

  • 選項(xiàng)展示區(qū)采用flex布局,允許換行;
  • 選項(xiàng)高度固定,默認(rèn)狀態(tài)下,選強(qiáng)展示區(qū)的高度就是單個(gè)選項(xiàng)的高度;
  • 采用展示區(qū)域的max-height來(lái)控制展開(kāi)、收起狀態(tài);
  • 監(jiān)聽(tīng)到選項(xiàng)數(shù)組變化、瀏覽器窗口大小變化時(shí),重新判斷是否需要展示“更多”
  • 采用子選項(xiàng)的長(zhǎng)度總和與選項(xiàng)展示區(qū)域?qū)挾缺容^的方式確定選項(xiàng)是否換行,是否要顯示“更多”

主要特點(diǎn):
1.不需要考慮選項(xiàng)的個(gè)數(shù),即展開(kāi)、收起操作時(shí),選項(xiàng)數(shù)組不會(huì)變化,不需要干預(yù);
2.采用CSS實(shí)現(xiàn)樣式的控制,選項(xiàng)寬度無(wú)限制,按需修改樣式可實(shí)現(xiàn)等寬、不等寬的需求;
3.可實(shí)時(shí)按照瀏覽器窗口大小來(lái)調(diào)整布局,并按需展示“更多”;
4.不同的需求,包括PC、手機(jī)的不同要求,可用css來(lái)調(diào)整。

主要實(shí)現(xiàn)如下(示例代碼是作為一個(gè)可復(fù)用組件方式實(shí)現(xiàn)的):

<template>
  <div class="searchbar-container">
    <span class="condition-title">{{ title }}</span>

    <div ref="search-option-container" :class="['search-option-container', isExpand ? 'search-option-container-expand' : '']">

      <div class="condition-option-frame">
        <span :class="['condition-option', value == '' ? 'condition-option-selected' : '']" @click="handleSelect('')">全部</span>
      </div>

      
        <div class="condition-option-frame" v-for="(op, index) in options" :key="index" :content="op"  @click="handleSelect(`${op}`)">
          <span :class="[`${optionClassName}`, 'condition-option', (optionValueKey ? op[optionValueKey] : op) === value ? 'condition-option-selected' : '' ]">{{ optionlabelKey ? op[optionlabelKey] : op }}</span>
        </div>

    </div>

    <div class="condition-option-more">
      <div v-if="showToggle" @click="handleMore">
        {{ isExpand ? '收起' : '更多'}}<i :class="[isExpand ? 'el-icon-arrow-up' : 'el-icon-arrow-down']"></i>
      </div>
    </div>
  </div>
</template>
<script>

export default {
  name: 'SearchOptionsAutoFold',
  props: {
    title: {
      type: String,
      default: '工業(yè)大類'
    },
    prop: {
      type: String,
      default: ''
    },
    value: {
      type: String,
      default: ''
    },
    optionClassName: {
      type: String,
      default: ''
    },
    options: {
      type: Array,
      default: function () {
        return ["煤炭開(kāi)采和洗選業(yè)", "石油和天然氣開(kāi)采業(yè)", "黑色金屬礦采選業(yè)", "有色金屬礦采選業(yè)", "非金屬礦采選業(yè)", "其他采礦業(yè)", "農(nóng)副食品加工業(yè)", "食品制造業(yè)", "飲料制造業(yè)", "煙草制品業(yè)", "紡織業(yè)", "紡織服裝、鞋、帽制造業(yè)", "皮革、毛皮、羽毛(絨)及其制品業(yè)", "木材加工及木、竹、藤、棕、草制品業(yè)", "家具制造業(yè)", "造紙及紙制品業(yè)", "印刷業(yè)和記錄媒介的復(fù)制", "文教體育用品制造業(yè)", "石油加工、煉焦及核燃料加工業(yè)", "化學(xué)原料及化學(xué)制品制造業(yè)", "醫(yī)藥制造業(yè)", "化學(xué)纖維制造業(yè)", "橡膠制品業(yè)", "塑料制品業(yè)", "非金屬礦物制品業(yè)", "黑色金屬冶煉及壓延加工業(yè)", "有色金屬冶煉及壓延加工業(yè)", "金屬制品業(yè)", "通用設(shè)備制造業(yè)", "專用設(shè)備制造業(yè)", "交通運(yùn)輸設(shè)備制造業(yè)", "電氣機(jī)械及器材制造業(yè)", "通信設(shè)備、計(jì)算機(jī)及其他電子設(shè)備制造業(yè)", "儀器儀表及文化、辦公用機(jī)械制造業(yè)", "工藝品及其他制造業(yè)", "廢棄資源和廢舊材料回收加工業(yè)", "電力、熱力的生產(chǎn)和供應(yīng)業(yè)", "燃?xì)馍a(chǎn)和供應(yīng)業(yè)", "水的生產(chǎn)和供應(yīng)業(yè)"];
      }
    },
    optionlabelKey: {
      type: String,
      default: ''
    },
    optionValueKey: {
      type: String,
      default: ''
    },
  },
  data() {
    return {
      showToggle: false,
      isExpand: false
    }
  },
  watch: {
    options(val, oldVal) {
      if (val.length > 0) {
        this.refreshViews();
      }
    }
  },
  mounted() {
    if (this.options.length > 0) {
      this.refreshViews();
    }
    window.onresize = () => {
      this.refreshViews();
    }
  },
  methods: {
    handleMore() {
      this.isExpand = !this.isExpand
    },
    handleSelect(value) {
      this.$emit('handleSelect', this.prop, value)
    },
    refreshViews() {
      this.$nextTick(() => { // 頁(yè)面渲染完成后的回調(diào)

        let containerClientWidth = this.$refs['search-option-container'].clientWidth;
        let length = this.$refs['search-option-container'].children.length;

        console.log('containerClientWidth==>' + containerClientWidth)
        console.log('length==>' + length)
        let totalWidth = 0;
        for (let i = 0; i < length; i++) {
          totalWidth = totalWidth + this.$refs['search-option-container'].children[i].clientWidth
        }
        // 存在更多選項(xiàng)
        this.showToggle = totalWidth > containerClientWidth;
      })
    }
  }
}
</script>
<style scoped>
.searchbar-container {
  padding: 4px 0px;
  display: flex;
  align-items: center;
}
.condition-title {
  font-weight: bold;
  width: 5em;
  flex-shrink: 0;
}
.search-item-container {
  flex-grow: 1;
  display: flex;
  flex-wrap: wrap;
}

.search-option-container {
  flex-grow: 1;
  display: flex;
  flex-wrap: wrap;
  max-height: 30px;
  overflow: hidden;
}

.search-option-container-expand {
  max-height: 500px;
}

.condition-option-frame {
  padding: 0px 8px;
  margin: 0px;
  height: 30px;
  display: flex;
  align-items: center;
}

.condition-option {
  /* 是否需要等長(zhǎng) */
  width: 5em;
  display: -webkit-box !important;
  overflow: hidden;
  text-overflow: ellipsis;
  word-break: break-all;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 1;
  text-align: center;
  cursor: pointer;
}
/* 單個(gè)字母 */
.condition-option-letter {
  width: 1em;
}

.condition-option-selected {
  color: var(--color-primary);
  font-weight: bold;
}

.condition-option-more {
  padding-top: 5px;
  width: 66px;
  align-self: baseline;
  flex-shrink: 0;
  color: var(--color-primary);
}
.condition-option-more > div {
  display: flex;
  justify-content: flex-end;
  align-items: center;
}

/* 窄屏設(shè)備 */
@media only screen and (max-width: 992px) {
}
</style>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,406評(píng)論 6 538
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,034評(píng)論 3 423
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 177,413評(píng)論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 63,449評(píng)論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,165評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 55,559評(píng)論 1 325
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,606評(píng)論 3 444
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 42,781評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,327評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,084評(píng)論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,278評(píng)論 1 371
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,849評(píng)論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,495評(píng)論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 34,927評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 36,172評(píng)論 1 291
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,010評(píng)論 3 396
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,241評(píng)論 2 375

推薦閱讀更多精彩內(nèi)容