vue 實現一行展示中,如果超出則中間省略號的布局方式


背景:在實際業務開發中,有個場景需要展示一條路線,但路線節點可能會過多,過多時,需要將中間的節點扣出,用省略號來表示

實現:項目使用vue框架,js實現。

效果:一條路線中,至少要保留首尾2個節點,其他節點放不下則用省略號匯總替換。

圖(1)一般情況下的效果:

 

 

圖(2)只能放收尾2個節點,且末尾節點過長的情況:

 

圖(3)只能放收尾2個節點,且首尾節點都過長的情況:

 

圖(4)只能放收尾2個節點,且開始節點都過長的情況:

(ps: 這種情況下展示效果不是最佳,需要優化,但沒想好方法,有好方案的歡迎補充共享)

 

 

 

代碼塊:

  1 <template lang="pug">
  2 .employeeList
  3   .box-wrap
  4     .list(:class="{'list_flex':list.length===2}")
  5       .item(v-for="(item,index) in list") 
  6         span.text {{item}}
  7         i.el-icon-right(v-if="index!==list.length-1")
  8         // 插入
  9         el-tooltip(v-if="index === insertIndex" effect="dark" placement="bottom")      
 10           .insert
 11             span {{"··· ( "+insertList.length+" )"}}
 12             i.el-icon-right
 13           .insertList(slot="content")
 14             .one(v-for="one in insertList") {{one}}
 15 </template>
 16 <script>
 17 export default {
 18   data() {
 19     return {
 20       list: [
 21         "我第一個超級長***demo名demo名稱名稱名稱名稱名稱名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱名稱名稱名稱名稱名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱名稱名稱名稱名稱名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱名稱名稱名稱名稱名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱名稱名稱名稱名稱名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱稱1",
 22         // "demo名稱名稱名稱名稱名稱名稱1",
 23         "demo名稱名稱名稱名稱名稱名稱2",
 24         "demo名稱名稱名稱名稱名稱名稱3",
 25         "demo名稱名稱名稱名稱名稱名稱4",
 26         "demo名稱5",
 27         "de6",
 28         "demo名稱名稱名稱名稱名稱名稱7",
 29         "demo名稱名稱名稱名稱名稱名稱8",
 30         "demo名稱名稱名稱名稱名稱名稱9",
 31         "demo名稱名稱名稱名稱名稱名稱10",
 32         "demo名稱名稱名稱名稱名稱名稱11",
 33         "demo名稱名稱名稱名稱名稱名稱12",
 34         "demo名稱名稱名稱名稱名稱名稱13",
 35         // "我最后一個超級長*****demo名稱名稱名稱名稱名稱名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱demo名稱13",
 36       ],
 37       insertIndex: 0,
 38       insertList: [],
 39     };
 40   },
 41   mounted() {
 42     this.deal();
 43   },
 44   methods: {
 45     deal() {
 46       let boxWidth = this.$el.querySelector(".box-wrap").offsetWidth - 32;
 47       let listWidth = this.$el.querySelector(".list").scrollWidth;
 48       if (listWidth > boxWidth) {
 49         let index = this.list.length - 2; // 倒數第二個
 50         if (index < 1) {
 51           return;
 52         }
 53         this.insertIndex = index - 1;
 54         this.insertList.unshift(this.list[index]);
 55         this.list.splice(index, 1);
 56         setTimeout(() => {
 57           let newListWidth = this.$el.querySelector(".list").scrollWidth;
 58           if (newListWidth > boxWidth) {
 59             this.deal();
 60           }
 61         });
 62       } else {
 63         console.log(this.insertList, this.list);
 64         return;
 65       }
 66     },
 67   },
 68 };
 69 </script>
 70 <style lang="scss" scoped>
 71 /deep/ * {
 72   box-sizing: border-box;
 73 }
 74 * {
 75   box-sizing: border-box;
 76 }
 77 .employeeList {
 78   background: #fff;
 79   height: 100%;
 80   .box-wrap {
 81     width: 100%;
 82     padding: 0 16px;
 83     .list {
 84       display: inline-block;
 85       overflow: hidden;
 86       white-space: nowrap;
 87       .item {
 88         line-height: 32px;
 89         font-size: 14px;
 90         display: inline-block;
 91         .el-icon-right {
 92           margin: 0 8px;
 93         }
 94         .insert {
 95           display: inline-block;
 96         }
 97       }
 98       &.list_flex {
 99         display: inline-flex;
100         width: 100%;
101         overflow: hidden;
102         .item {
103           display: inline-flex;
104           overflow: hidden;
105           align-items: center;
106           // &:first-child {
107           //   flex: 1;
108           // }
109           &:last-child {
110             flex: 1;
111             min-width: 40%;// 這個是導致只有收尾節點,末尾節點不夠長,后面空白一段,展示效果不是最佳的原因
112           }
113           .text {
114             overflow: hidden;
115             text-overflow: ellipsis;
116           }
117         }
118       }
119     }
120   }
121 }
122 </style>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM