微信小程-实现城市列表选择

实现效果预览

1、定位当前城市

2、根据首字母定位到响应的区域

3、点击选中区域

目录结构



index.wxml 页面

```<view class="searchLetter touchClass">

  <view class="thishotText" bindtap="hotCity">

    <view style="margin-top:0;">当前</view>

    <view style="margin-top:0;">热门</view>

  </view>

  <view wx:for="{{searchLetter}}" style="color:#F9C400;font-size:20rpx;" wx:key="index" data-letter="{{item.name}}" catchtouchend="clickLetter" >{{item.name}}</view>

</view>

<block wx:if="{{isShowLetter}}">

  <view class="showSlectedLetter">

    {{showLetter}}

  </view>

</block>

<scroll-view scroll-y="true" style="background-color: #fff;height:{{winHeight}}px" bindscroll="bindScroll"

scroll-into-view="{{scrollTopId}}" scroll-top="{{scrollTop}}">

  <view class="hotcity-common thisCity">当前选择城市</view>

  <view class="thisCityName">{{city}}</view>

  <view>

    <text class="hotcity hotcity-common">热门城市</text>

    <view class="weui-grids">

      <block wx:for-items="{{hotcityList}}" wx:key='item'>

        <view class="weui-grid" data-cityCode="{{item.cityCode}}" data-city="{{item.city}}" bindtap="bindHotCity" >

          <view class="weui-grid__label">{{item.city}}</view>

        </view>

      </block>

    </view>

  </view>

  <view class="selection" wx:for="{{cityList}}" wx:key="{{item.initial}}">

    <view class="item_letter"  id="{{item.initial}}">

    <image src="/images/shopbgimg.png"></image>

    <text>  {{item.initial}}</text>


    </view>

    <view class="item_city"  wx:for="{{item.cityInfo}}" wx:for-item="ct" wx:key="{{ct.id}}" data-cityCode="{{ct.code}}" data-city="{{ct.city}}" bindtap="bindCity">

      {{ct.city}}

    </view>

  </view>

</scroll-view>

```

index.js 页面

```var city = require('../../utils/city.js');

var app = getApp()

Page({

  data: {

    searchLetter: [],

    showLetter: "",

    winHeight: 0,

    // tHeight: 0,

    // bHeight: 0,

    cityList: [],

    isShowLetter: false,

    scrollTop: 0,//置顶高度

    scrollTopId: '',//置顶id

    city: "",

    hotcityList: [{ cityCode: 110000, city: '北京市' }, { cityCode: 310000, city: '上海市' }, { cityCode: 440100, city: '广州市' }, { cityCode: 440300, city: '深圳市' }, { cityCode: 330100, city: '杭州市' }, { cityCode: 320100, city: '南京市' }, { cityCode: 420100, city: '武汉市' }, { cityCode: 410100, city: '郑州市' }, { cityCode: 120000, city: '天津市' }, { cityCode: 610100, city: '西安市' }, { cityCode: 510100, city: '成都市' }, { cityCode: 500000, city: '重庆市' }],

    latitude: '',

    longitude: ''

  },

  onLoad: function (e) {

    // 生命周期函数--监听页面加载

    var searchLetter = city.searchLetter;

    var cityList = city.cityList();

    var sysInfo = wx.getSystemInfoSync();

    var winHeight = sysInfo.windowHeight;

    var itemH = winHeight / searchLetter.length;

    var tempObj = [];

    for (var i = 0; i < searchLetter.length; i++) {

      var temp = {};

      temp.name = searchLetter[i];

      temp.tHeight = i * itemH;

      temp.bHeight = (i + 1) * itemH;

      tempObj.push(temp)

    }

    this.setData({

      winHeight: winHeight,

      itemH: itemH,

      searchLetter: tempObj,

      cityList: cityList,

      city: e.city

    })

  },

  onReady: function () {

    // 生命周期函数--监听页面初次渲染完成

  },

  onShow: function () {

    // 生命周期函数--监听页面显示

    this.getLocation()

  },

  clickLetter: function (e) {

    var showLetter = e.currentTarget.dataset.letter;

    this.setData({

      showLetter: showLetter,

      isShowLetter: true,

      scrollTopId: showLetter,

    })

    var that = this;

    setTimeout(function () {

      that.setData({

        isShowLetter: false

      })

    }, 1000)

  },

  // 微信获得经纬度

  getLocation: function () {

    let vm = this;

    var latitude = ''

    var longitude = ''

    wx.getLocation({

      type: 'wgs84',

      success: function (res) {

        latitude = res.latitude

        longitude = res.longitude

        var speed = res.speed

        var accuracy = res.accuracy;

        vm.setData({

          latitude: res.latitude,

          longitude: res.longitude

        })

      },

      fail: function (res) {

      }

    })

    //

  },

  //选择城市

  bindCity: function (e) {

    this.setData({

      city: e.currentTarget.dataset.city,

    })

  },

  //选择热门城市

  bindHotCity: function (e) {

    this.setData({

      city: e.currentTarget.dataset.city

    })

  },

  //点击热门城市回到顶部

  hotCity: function () {

    this.setData({

      scrollTop: 0,

    })

  }

})

```

index.wxss 页面

```.searchLetter {

  position: fixed;

  right: 0;

  width: 50rpx;

  text-align: center;

  justify-content: center;

  display: flex;

  flex-direction: column;

  color: #666;

  z-index: 1;

  padding-right: 30rpx;

  padding-left: 13rpx;

}

.searchLetter view {

  margin-top: 20rpx;

}

.touchClass {

  background-color: #fff;

  color: #fff;

  padding-top: 46rpx;

}

.showSlectedLetter {

  background-color: rgba(0, 0, 0, 0.5);

  color: #fff;

  display: flex;

  justify-content: center;

  align-items: center;

  position: fixed;

  top: 50%;

  left: 50%;

  margin: -100rpx;

  width: 200rpx;

  height: 200rpx;

  border-radius: 20rpx;

  font-size: 52rpx;

  z-index: 1;

}

.selection {

  display: flex;

  width: 100%;

  flex-direction: column;

  margin-top: 10rpx;

}

.item_letter {

  display: flex;

  height: 67rpx;

  line-height: 67rpx;

  padding-left: 69rpx;

  align-items: center;

  font-size: 20rpx;

  color: #333;

  position: relative

}

.item_letter image {

  height: 67rpx;

  width: 100%;

  position: absolute;

  top: 0;

  left: 0;

}

.item_letter text{

  position: absolute;

  top: 0;

  left: 69rpx;

}

.item_city {

  display: flex;

  background-color: #fff;

  height: 83rpx;

margin-left: 43rpx;

  align-items: center;

  border-bottom: 1rpx solid #EDEDED;

  font-size: 22rpx;

  color: #666;

}

.hotcity-common {

  font-size: 20rpx;

  color: #666;

  padding: 0 0 0 40rpx;

}

.thisCity {

  padding-top: 30rpx;

}

.thisCityName {

  display: inline-block;

  border: 1rpx solid #F9C400;

  padding: 10rpx;

  font-size: 20rpx;

  color: #F9C400;

  text-align: center;

  min-width: 92rpx;

  margin: 28rpx 0 25rpx 49rpx;

  border-radius:6rpx;


}

.thishotText {

  color: #F9C400;

  font-size: 20rpx;

  margin: 0 !important;

}

.slectCity {

  border-color:#F9C400 !important;

}

.slectCity view {

  color: #F9C400 !important;

}

.weui-grids{

  margin-left: 49rpx;

  overflow: hidden;

  padding-bottom: 18rpx;

}

.weui-grid {

  position: relative;

  float: left;

  width: 124rpx;

  box-sizing: border-box;

  border-radius: 6rpx;

  margin: 18rpx 29rpx 26rpx 0;

  height: 46rpx;

  line-height: 46rpx;

  background: #F4F4F4;

  font-size: 22rpx;

  color: #666

}

.weui-grid__label {

  display: block;

  text-align: center;

  color: #333;

  font-size: 24rpx;

  white-space: nowrap;

  text-overflow: ellipsis;

  overflow: hidden;

}

```

city.js文件里面是省市  有需要私信!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342