思路整理
功能有两个:
1.tab栏切换:当点击某个li时,切换到对应内容中,li是选中状态(清除点击选项之前的所有状态
2.三级联动:首先插入初始的省份,城市,区域,页面初始时,默认显示的是第一个省份的第一个城市的第一个区域
注意:如果是直辖市,例如北京,没有市,都是区域,此时需要判定城市数组长度==1,城市内容以及tab栏全部隐藏
然后分别设置3个点击事件,当点击省份时,拿到索引,要写入新的城市数据,并且清空上一个,tab栏也要自动更换
点击事件中的tab栏切换和写入省,市,区数据最好能封装函数,代码少很多
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<style>
*{
margin: 0;
padding: 0;
}
a{
text-decoration: none;
color: black;
}
ul{
list-style: none;
}
.clearfix::before,.clearfix::after{
content: "";
display: table;
}
.clearfix::after{
clear: both;
}
.clearfix{
zoom: 1;
}
.wrap{
width: 500px;
height: 300px;
padding: 15px;
border: 1px solid #e0e0e0;
margin: 100px auto;
}
.tab-nav{
height: 30px;
border-bottom: 1px solid #e0e0e0;
}
.tab-nav ul li{
float: left;
width: 70px;
border: 1px solid #e0e0e0;
border-bottom: none;
line-height: 28px;
text-align: center;
font-size: 12px;
position: relative;
}
.tab-nav ul li:nth-child(1),
.tab-nav ul li:nth-child(2){
border-right: none;
}
/* 选中时的样式 */
.tab-nav ul li.active{
font-weight: 700;
background-color: #fff;
}
/*伪元素相当于行标签 */
.tab-nav ul li.active::before{
content: "";
position: absolute;
width: 72px;
height: 0;
top: -1px;
left: -1px;
border-top: 2px solid #f10180;
}
.tab-nav ul li.active::after{
content: "";
position: absolute;
bottom: -3px;
left: -1px;
width: 70px;
border-top: 2px solid #fff;
}
/* 选项卡对应内容、 */
.tab-con{
margin-top: 30px;
}
.tab-con-item{
display: none;
}
.con-show{
display: block;
}
.tab-con-item ul li{
float: left;
width: 68px;
border-bottom: 2px;
}
.tab-con-item ul li a{
display: inline-block;
max-width: 46px;
padding-right: 10px;
padding-left: 10px;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
line-height: 20px;
border: 1px solid #fff;
font-size: 12px;
color: black;
box-sizing: content-box;
}
/* 鼠标悬停 */
.tab-con-item ul li a:hover{
color: #f10180;
border: 1px solid #f10180;
}
.tab-con-item ul li a.selected{
background-color: #f10180;
color: white;
}
</style>
</head>
<body>
<div class="wrap">
<div class="tab-nav">
<ul class="clearfix">
<li class="active">省份</li>
<li>城市</li>
<li>区域</li>
</ul>
</div>
<div class="tab-con">
<div class="tab-con-item prov con-show">
<ul class="clearfix">
</ul>
</div>
<div class="tab-con-item city">
<ul class="clearfix">
</ul>
</div>
<div class="tab-con-item area">
<ul class="clearfix"></ul>
</div>
</div>
</div>
<script src="./js/city_code.js"></script>
<script>
var tabNavs=document.querySelectorAll('.tab-nav ul li')
var tabCons=document.querySelectorAll('.tab-con-item')
var provUl=document.querySelector('.prov ul')
var cityUl=document.querySelector('.city ul')
var areaUl=document.querySelector('.area ul')
//功能1:tab栏切换
var currentIndex=0//一个记录上次索引的变量
for(var i=0;i<tabNavs.length;i++){
//给li添加属性
tabNavs[i].index=i;
//点击tab-nav 中的li
tabNavs[i].onclick=function(){
changeTab(this.index)
}
}
//tab栏切换功能
function changeTab(index) {
//恢复被选中之前li的样式
tabNavs[currentIndex].classList.remove('active')
//隐藏之前选中的con区域
tabCons[currentIndex].classList.remove('con-show')
//设置当前选中li的样式
tabNavs[index].classList.add('active')
//显示被选中的con区域
tabCons[index].classList.add('con-show')
//记录当前点击的li索引
currentIndex=index
}
//功能2:三级联动
// 插入省
var selected_prov_index=0//记录被选中省份a的索引
function bindProvData(data){
for(var i=0;i<data.length;i++){
if (i==0) {//默认选中省份
// 点击A标签不跳转页面,执行JS代码,那么地址栏里写javascript:;就可以
provUl.innerHTML+=`
<li><a href="javascript:;" class="selected" data-index="${i}">${data[i].name}</a></li>
`
selected_prov_index=i
continue;
}
provUl.innerHTML+=`
<li><a href="javascript:;" data-index="${i}">${data[i].name}</a></li>
`
}
}
bindProvData(data);
//插入城市
selected_city_index=0
function bindCityData(provIndex) {
var cityArr=data[provIndex].city;// 默认选中省 的 城市数组
if (cityArr.length==1) {
//隐藏城市tab-nav
tabNavs[1].style.display='none'
}else{
// 普通省份,显示城市tab-bav
tabNavs[1].style.display='block'
// 插入城市
for(var i=0;i<cityArr.length;i++){
if (i==0) {
cityUl.innerHTML+=`
<li><a href="javascript:;" class="selected" data-index="${i}">${cityArr[i].name}</a></li>
`
selected_city_index=i;
continue;
}
cityUl.innerHTML+=`
<li><a href="javascript:;" data-index="${i}">${cityArr[i].name}</a></li>
`
}
}
}
bindCityData(selected_prov_index);
// 插入区域li
selected_area_index=0
function bindAreaData(provIndex,cityIndex) {
var areaArr=data[provIndex].city[cityIndex].area;
for(var i=0;i<areaArr.length;i++){
areaUl.innerHTML+=`
<li><a href="javascript:;" data-index="${i}">${areaArr[i].name}</a></li>
`
}
selected_area_index=0;
}
bindAreaData(selected_prov_index,selected_city_index);
// 3个点击事件所作事情不一样,不要循环绑定
//点击省份a
tabCons[0].onclick=function(e){
if (e.target.nodeName=='A') {
// console.log('*********');
// 更新城市 区域
// 找到省份索引
var provInd=e.target.dataset.index;
// 清空城市
cityUl.innerHTML=''
//插入新的城市数据
bindCityData(provInd)
//清空区域
areaUl.innerHTML=''
// 插入新的区域数据,默认为第一个城市的区域
// 城市索引固定为0
var cityInd=0;
bindAreaData(provInd,cityInd)
// 切换省份时,更换选中样式
var prov_as=document.querySelectorAll('.prov a')
prov_as[selected_prov_index].classList.remove('selected')
e.target.classList.add('selected')
// 更新省份索引
selected_prov_index=e.target.dataset.index
// 判断点击的是直辖市还是普通省份
var cityArr=data[selected_prov_index].city
if (cityArr.length==1) {
changeTab(2)
}else{
changeTab(1)
}
}
}
//点击城市a
tabCons[1].onclick=function(e){
if (e.target.nodeName=='A') {
// 更新区域
//须知省份索引和城市索引
var cityInd=e.target.dataset.index
// 清空区域
areaUl.innerHTML=''
//更新区域
bindAreaData(selected_prov_index,cityInd)
//切换城市选中的样式
var city_as=document.querySelectorAll('.city a')
city_as[selected_city_index].classList.remove('selected')
e.target.classList.add('selected')
selected_city_index=e.target.dataset.index
changeTab(2)
}
}
//点击区域a
tabCons[2].onclick=function(e){
if (e.target.nodeName=='A') {
// 切换选项的样式
var area_as=document.querySelectorAll('.area a')
area_as[selected_area_index].classList.remove('selected')
e.target.classList.add('selected')
// 记录当前被选中的区域a的索引
// 直辖市的区域(没有市,直接是区)
// 普通省份的区域
selected_area_index=e.target.dataset.index
}
}
</script>
</body>
</html>