哈嘍菜谣,大家好珠漂,又到周五啦,今天代碼君要教大家分類頁(yè)面的制作尾膊,廢話不多說(shuō)媳危,先上效果圖
這個(gè)界面布局難度不是很大,css基礎(chǔ)好的冈敛,很快就實(shí)現(xiàn)了待笑,分類界面,左邊是一級(jí)目錄莺债,右邊是一級(jí)目錄對(duì)應(yīng)的二級(jí)目錄滋觉,根據(jù)這個(gè)需求,我們數(shù)據(jù)設(shè)計(jì)的結(jié)構(gòu)一定是數(shù)組嵌套數(shù)組齐邦,第一個(gè)數(shù)組包含一級(jí)目錄數(shù)據(jù)椎侠,嵌套的數(shù)組包含的是二級(jí)目錄的數(shù)據(jù)。
代碼的實(shí)現(xiàn)
- classify.js
Page({
data: {
cateItems: [
{
cate_id: 1,
cate_name: "護(hù)膚",
ishaveChild: true,
children:
[
{
child_id: 1,
name: '潔面皂',
image: "http://mz.djmall.xmisp.cn/files/logo/20161208/148117972563.jpg"
},
{
child_id: 2,
name: '卸妝',
image: "http://mz.djmall.xmisp.cn/files/logo/20161207/148110444480.jpg"
},
{
child_id: 3,
name: '潔面乳',
image: "http://mz.djmall.xmisp.cn/files/logo/20161208/148117973270.jpg"
},
{
child_id: 4,
name: '面部祛角質(zhì)',
image: "http://mz.djmall.xmisp.cn/files/logo/20161208/148117981591.jpg"
}
]
},
{
cate_id: 2,
cate_name: "彩妝",
ishaveChild: true,
children:
[
{
child_id: 1,
name: '氣墊bb',
image: "http://mz.djmall.xmisp.cn/files/logo/20161212/14815381301.jpg"
},
{
child_id: 2,
name: '修容/高光',
image: "http://mz.djmall.xmisp.cn/files/logo/20161212/14815381411.jpg"
},
{
child_id: 3,
name: '遮瑕',
image: "http://mz.djmall.xmisp.cn/files/logo/20161212/148153815181.jpg"
},
{
child_id: 4,
name: '腮紅',
image: "http://mz.djmall.xmisp.cn/files/logo/20161212/148153815759.jpg"
},
{
child_id: 5,
name: '粉餅',
image: "http://mz.djmall.xmisp.cn/files/logo/20161212/148153816983.jpg"
},
{
child_id: 6,
name: '粉底',
image: "http://mz.djmall.xmisp.cn/files/logo/20161212/148153817721.jpg"
},
{
child_id: 7,
name: '蜜粉/散粉',
image: "http://mz.djmall.xmisp.cn/files/logo/20161212/148153819354.jpg"
},
{
child_id: 8,
name: '隔離霜',
image: "http://mz.djmall.xmisp.cn/files/logo/20161215/148179053369.jpg"
}
]
},
{
cate_id: 3,
cate_name: "香水/香氛",
ishaveChild: true,
children:
[
{
child_id: 1,
name: '淡香水EDT',
image: "http://mz.djmall.xmisp.cn/files/logo/20161213/14815978910.jpg"
},
{
child_id: 2,
name: '濃香水EDP',
image: "http://mz.djmall.xmisp.cn/files/logo/20161213/148159789883.jpg"
},
{
child_id: 3,
name: '香體走珠',
image: "http://mz.djmall.xmisp.cn/files/logo/20161213/14815979307.jpg"
},
{
child_id: 4,
name: '古龍香水男士的最愛(ài)',
image: "http://mz.djmall.xmisp.cn/files/logo/20161213/148159765589.jpg"
}
]
},
{
cate_id: 4,
cate_name: "個(gè)人護(hù)理",
ishaveChild: false,
children: []
}
],
curNav: 1,
curIndex: 0
},
//事件處理函數(shù)
switchRightTab: function (e) {
// 獲取item項(xiàng)的id措拇,和數(shù)組的下標(biāo)值
let id = e.target.dataset.id,
index = parseInt(e.target.dataset.index);
// 把點(diǎn)擊到的某一項(xiàng)我纪,設(shè)為當(dāng)前index
this.setData({
curNav: id,
curIndex: index
})
}
})
js的代碼有點(diǎn)長(zhǎng),但是宏觀看一下邏輯就很清晰了
- cateItems 展示的數(shù)據(jù)
- curNav 控制當(dāng)前那個(gè)按鈕點(diǎn)亮
- curIndex 根據(jù)此參數(shù)來(lái)拿第幾個(gè)分類的數(shù)據(jù)
- switchRightTab 分類tab事件的處理
cateItems里的數(shù)據(jù)每一個(gè)對(duì)象都是一個(gè)品類的數(shù)據(jù),拿第一個(gè)品類護(hù)膚來(lái)說(shuō)浅悉,
- cate_id 識(shí)別的id
- cate_name 一級(jí)分類名稱
- ishaveChild 判斷是否有子集
- children 二級(jí)目錄的數(shù)據(jù)
- classify.wxml
<!--主盒子-->
<view class="container">
<!--左側(cè)欄-->
<view class="nav_left">
<block wx:for="{{cateItems}}">
<!--當(dāng)前項(xiàng)的id等于item項(xiàng)的id趟据,那個(gè)就是當(dāng)前狀態(tài)-->
<!--用data-index記錄這個(gè)數(shù)據(jù)在數(shù)組的下標(biāo)位置,使用data-id設(shè)置每個(gè)item的id值术健,供打開(kāi)2級(jí)頁(yè)面使用-->
<view class="nav_left_items {{curNav == item.cate_id ? 'active' : ''}}" bindtap="switchRightTab" data-index="{{index}}" data-id="{{item.cate_id}}">{{item.cate_name}}</view>
</block>
</view>
<!--右側(cè)欄-->
<view class="nav_right">
<!--如果有數(shù)據(jù)汹碱,才遍歷項(xiàng)-->
<view wx:if="{{cateItems[curIndex].ishaveChild}}">
<block wx:for="{{cateItems[curIndex].children}}">
<view class="nav_right_items">
<!--界面跳轉(zhuǎn) -->
<navigator url="../../detail/detail}}">
<image src="{{item.image}}"></image>
<text>{{item.name}}</text>
</navigator>
</view>
</block>
</view>
<!--如果無(wú)數(shù)據(jù),則顯示數(shù)據(jù)-->
<view class="nodata_text" wx:else>該分類暫無(wú)數(shù)據(jù)</view>
</view>
</view>
這里面要講解的有
- nav_left_items {{curNav == item.cate_id ? 'active' : ''}} 在classify.js代碼中已經(jīng)說(shuō)了curNav的作用荞估,就是在這里實(shí)現(xiàn)的咳促,根據(jù)是否和一級(jí)目錄cate_id相同,來(lái)判斷是否點(diǎn)亮文字勘伺。相同執(zhí)行.nav_left_items.active樣式跪腹,不相同則執(zhí)行.nav_left_items樣式
- wx:for 和wx: if的知識(shí)點(diǎn),這放在下面講,請(qǐng)繼續(xù)往下看
- classify.wxss
page{
background: #f5f5f5;
}
/*總體主盒子*/
.container {
position: relative;
width: 100%;
height: 100%;
background-color: #fff;
color: #939393;
}
/*左側(cè)欄主盒子*/
.nav_left{
/*設(shè)置行內(nèi)塊級(jí)元素(沒(méi)使用定位)*/
display: inline-block;
width: 25%;
height: 100%;
/*主盒子設(shè)置背景色為灰色*/
background: #f5f5f5;
text-align: center;
}
/*左側(cè)欄list的item*/
.nav_left .nav_left_items{
/*每個(gè)高30px*/
height: 40px;
/*垂直居中*/
line-height: 40px;
/*再設(shè)上下padding增加高度飞醉,總高42px*/
padding: 6px 0;
/*只設(shè)下邊線*/
border-bottom: 1px solid #dedede;
/*文字14px*/
font-size: 14px;
}
/*左側(cè)欄list的item被選中時(shí)*/
.nav_left .nav_left_items.active{
/*背景色變成白色*/
background: #fff;
color: #f0145a;
}
/*右側(cè)欄主盒子*/
.nav_right{
/*右側(cè)盒子使用了絕對(duì)定位*/
position: absolute;
top: 0;
right: 0;
flex: 1;
/*寬度75%冲茸,高度占滿,并使用百分比布局*/
width: 75%;
height: 1000px;
padding: 10px;
box-sizing: border-box;
background: #fff;
}
/*右側(cè)欄list的item*/
.nav_right .nav_right_items{
/*浮動(dòng)向左*/
float: left;
/*每個(gè)item設(shè)置寬度是33.33%*/
width: 33.33%;
height: 120px;
text-align: center;
}
.nav_right .nav_right_items image{
/*被圖片設(shè)置寬高*/
width: 60px;
height: 60px;
margin-top: 15px;
}
.nav_right .nav_right_items text{
/*給text設(shè)成塊級(jí)元素*/
display: block;
margin-top: 15px;
font-size: 14px;
color: black;
/*設(shè)置文字溢出部分為...*/
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.nodata_text
{
color: black;
font-size: 14px;
text-align: center;
}
這里有個(gè)小技巧分享給大家
- 要設(shè)置字體垂直居中要腫么辦吶缅帘?
看我布局的樣式【.nav_left .nav_left_items】把height與line-height兩個(gè)屬性設(shè)置成一樣的就可以輕松實(shí)現(xiàn)字體垂直居中轴术,但是這個(gè)有局限性,是字體要是單行的股毫,為什么吶膳音,因?yàn)閘ine-height本身就是設(shè)置行高 - 單行文字過(guò)長(zhǎng)部分要用省略號(hào)應(yīng)該如何寫樣式吶召衔? 效果是醬紫 xxxxx...
overflow: hidden;
white-space: nowrap; //設(shè)置單行顯示
text-overflow: ellipsis;
知識(shí)小課堂
-
wx:for
微信小程序列表的渲染铃诬,我們之前做首頁(yè)的時(shí)候就有接觸過(guò)用于循環(huán)數(shù)組,展示列表型數(shù)據(jù)
- 默認(rèn)數(shù)組的當(dāng)前項(xiàng)的下標(biāo)變量名默認(rèn)為index苍凛,數(shù)組當(dāng)前項(xiàng)的變量名默認(rèn)為item
<view wx:for="{{items}}">
{{index}}: {{item.message}}
</view>
- 也可以自定義變量表使用 wx:for-item可以指定數(shù)組當(dāng)前元素的變量名
使用wx:for-index可以指定數(shù)組當(dāng)前下標(biāo)的變量名
<view wx:for="{{array}}" wx:for-index="idx" wx:for-item="itemName">
{{idx}}: {{itemName.message}}
</view>
-
wx:if
微信小程序條件渲染趣席,通常是在if里面寫判斷語(yǔ)句,滿足條件就執(zhí)行這個(gè)view控件醇蝴,通常有if對(duì)應(yīng)就有else宣肚,對(duì)應(yīng)的不滿足if條件就執(zhí)行else對(duì)應(yīng)的view控件
<view wx:if="{{length > 5}}"> 1 </view>
<view wx:elif="{{length > 2}}"> 2 </view>
<view wx:else> 3 </view>
我們要把** wx:if 和 hidden **做對(duì)比,他們都可以實(shí)現(xiàn)讓控件顯示與隱藏悠栓,但是他們有什么區(qū)別吶霉涨,if是當(dāng)滿足條件的時(shí)候才會(huì)渲染view,而hidden是view一定會(huì)被渲染惭适,只不過(guò)控制顯示與隱藏罷了笙瑟,那么我們要如何區(qū)分什么時(shí)機(jī)用什么方法吶?
一般來(lái)說(shuō)癞志,wx:if有更高的切換消耗而hidden有更高的初始渲染消耗往枷。因此,如果需要頻繁切換的情景下,用hidden更好错洁,如果在運(yùn)行時(shí)條件不大可能改變則wx:if較好秉宿。
總結(jié)
好了,分類頁(yè)面的制作完成了屯碴,今天新增一個(gè)知識(shí)小課堂描睦,目的很簡(jiǎn)單,就是想把涉及到的知識(shí)要點(diǎn)歸類整理导而,方便讀者查閱酌摇。今天就到這,祝大家周末愉快~