vant的picker組件設(shè)置文字超長(zhǎng)滾動(dòng)方式
picker組件設(shè)置文字超長(zhǎng)滾動(dòng)
我們的手機(jī)端使用vant來做前端UI框架。
今天在使用vant的picker組件時(shí)候,遇到了一個(gè)問題。當(dāng)文字過長(zhǎng)的時(shí)候,vant的處理方式是ellipsis,超長(zhǎng)部分顯示【…】
如果恰好省略號(hào)前邊內(nèi)容相同,用戶就無法區(qū)分選項(xiàng)了。如圖:

vant沒有提供滾動(dòng)的實(shí)現(xiàn)方式,所以我們自己兼容實(shí)現(xiàn)一下。
首先,打開開發(fā)者工具看下dom結(jié)構(gòu)

我的思路是,如果在選中狀態(tài)下,內(nèi)層文字div長(zhǎng)度大于外層的時(shí)候。給內(nèi)層增加一個(gè)滾動(dòng)動(dòng)畫效果。
實(shí)現(xiàn)如下:
- 重寫.van-ellipsis兩個(gè)樣式,去掉ellipsis效果和overflow:hidden
- 監(jiān)聽picker的change事件
- 在dom渲染結(jié)束之后,獲取.van-picker-column__item–selected并判斷它與內(nèi)部文字的寬度
- 如果內(nèi)部組件寬度大于外部,在添加一個(gè)animation
<template>
<div id="app">
<van-picker show-toolbar title="標(biāo)題" :columns="columns" @change="checkScroll" />
</div>
</template>
<script>
export default {
name: 'App',
data () {
return {
columns: [{
text: '浙江',
children: [{
text: '溫州溫州溫州溫州溫州溫州溫州-杭州',
children: [{ text: '西湖區(qū)' }, { text: '余杭區(qū)' }],
}, {
text: '溫州溫州溫州溫州溫州溫州溫州-溫州',
children: [{ text: '鹿城區(qū)' }, { text: '甌海區(qū)' }],
}]
}]
}
},
methods: {
checkScroll () {
this.$nextTick(() => {
// 獲取選中元素
let selectedItems = [...document.querySelectorAll('.van-picker-column__item--selected')]
selectedItems.forEach(item => {
let child = item.querySelector('.van-ellipsis')
if (child.offsetWidth > item.offsetWidth) { // 判斷child文字寬度
item.classList.add('scroll')
} else {
item.classList.remove('scroll')
}
})
})
}
}
}
</script><style lang="less" scoped>
/deep/ .van-picker-column__item--selected {
/* 重寫選中后的效果 */
.van-ellipsis {
text-overflow: unset;
overflow: visible;
}
/* 增加scroll類 */
&.scroll > .van-ellipsis {
animation: move 4s linear infinite;
}
}
@keyframes move {
0% { transform: translateX(100%); }
100% { transform: translateX(-100%); }
}
</style>這樣,當(dāng)滾動(dòng)picker選中文字超長(zhǎng)的時(shí)候,選中項(xiàng)就會(huì)出現(xiàn)滾動(dòng)效果。

vant_picker_選擇器(搭配彈出層使用)
<van-field
readonly
clickable
label="城市"
:value="value"
placeholder="選擇城市"
@click="showPicker = true"
/>
<van-popup v-model="showPicker" round position="bottom">
<van-picker
show-toolbar
:columns="columns"
value-key="name"
@cancel="showPicker = false"
@confirm="onConfirm"
/>
</van-popup>
<!--
重點(diǎn):自定義value-key屬性:默認(rèn)值是text
value-key這個(gè)屬性是自定義后臺(tái)返回字段作為選擇器顯示的內(nèi)容,這樣后臺(tái)返回的字段位未name時(shí),也可以顯示了。
否則默認(rèn)的原始對(duì)象默認(rèn)是[{text:'選項(xiàng)一',value:'1'},{text:'選項(xiàng)二',value:'2'}]
-->以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue+elementUI多表單同時(shí)提交及表單校驗(yàn)最新解決方案
假設(shè)有一個(gè)頁(yè)面,需要分三步填寫三個(gè)表單,且每個(gè)表單位于獨(dú)立的組件中,然后最后保存同時(shí)提交,如何進(jìn)行表單必填項(xiàng)校驗(yàn),下面小編給大家介紹vue+elementUI多表單同時(shí)提交及表單校驗(yàn)最新解決方案,感興趣的朋友一起看看吧2024-03-03
Vue中Video標(biāo)簽播放解析后短視頻去水印無響應(yīng)解決
這篇文章主要為大家介紹了Vue中使用Video標(biāo)簽播放?<解析后的短視頻>去水印視頻無響應(yīng)的解決方式,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04
vue大型項(xiàng)目之分模塊運(yùn)行/打包的實(shí)現(xiàn)
這篇文章主要介紹了vue大型項(xiàng)目之分模塊運(yùn)行/打包的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
使用vue實(shí)現(xiàn)HTML頁(yè)面生成圖片的方法
這篇文章主要介紹了使用vue實(shí)現(xiàn)HTML頁(yè)面生成圖片的相關(guān)知識(shí),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
淺談Vue.nextTick 的實(shí)現(xiàn)方法
本篇文章主要介紹了Vue.nextTick 的實(shí)現(xiàn)方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-10-10
vue3 組合式API defineEmits() 與 emits 組
在Vue中,defineEmits()是Vue3組合式API中用于聲明自定義事件的,而emits選項(xiàng)則用于Vue2和Vue3的選項(xiàng)式API中,defineEmits()允許使用字符串?dāng)?shù)組或?qū)ο笮问铰暶魇录?emits選項(xiàng)也支持這兩種形式,且驗(yàn)證函數(shù)可以驗(yàn)證事件參數(shù),這兩種方法都是為了更規(guī)范地在組件間通信2024-09-09
Vue中@keyup.enter?@v-model.trim的用法小結(jié)
這篇文章主要介紹了Vue中@keyup.enter?@v-model.trim的用法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-12-12

