一 網易嚴選分類效果圖
分析:
- 共3級分類,正常頁面1級分類顯示2,3級分類彈窗隱藏,當鼠標移到1級分類上面,下面的2,3級分類彈窗顯示
- 鼠標可以從一級分類順滑移入到下面彈窗2,3級分類,且彈窗一直顯示
- 當鼠標移出分類范圍,2,3級分類彈窗隱藏
二 思路分析
- 最開始想的是使用鼠標移入移出事件: mouseover,mouseout,實現了一下,發現在1級分類與2,3級分類之間移入時,彈窗總是先隱藏,比較麻煩,故舍棄
- 最后決定使用 css 的 hover 屬性,關鍵是:最開始的彈窗需要隱藏,用哪種方式? display:none、visibility:hidden、opacity:0、overflow:hidden;
- 先后使用了 opacity:0、overflow:hidden 這2種,出現一個bug: 從任何1級分類往下移,都只展示1級分類最后一個的2,3級分類,如下圖:
從彩妝護膚往下移鼠標,就變成了海鮮水產的2,3級分類了
但是使用 display:none、visibility:hidden 這兩個屬性,問題就不存在了
三 實現核心代碼
html:

<!-- 分類 --> <li v-for="(item,i) in categoryList" :key="i" class="categoryBox" :class="{'active':i === choosePage}" @click="goCategoryPage(item.id,i)" @mouseover="mouseoverEvent(item.children)" > <div class="categoryName cursor">{{item.categoryName}}</div> <ul class="categoryList2" ref="categoryPopRef"> <li v-for="(stem,d) in categoryList2" :key="d" class="categoryItem2" > <div class="categoryName2 cursor" @click="goCategoryPage(stem.id,i)" >{{stem.categoryName}}</div> <ul class="categoryList3"> <li v-for="(titem,t) in stem.children" :key="t" class="categoryItem3" @click="goCategoryPage(titem.id,i)" > <div class="categoryName3 cursor">{{titem.categoryName}}</div> </li> </ul> </li> </ul> </li>
css:

li { padding-left: 2px; padding-right: 30px; &.categoryBox { // background: rgba(0, 0, 0, 0.5); color: #666; .categoryName { font-weight: bold; position: relative; } .categoryList2 { position: absolute; min-width: 100%; max-width: 120%; top: 70px; left: 50%; transform: translateX(-50%); background-color: #fff; display: flex; padding: 20px 30px; min-height: 200px; border: 1px solid #dcdcdc; color: #666; display: none; // visibility:hidden; .categoryItem2 { // background: rgba(0, 0, 0, 0.5); margin-right: 20px; font-size: 16px; min-width: 100px; max-width: 200px; line-height: 36px; .categoryName2 { font-weight: bold; min-width: 100px; max-width: 200px; border-bottom: 1px solid #bdbdbd; &:hover { // color: #5683ea; color: #f4364c; } } .categoryList3 { padding: 20px 0; // width: 100%; display: flex; flex-wrap: wrap; max-height: 400px; overflow-x: hidden; overflow-y: auto; -webkit-overflow-scrolling: touch; .categoryItem3 { .categoryName3 { font-weight: normal; width: 100px; // background: rgba(0, 0, 0, 0.5); margin-right: 10px; font-size: 15px; line-height: 26px; &:hover { // color: #5683ea; color: #f4364c; } } } } } } &:hover { .categoryName{ color: #f4364c; } .categoryList2 { display: flex; // visibility: visible; } } &.active { font-weight: bold; color: #666; } } }
四 知識梳理
display:none、visibility:hidden、opacity:0、overflow:hidden之間區別:
- display:none 隱藏元素,不占網頁中的任何空間,讓這個元素徹底消失(看不見也摸不着)
- visibility:hidden,opacity:0 他是把那個層隱藏了,也就是你看不到它的內容但是它內容所占據的空間還是存在的。(看不見但摸得到)
- overflow:hidden 讓超出的元素隱藏,就是在設置該屬性的時候他會根據你設置的寬高把多余的那部分剪掉
分享一刻:
今年5月是 Java 語言誕生25周年,JetBrains 公司在官方博客里面,總結了 Java 語言的25個優點。