image.png
    思路整理
    功能有两个:
    1.tab栏切换:当点击某个li时,切换到对应内容中,li是选中状态(清除点击选项之前的所有状态

    2.三级联动:首先插入初始的省份,城市,区域,页面初始时,默认显示的是第一个省份的第一个城市的第一个区域
    注意:如果是直辖市,例如北京,没有市,都是区域,此时需要判定城市数组长度==1,城市内容以及tab栏全部隐藏
    然后分别设置3个点击事件,当点击省份时,拿到索引,要写入新的城市数据,并且清空上一个,tab栏也要自动更换

    点击事件中的tab栏切换和写入省,市,区数据最好能封装函数,代码少很多

    1. <!DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8" />
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    7. <title>Document</title>
    8. <style>
    9. *{
    10. margin: 0;
    11. padding: 0;
    12. }
    13. a{
    14. text-decoration: none;
    15. color: black;
    16. }
    17. ul{
    18. list-style: none;
    19. }
    20. .clearfix::before,.clearfix::after{
    21. content: "";
    22. display: table;
    23. }
    24. .clearfix::after{
    25. clear: both;
    26. }
    27. .clearfix{
    28. zoom: 1;
    29. }
    30. .wrap{
    31. width: 500px;
    32. height: 300px;
    33. padding: 15px;
    34. border: 1px solid #e0e0e0;
    35. margin: 100px auto;
    36. }
    37. .tab-nav{
    38. height: 30px;
    39. border-bottom: 1px solid #e0e0e0;
    40. }
    41. .tab-nav ul li{
    42. float: left;
    43. width: 70px;
    44. border: 1px solid #e0e0e0;
    45. border-bottom: none;
    46. line-height: 28px;
    47. text-align: center;
    48. font-size: 12px;
    49. position: relative;
    50. }
    51. .tab-nav ul li:nth-child(1),
    52. .tab-nav ul li:nth-child(2){
    53. border-right: none;
    54. }
    55. /* 选中时的样式 */
    56. .tab-nav ul li.active{
    57. font-weight: 700;
    58. background-color: #fff;
    59. }
    60. /*伪元素相当于行标签 */
    61. .tab-nav ul li.active::before{
    62. content: "";
    63. position: absolute;
    64. width: 72px;
    65. height: 0;
    66. top: -1px;
    67. left: -1px;
    68. border-top: 2px solid #f10180;
    69. }
    70. .tab-nav ul li.active::after{
    71. content: "";
    72. position: absolute;
    73. bottom: -3px;
    74. left: -1px;
    75. width: 70px;
    76. border-top: 2px solid #fff;
    77. }
    78. /* 选项卡对应内容、 */
    79. .tab-con{
    80. margin-top: 30px;
    81. }
    82. .tab-con-item{
    83. display: none;
    84. }
    85. .con-show{
    86. display: block;
    87. }
    88. .tab-con-item ul li{
    89. float: left;
    90. width: 68px;
    91. border-bottom: 2px;
    92. }
    93. .tab-con-item ul li a{
    94. display: inline-block;
    95. max-width: 46px;
    96. padding-right: 10px;
    97. padding-left: 10px;
    98. white-space: nowrap;
    99. text-overflow: ellipsis;
    100. overflow: hidden;
    101. line-height: 20px;
    102. border: 1px solid #fff;
    103. font-size: 12px;
    104. color: black;
    105. box-sizing: content-box;
    106. }
    107. /* 鼠标悬停 */
    108. .tab-con-item ul li a:hover{
    109. color: #f10180;
    110. border: 1px solid #f10180;
    111. }
    112. .tab-con-item ul li a.selected{
    113. background-color: #f10180;
    114. color: white;
    115. }
    116. </style>
    117. </head>
    118. <body>
    119. <div class="wrap">
    120. <div class="tab-nav">
    121. <ul class="clearfix">
    122. <li class="active">省份</li>
    123. <li>城市</li>
    124. <li>区域</li>
    125. </ul>
    126. </div>
    127. <div class="tab-con">
    128. <div class="tab-con-item prov con-show">
    129. <ul class="clearfix">
    130. </ul>
    131. </div>
    132. <div class="tab-con-item city">
    133. <ul class="clearfix">
    134. </ul>
    135. </div>
    136. <div class="tab-con-item area">
    137. <ul class="clearfix"></ul>
    138. </div>
    139. </div>
    140. </div>
    141. <script src="./js/city_code.js"></script>
    142. <script>
    143. var tabNavs=document.querySelectorAll('.tab-nav ul li')
    144. var tabCons=document.querySelectorAll('.tab-con-item')
    145. var provUl=document.querySelector('.prov ul')
    146. var cityUl=document.querySelector('.city ul')
    147. var areaUl=document.querySelector('.area ul')
    148. //功能1:tab栏切换
    149. var currentIndex=0//一个记录上次索引的变量
    150. for(var i=0;i<tabNavs.length;i++){
    151. //给li添加属性
    152. tabNavs[i].index=i;
    153. //点击tab-nav 中的li
    154. tabNavs[i].onclick=function(){
    155. changeTab(this.index)
    156. }
    157. }
    158. //tab栏切换功能
    159. function changeTab(index) {
    160. //恢复被选中之前li的样式
    161. tabNavs[currentIndex].classList.remove('active')
    162. //隐藏之前选中的con区域
    163. tabCons[currentIndex].classList.remove('con-show')
    164. //设置当前选中li的样式
    165. tabNavs[index].classList.add('active')
    166. //显示被选中的con区域
    167. tabCons[index].classList.add('con-show')
    168. //记录当前点击的li索引
    169. currentIndex=index
    170. }
    171. //功能2:三级联动
    172. // 插入省
    173. var selected_prov_index=0//记录被选中省份a的索引
    174. function bindProvData(data){
    175. for(var i=0;i<data.length;i++){
    176. if (i==0) {//默认选中省份
    177. // 点击A标签不跳转页面,执行JS代码,那么地址栏里写javascript:;就可以
    178. provUl.innerHTML+=`
    179. <li><a href="javascript:;" class="selected" data-index="${i}">${data[i].name}</a></li>
    180. `
    181. selected_prov_index=i
    182. continue;
    183. }
    184. provUl.innerHTML+=`
    185. <li><a href="javascript:;" data-index="${i}">${data[i].name}</a></li>
    186. `
    187. }
    188. }
    189. bindProvData(data);
    190. //插入城市
    191. selected_city_index=0
    192. function bindCityData(provIndex) {
    193. var cityArr=data[provIndex].city;// 默认选中省 的 城市数组
    194. if (cityArr.length==1) {
    195. //隐藏城市tab-nav
    196. tabNavs[1].style.display='none'
    197. }else{
    198. // 普通省份,显示城市tab-bav
    199. tabNavs[1].style.display='block'
    200. // 插入城市
    201. for(var i=0;i<cityArr.length;i++){
    202. if (i==0) {
    203. cityUl.innerHTML+=`
    204. <li><a href="javascript:;" class="selected" data-index="${i}">${cityArr[i].name}</a></li>
    205. `
    206. selected_city_index=i;
    207. continue;
    208. }
    209. cityUl.innerHTML+=`
    210. <li><a href="javascript:;" data-index="${i}">${cityArr[i].name}</a></li>
    211. `
    212. }
    213. }
    214. }
    215. bindCityData(selected_prov_index);
    216. // 插入区域li
    217. selected_area_index=0
    218. function bindAreaData(provIndex,cityIndex) {
    219. var areaArr=data[provIndex].city[cityIndex].area;
    220. for(var i=0;i<areaArr.length;i++){
    221. areaUl.innerHTML+=`
    222. <li><a href="javascript:;" data-index="${i}">${areaArr[i].name}</a></li>
    223. `
    224. }
    225. selected_area_index=0;
    226. }
    227. bindAreaData(selected_prov_index,selected_city_index);
    228. // 3个点击事件所作事情不一样,不要循环绑定
    229. //点击省份a
    230. tabCons[0].onclick=function(e){
    231. if (e.target.nodeName=='A') {
    232. // console.log('*********');
    233. // 更新城市 区域
    234. // 找到省份索引
    235. var provInd=e.target.dataset.index;
    236. // 清空城市
    237. cityUl.innerHTML=''
    238. //插入新的城市数据
    239. bindCityData(provInd)
    240. //清空区域
    241. areaUl.innerHTML=''
    242. // 插入新的区域数据,默认为第一个城市的区域
    243. // 城市索引固定为0
    244. var cityInd=0;
    245. bindAreaData(provInd,cityInd)
    246. // 切换省份时,更换选中样式
    247. var prov_as=document.querySelectorAll('.prov a')
    248. prov_as[selected_prov_index].classList.remove('selected')
    249. e.target.classList.add('selected')
    250. // 更新省份索引
    251. selected_prov_index=e.target.dataset.index
    252. // 判断点击的是直辖市还是普通省份
    253. var cityArr=data[selected_prov_index].city
    254. if (cityArr.length==1) {
    255. changeTab(2)
    256. }else{
    257. changeTab(1)
    258. }
    259. }
    260. }
    261. //点击城市a
    262. tabCons[1].onclick=function(e){
    263. if (e.target.nodeName=='A') {
    264. // 更新区域
    265. //须知省份索引和城市索引
    266. var cityInd=e.target.dataset.index
    267. // 清空区域
    268. areaUl.innerHTML=''
    269. //更新区域
    270. bindAreaData(selected_prov_index,cityInd)
    271. //切换城市选中的样式
    272. var city_as=document.querySelectorAll('.city a')
    273. city_as[selected_city_index].classList.remove('selected')
    274. e.target.classList.add('selected')
    275. selected_city_index=e.target.dataset.index
    276. changeTab(2)
    277. }
    278. }
    279. //点击区域a
    280. tabCons[2].onclick=function(e){
    281. if (e.target.nodeName=='A') {
    282. // 切换选项的样式
    283. var area_as=document.querySelectorAll('.area a')
    284. area_as[selected_area_index].classList.remove('selected')
    285. e.target.classList.add('selected')
    286. // 记录当前被选中的区域a的索引
    287. // 直辖市的区域(没有市,直接是区)
    288. // 普通省份的区域
    289. selected_area_index=e.target.dataset.index
    290. }
    291. }
    292. </script>
    293. </body>
    294. </html>