diff --git a/components/mip-city-selection/example/data.json b/components/mip-city-selection/example/data.json
new file mode 100644
index 00000000..3c976546
--- /dev/null
+++ b/components/mip-city-selection/example/data.json
@@ -0,0 +1,156 @@
+{
+ "list": [{
+ "key": "热门",
+ "cities": [
+ {
+ "city": "北京",
+ "pinyin": "beijing",
+ "code": "1"
+ },
+ {
+ "city": "上海",
+ "pinyin": "shanghai",
+ "code": "2"
+ },
+ {
+ "city": "广州",
+ "pinyin": "guangzhou",
+ "code": "3"
+ },
+ {
+ "city": "深圳",
+ "pinyin": "shenzhen",
+ "code": "4"
+ },
+ {
+ "city": "重庆",
+ "pinyin": "chongqing",
+ "code": "5"
+ }
+ ]
+ }, {
+ "key": "A",
+ "cities": [
+ {
+ "city": "澳门",
+ "pinyin": "aomen",
+ "code": "7"
+ },
+ {
+ "city": "安庆",
+ "pinyin": "anqing",
+ "code": "8"
+ },
+ {
+ "city": "安泽",
+ "pinyin": "anze",
+ "code": "9"
+ }
+ ]
+ }, {
+ "key": "B",
+ "cities": [
+ {
+ "city": "宝清",
+ "pinyin": "baoqing",
+ "code": "10"
+ },
+ {
+ "city": "宝鸡",
+ "pinyin": "baoji",
+ "code": "11"
+ },
+ {
+ "city": "巴东",
+ "pinyin": "badong",
+ "code": "12"
+ }
+ ]
+ }, {
+ "key": "C",
+ "cities": [
+ {
+ "city": "重庆",
+ "pinyin": "chongqing",
+ "code": "13"
+ },
+ {
+ "city": "成都",
+ "pinyin": "chengdu",
+ "code": "14"
+ },
+ {
+ "city": "苍山",
+ "pinyin": "cangshan",
+ "code": "15"
+ }
+ ]
+ }, {
+ "key": "D",
+ "cities": [
+ {
+ "city": "大庆",
+ "pinyin": "daqing",
+ "code": "16"
+ },
+ {
+ "city": "大理",
+ "pinyin": "dali",
+ "code": "17"
+ },
+ {
+ "city": "东莞",
+ "pinyin": "dongguan",
+ "code": "18"
+ }
+ ]
+ }, {
+ "key": "E",
+ "cities": [
+ {
+ "city": "鄂尔多斯",
+ "pinyin": "eerduosi",
+ "code": "19"
+ },
+ {
+ "city": "峨眉山",
+ "pinyin": "emeishan",
+ "code": "20"
+ }
+ ]
+ }, {
+ "key": "F",
+ "cities": [
+ {
+ "city": "阜阳",
+ "pinyin": "fuyang",
+ "code": "21"
+ },
+ {
+ "city": "福州",
+ "pinyin": "fuzhou",
+ "code": "22"
+ },
+ {
+ "city": "防城港",
+ "pinyin": "fangchenggang",
+ "code": "23"
+ }
+ ]
+ },
+ {
+ "key": "G",
+ "cities": [
+ {
+ "city": "广州",
+ "pinyin": "guangzhou",
+ "code": "24"
+ },
+ {
+ "city": "贵阳",
+ "pinyin": "guiyang",
+ "code": "25"
+ }
+ ]
+ }]
+}
diff --git a/components/mip-city-selection/example/mip-city-selection.html b/components/mip-city-selection/example/mip-city-selection-inner-data.html
similarity index 89%
rename from components/mip-city-selection/example/mip-city-selection.html
rename to components/mip-city-selection/example/mip-city-selection-inner-data.html
index cdd7d48f..800c3732 100644
--- a/components/mip-city-selection/example/mip-city-selection.html
+++ b/components/mip-city-selection/example/mip-city-selection-inner-data.html
@@ -1,6 +1,5 @@
-
@@ -9,19 +8,17 @@
-
-
-
-
+
+
+
-
diff --git a/components/mip-city-selection/example/mip-city-selection-src-data.html b/components/mip-city-selection/example/mip-city-selection-src-data.html
new file mode 100644
index 00000000..5f6bb0dc
--- /dev/null
+++ b/components/mip-city-selection/example/mip-city-selection-src-data.html
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+ MIP page
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/mip-city-selection/example/mip-test.js b/components/mip-city-selection/example/mip-test.js
new file mode 100644
index 00000000..a521059c
--- /dev/null
+++ b/components/mip-city-selection/example/mip-test.js
@@ -0,0 +1,29 @@
+/**
+ * @file 测试组件
+ * @author mj(zoumiaojiang@gmail.com)
+ */
+
+/* globals MIP */
+
+class MIPTest extends MIP.CustomElement {
+ build () {
+ this.addEventAction('print', data => {
+ this.print(data)
+ })
+ }
+
+ /**
+ * 打印的测试内容
+ *
+ * @param {any} content 打印的内容
+ */
+ print (content) {
+ if (typeof content === 'object') {
+ content = JSON.stringify(content, null, 2)
+ }
+
+ this.element.innerHTML = '' + content + '
'
+ }
+}
+
+MIP.registerElement('mip-test', MIPTest)
diff --git a/components/mip-city-selection/mip-city-selection.js b/components/mip-city-selection/mip-city-selection.js
new file mode 100644
index 00000000..1e2ec5ea
--- /dev/null
+++ b/components/mip-city-selection/mip-city-selection.js
@@ -0,0 +1,312 @@
+/**
+ * @file 城市选择组件
+ * @author mj(zoumiaojiang@gmail.com)
+ */
+
+/* global MIP, fetch */
+
+import './mip-city-selection.less'
+
+const { util, CustomElement, viewport, viewer } = MIP
+const { rect, log } = util
+const CustomStorage = util.customStorage
+const logger = log('mip-city-selection')
+const Storage = new CustomStorage(0)
+
+const SELECTION_CONTENT_CLS = 'mip-city-selection-content'
+
+export default class MIPCitySelection extends CustomElement {
+ constructor (...element) {
+ super(...element)
+
+ /**
+ * 规定格式的城市选择组件的数据
+ *
+ * @type {Array