• AJAX——案例_天气预报


    天气预报案例

    步骤

    1. 获取北京市天气数据,展示
    2. 搜索城市列表,展示
    3. 点击城市,显示对应天气数据

    index.css代码 

    1. html,
    2. body {
    3. height: 100%;
    4. }
    5. body {
    6. background-image: linear-gradient(135deg, #50B1FF 0%, #1F57D6 100%);
    7. }
    8. .container {
    9. width: 1200px;
    10. margin: 0 auto;
    11. height: 100%;
    12. }
    13. /* 顶部 */
    14. .top-box {
    15. display: flex;
    16. padding: 50px;
    17. justify-content: space-between;
    18. }
    19. /* 日期 */
    20. .top-box .title .data {
    21. color: white;
    22. margin-right: 20px;
    23. }
    24. /* 农历 */
    25. .top-box .title .calendar {
    26. opacity: .72;
    27. }
    28. /* 搜索区域 */
    29. .search-box {
    30. display: flex;
    31. justify-content: space-between;
    32. align-items: center;
    33. }
    34. .search-box .location {
    35. display: flex;
    36. align-items: center;
    37. margin-right: 20px;
    38. font-size: 16px;
    39. }
    40. .search-box .location img {
    41. width: 20px;
    42. height: 20px;
    43. margin-right: 7.1px;
    44. }
    45. .search-box .search-city {
    46. width: 234px;
    47. height: 32px;
    48. border: none;
    49. border-radius: 16px;
    50. padding-left: 10px;
    51. background-color: rgba(255, 255, 255, .2);
    52. color: white;
    53. font-size: 14px;
    54. }
    55. .search {
    56. position: relative;
    57. }
    58. /* 搜索列表 */
    59. .search-list {
    60. width: 100%;
    61. height: 200px;
    62. overflow-y: scroll;
    63. background-color: #fff;
    64. position: absolute;
    65. left: 0;
    66. top: 40px;
    67. display: none;
    68. }
    69. .search-list.show{
    70. display: block;
    71. }
    72. .search-list::-webkit-scrollbar{
    73. display: none;
    74. }
    75. .search-list li{
    76. color: black;
    77. font-size: 14px;
    78. padding: 15px 10px;
    79. }
    80. .search-list li:hover{
    81. background-color: lightgray;
    82. }
    83. /* 当前天气 */
    84. .weather-box {
    85. display: flex;
    86. padding-left: 50px;
    87. align-items: flex-end;
    88. }
    89. .weather-box .tem-box {
    90. margin-right: 42px;
    91. display: flex;
    92. flex-direction: column;
    93. }
    94. .weather-box .tem-box .temp span{
    95. font-size: 90px;
    96. display: inline-block;
    97. height: 100px;
    98. margin-bottom: 10px;
    99. line-height: 100px;
    100. }
    101. .climate-box .air {
    102. display: inline;
    103. padding: 5px 10px;
    104. height: 32px;
    105. border-radius: 16px;
    106. background: #65D45A;
    107. text-align: center;
    108. line-height: 32px;
    109. font-family: PingFangSC-Medium;
    110. font-size: 18px;
    111. color: #FFFFFF;
    112. letter-spacing: 0;
    113. font-weight: 500;
    114. }
    115. .climate-box .weather-list {
    116. display: flex;
    117. align-items: flex-end;
    118. margin-top: 21px;
    119. margin-bottom: 28px;
    120. }
    121. .climate-box .weather-list li img {
    122. width: 20px;
    123. height: 20px;
    124. }
    125. .climate-box .weather-list li {
    126. margin-right: 20px;
    127. }
    128. .climate-box .weather-list li,
    129. .climate-box .weather-list span {
    130. display: flex;
    131. align-items: center;
    132. font-size: 16px;
    133. }
    134. /* 今日详细天气 */
    135. .today-weather{
    136. display: flex;
    137. padding-left: 50px;
    138. }
    139. .today-weather .range-box,
    140. .today-weather .range {
    141. font-size: 16px;
    142. }
    143. .today-weather .sun-list {
    144. display: flex;
    145. align-items: center;
    146. margin-left: 50px;
    147. }
    148. .today-weather .sun-list li {
    149. font-size: 16px;
    150. margin-right: 42px;
    151. }
    152. /* 周天气预报 */
    153. .week-weather-box {
    154. height: 382px;
    155. border-radius: 10px;
    156. background-color: #fff;
    157. width: 1039px;
    158. margin: 30px auto;
    159. padding: 30px;
    160. }
    161. .week-weather-box .title {
    162. font-size: 20px;
    163. color: #3A475A;
    164. letter-spacing: 0;
    165. font-weight: 600;
    166. }
    167. /* 列表 */
    168. .week-wrap {
    169. display: flex;
    170. margin: 0 auto;
    171. margin-top: 30px;
    172. }
    173. .week-wrap .item {
    174. width: 150px;
    175. height: 254px;
    176. cursor: pointer;
    177. text-align: center;
    178. display: flex;
    179. flex-direction: column;
    180. align-items: center;
    181. padding-top: 30px;
    182. }
    183. .week-wrap .item:hover {
    184. background: #F7FAFF;
    185. border-radius: 10px;
    186. }
    187. .week-wrap .item span{
    188. color: #393F48;
    189. }
    190. .week-wrap .item .date-box {
    191. display: flex;
    192. flex-direction: column;
    193. align-items: center;
    194. margin-bottom: 4px;
    195. }
    196. .week-wrap .item .date-box .dateFormat {
    197. font-size: 16px;
    198. color: #393F48;
    199. letter-spacing: 0;
    200. text-align: center;
    201. font-weight: 400;
    202. }
    203. .week-wrap .item .date-box .date {
    204. font-size: 16px;
    205. color: #88909D;
    206. letter-spacing: 0;
    207. text-align: center;
    208. font-weight: 400;
    209. }
    210. .week-wrap .item img {
    211. width: 46px;
    212. height: 46px;
    213. margin: 12px 0 12px;
    214. }
    215. .week-wrap .item .weather {
    216. font-size: 16px;
    217. color: #393F48;
    218. letter-spacing: 0;
    219. text-align: center;
    220. font-weight: 400;
    221. margin-bottom: 4px;
    222. }
    223. .week-wrap .item .temp {
    224. font-size: 14px;
    225. color: #393F48;
    226. letter-spacing: 0;
    227. text-align: center;
    228. font-weight: 500;
    229. margin-bottom: 10px;
    230. }
    231. .week-wrap .item .wind span {
    232. font-size: 14px;
    233. color: #676C74;
    234. letter-spacing: 0;
    235. text-align: center;
    236. font-weight: 400;
    237. }

    reset.css代码

    1. * {
    2. box-sizing: border-box;
    3. font-size: 18px;
    4. ;
    5. color: white;
    6. }
    7. body,
    8. ul,
    9. h1,
    10. h2,
    11. h3,
    12. h4,
    13. h5,
    14. h6 {
    15. margin: 0;
    16. padding: 0;
    17. }
    18. h1,
    19. h2,
    20. h3,
    21. h4,
    22. h5,
    23. h6 {
    24. font-size: 100%;
    25. font-weight: normal;
    26. }
    27. a {
    28. text-decoration: none;
    29. }
    30. ul {
    31. list-style: none;
    32. }
    33. img {
    34. border: 0px;
    35. }
    36. input {
    37. appearance: none;
    38. outline: none;
    39. }
    40. input::-webkit-input-placeholder {
    41. /* WebKit, Blink, Edge */
    42. color: #E6EBFF;
    43. }
    44. :-moz-placeholder {
    45. /* Mozilla Firefox 4 to 18 */
    46. color: #E6EBFF;
    47. }
    48. ::-moz-placeholder {
    49. /* Mozilla Firefox 19+ */
    50. color: #E6EBFF;
    51. }
    52. input:-ms-input-placeholder {
    53. /* Internet Explorer 10-11 */
    54. color: #E6EBFF;
    55. }
    56. input::-ms-input-placeholder {
    57. /* Microsoft Edge */
    58. color: #E6EBFF;
    59. }
    60. /* 清除浮动,解决margin-top塌陷 */
    61. .clearfix:before,
    62. .clearfix:after {
    63. content: '';
    64. display: table;
    65. }
    66. .clearfix:after {
    67. clear: both;
    68. }
    69. .clearfix {
    70. zoom: 1;
    71. }
    72. .fl {
    73. float: left;
    74. }
    75. .fr {
    76. float: right;
    77. }

    index.js代码

    1. /**
    2. * 目标1:默认显示-北京市天气
    3. * 1.1 获取北京市天气数据
    4. * 1.2 数据展示到页面
    5. */
    6. // 获取并渲染城市天气函数
    7. function getWeather(cityCode) {
    8. // 1.1 获取北京市天气数据
    9. myAxios({
    10. url: 'http://hmajax.itheima.net/api/weather',
    11. params: {
    12. city: cityCode
    13. }
    14. }).then(result => {
    15. console.log(result)
    16. const wObj = result.data
    17. // 1.2 数据展示到页面
    18. // 阳历和农历日期
    19. const dateStr = `<span class="dateShort">${wObj.date}</span>
    20. <span class="calendar">农历&nbsp;
    21. <span class="dateLunar">${wObj.dateLunar}</span>
    22. </span>`
    23. document.querySelector('.title').innerHTML = dateStr
    24. // 城市名字
    25. document.querySelector('.area').innerHTML = wObj.area
    26. // 当天气温
    27. const nowWStr = `<div class="tem-box">
    28. <span class="temp">
    29. <span class="temperature">${wObj.temperature}</span>
    30. <span>°</span>
    31. </span>
    32. </div>
    33. <div class="climate-box">
    34. <div class="air">
    35. <span class="psPm25">${wObj.psPm25}</span>
    36. <span class="psPm25Level">${wObj.psPm25Level}</span>
    37. </div>
    38. <ul class="weather-list">
    39. <li>
    40. <img src="${wObj.weatherImg}" class="weatherImg" alt="">
    41. <span class="weather">${wObj.weather}</span>
    42. </li>
    43. <li class="windDirection">${wObj.windDirection}</li>
    44. <li class="windPower">${wObj.windPower}</li>
    45. </ul>
    46. </div>`
    47. document.querySelector('.weather-box').innerHTML = nowWStr
    48. // 当天天气
    49. const twObj = wObj.todayWeather
    50. const todayWStr = `<div class="range-box">
    51. <span>今天:</span>
    52. <span class="range">
    53. <span class="weather">${twObj.weather}</span>
    54. <span class="temNight">${twObj.temNight}</span>
    55. <span>-</span>
    56. <span class="temDay">${twObj.temDay}</span>
    57. <span></span>
    58. </span>
    59. </div>
    60. <ul class="sun-list">
    61. <li>
    62. <span>紫外线</span>
    63. <span class="ultraviolet">${twObj.ultraviolet}</span>
    64. </li>
    65. <li>
    66. <span>湿度</span>
    67. <span class="humidity">${twObj.humidity}</span>%
    68. </li>
    69. <li>
    70. <span>日出</span>
    71. <span class="sunriseTime">${twObj.sunriseTime}</span>
    72. </li>
    73. <li>
    74. <span>日落</span>
    75. <span class="sunsetTime">${twObj.sunsetTime}</span>
    76. </li>
    77. </ul>`
    78. document.querySelector('.today-weather').innerHTML = todayWStr
    79. // 7日天气预报数据展示
    80. const dayForecast = wObj.dayForecast
    81. const dayForecastStr = dayForecast.map(item => {
    82. return `<li class="item">
    83. <div class="date-box">
    84. <span class="dateFormat">${item.dateFormat}</span>
    85. <span class="date">${item.date}</span>
    86. </div>
    87. <img src="${item.weatherImg}" alt="" class="weatherImg">
    88. <span class="weather">${item.weather}</span>
    89. <div class="temp">
    90. <span class="temNight">${item.temNight}</span>-
    91. <span class="temDay">${item.temDay}</span>
    92. <span></span>
    93. </div>
    94. <div class="wind">
    95. <span class="windDirection">${item.windDirection}</span>
    96. <span class="windPower">${item.windPower}</span>
    97. </div>
    98. </li>`
    99. }).join('')
    100. // console.log(dayForecastStr)
    101. document.querySelector('.week-wrap').innerHTML = dayForecastStr
    102. })
    103. }
    104. // 默认进入网页-就要获取天气数据(北京市城市编码:'110100'
    105. getWeather('110100')
    106. /**
    107. * 目标2:搜索城市列表
    108. * 2.1 绑定input事件,获取关键字
    109. * 2.2 获取展示城市列表数据
    110. */
    111. // 2.1 绑定input事件,获取关键字
    112. document.querySelector('.search-city').addEventListener('input', (e) => {
    113. console.log(e.target.value)
    114. // 2.2 获取展示城市列表数据
    115. myAxios({
    116. url: 'http://hmajax.itheima.net/api/weather/city',
    117. params: {
    118. city: e.target.value
    119. }
    120. }).then(result => {
    121. console.log(result)
    122. const liStr = result.data.map(item => {
    123. return `<li class="city-item" data-code="${item.code}">${item.name}</li>`
    124. }).join('')
    125. console.log(liStr)
    126. document.querySelector('.search-list').innerHTML = liStr
    127. })
    128. })
    129. /**
    130. * 目标3:切换城市天气
    131. * 3.1 绑定城市点击事件,获取城市code值
    132. * 3.2 调用获取并展示天气的函数
    133. */
    134. // 3.1 绑定城市点击事件,获取城市code
    135. document.querySelector('.search-list').addEventListener('click', e => {
    136. if (e.target.classList.contains('city-item')) {
    137. // 只有点击城市li才会走这里
    138. const cityCode = e.target.dataset.code
    139. console.log(cityCode)
    140. // 3.2 调用获取并展示天气的函数
    141. getWeather(cityCode)
    142. }
    143. })

    my-axios.js代码

    1. function myAxios(config) {
    2. return new Promise((resolve, reject) => {
    3. const xhr = new XMLHttpRequest()
    4. if (config.params) {
    5. const paramsObj = new URLSearchParams(config.params)
    6. const queryString = paramsObj.toString()
    7. config.url += `?${queryString}`
    8. }
    9. xhr.open(config.method || 'GET', config.url)
    10. xhr.addEventListener('loadend', () => {
    11. if (xhr.status >= 200 && xhr.status < 300) {
    12. resolve(JSON.parse(xhr.response))
    13. } else {
    14. reject(new Error(xhr.response))
    15. }
    16. })
    17. if (config.data) {
    18. const jsonStr = JSON.stringify(config.data)
    19. xhr.setRequestHeader('Content-Type', 'application/json')
    20. xhr.send(jsonStr)
    21. } else {
    22. xhr.send()
    23. }
    24. })
    25. }

    search.js代码

    1. // 控制搜索列表,显示/隐藏
    2. const searchList = document.querySelector('.search-list')
    3. // 输入框内容改变时,有城市关键字出现列表,没有则不出现列表
    4. document.querySelector('.search-city').addEventListener('input', e => {
    5. if (e.target.value.length > 0) {
    6. searchList.classList.add('show')
    7. } else {
    8. searchList.classList.remove('show')
    9. }
    10. })
    11. // 输入框失焦,隐藏搜索列表
    12. document.querySelector('.search-city').addEventListener('blur', e => {
    13. // 延迟消失,保证点击获取到城市code后,再隐藏下拉列表
    14. setTimeout(() => {
    15. searchList.classList.remove('show')
    16. }, 500)
    17. })
    18. // 输入框聚焦,显示搜索列表
    19. document.querySelector('.search-city').addEventListener('focus', e => {
    20. if (e.target.value.length > 0) {
    21. searchList.classList.add('show')
    22. }
    23. })

    index.html代码

    1. <!DOCTYPE html>
    2. <html lang="zh-CN">
    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. <link rel="stylesheet" href="./css/reset.css">
    8. <link rel="stylesheet" href="./css/index.css">
    9. <title>案例_天气预报</title>
    10. </head>
    11. <body>
    12. <div class="container">
    13. <!-- 顶部 -->
    14. <div class="top-box">
    15. <div class="title">
    16. <span class="dateShort">1028</span>
    17. <span class="calendar">农历&nbsp;
    18. <span class="dateLunar">十月初四</span>
    19. </span>
    20. </div>
    21. <div class="search-box">
    22. <div class="location">
    23. <img src="./imgs/定位.png" alt="">
    24. <span class="area">城市名</span>
    25. </div>
    26. <!-- 搜索框+搜索列表 -->
    27. <div class="search">
    28. <input type="text" class="search-city" placeholder="搜索城市">
    29. <ul class="search-list">
    30. <li class="city-item">北京市</li>
    31. </ul>
    32. </div>
    33. </div>
    34. </div>
    35. <!-- 当前天气 -->
    36. <div class="weather-box">
    37. <div class="tem-box">
    38. <span class="temp">
    39. <span class="temperature">12</span>
    40. <span>°</span>
    41. </span>
    42. </div>
    43. <div class="climate-box">
    44. <div class="air">
    45. <span class="psPm25">55</span>
    46. <span class="psPm25Level"></span>
    47. </div>
    48. <ul class="weather-list">
    49. <li>
    50. <img src="./imgs/小雨-line.png" class="weatherImg" alt="">
    51. <span class="weather">多云</span>
    52. </li>
    53. <li class="windDirection">东南风</li>
    54. <li class="windPower">2</li>
    55. </ul>
    56. </div>
    57. </div>
    58. <div class="today-weather">
    59. <div class="range-box">
    60. <span>今天:</span>
    61. <span class="range">
    62. <span class="weather"></span>
    63. <span class="temNight">9</span>
    64. <span>-</span>
    65. <span class="temDay">14</span>
    66. <span></span>
    67. </span>
    68. </div>
    69. <ul class="sun-list">
    70. <li>
    71. <span>紫外线</span>
    72. <span class="ultraviolet"></span>
    73. </li>
    74. <li>
    75. <span>湿度</span>
    76. <span class="humidity">53</span>%
    77. </li>
    78. <li>
    79. <span>日出</span>
    80. <span class="sunriseTime">06:38</span>
    81. </li>
    82. <li>
    83. <span>日落</span>
    84. <span class="sunsetTime">17:18</span>
    85. </li>
    86. </ul>
    87. </div>
    88. <!-- 周天气预报 -->
    89. <div class="week-weather-box">
    90. <div class="title">7日内天气预报</div>
    91. <ul class="week-wrap">
    92. <li class="item">
    93. <div class="date-box">
    94. <span class="dateFormat">今天</span>
    95. <span class="date">1028</span>
    96. </div>
    97. <img src="./imgs/多云.png" alt="" class="weatherImg">
    98. <span class="weather">多云</span>
    99. <div class="temp">
    100. <span class="temNight">12</span>-
    101. <span class="temDay">12</span>
    102. <span></span>
    103. </div>
    104. <div class="wind">
    105. <span class="windDirection">东南风</span>
    106. <span class="windPower">&lt;3</span>
    107. </div>
    108. </li>
    109. <li class="item">
    110. <div class="date-box">
    111. <span class="dateFormat">今天</span>
    112. <span class="date">1028</span>
    113. </div>
    114. <img src="./imgs/多云.png" alt="" class="weatherImg">
    115. <span class="weather">多云</span>
    116. <div class="temp">
    117. <span class="temDay">12</span>-
    118. <span class="temNight">12</span>
    119. <span></span>
    120. </div>
    121. <div class="wind">
    122. <span class="windDirection">东南风</span>
    123. <span class="windPower">&lt;3</span>
    124. </div>
    125. </li>
    126. <li class="item">
    127. <div class="date-box">
    128. <span class="dateFormat">今天</span>
    129. <span class="date">1028</span>
    130. </div>
    131. <img src="./imgs/多云.png" alt="" class="weatherImg">
    132. <span class="weather">多云</span>
    133. <div class="temp">
    134. <span class="temDay">12</span>-
    135. <span class="temNight">12</span>
    136. <span></span>
    137. </div>
    138. <div class="wind">
    139. <span class="windDirection">东南风</span>
    140. <span class="windPower">&lt;3</span>
    141. </div>
    142. </li>
    143. <li class="item">
    144. <div class="date-box">
    145. <span class="dateFormat">今天</span>
    146. <span class="date">1028</span>
    147. </div>
    148. <img src="./imgs/多云.png" alt="" class="weatherImg">
    149. <span class="weather">多云</span>
    150. <div class="temp">
    151. <span class="temDay">12</span>-
    152. <span class="temNight">12</span>
    153. <span></span>
    154. </div>
    155. <div class="wind">
    156. <span class="windDirection">东南风</span>
    157. <span class="windPower">&lt;3</span>
    158. </div>
    159. </li>
    160. <li class="item">
    161. <div class="date-box">
    162. <span class="dateFormat">今天</span>
    163. <span class="date">1028</span>
    164. </div>
    165. <img src="./imgs/多云.png" alt="" class="weatherImg">
    166. <span class="weather">多云</span>
    167. <div class="temp">
    168. <span class="temDay">12</span>-
    169. <span class="temNight">12</span>
    170. <span></span>
    171. </div>
    172. <div class="wind">
    173. <span class="windDirection">东南风</span>
    174. <span class="windPower">&lt;3</span>
    175. </div>
    176. </li>
    177. <li class="item">
    178. <div class="date-box">
    179. <span class="dateFormat">今天</span>
    180. <span class="date">1028</span>
    181. </div>
    182. <img src="./imgs/多云.png" alt="" class="weatherImg">
    183. <span class="weather">多云</span>
    184. <div class="temp">
    185. <span class="temDay">12</span>-
    186. <span class="temNight">12</span>
    187. <span></span>
    188. </div>
    189. <div class="wind">
    190. <span class="windDirection">东南风</span>
    191. <span class="windPower">&lt;3</span>
    192. </div>
    193. </li>
    194. <li class="item">
    195. <div class="date-box">
    196. <span class="dateFormat">今天</span>
    197. <span class="date">1028</span>
    198. </div>
    199. <img src="./imgs/多云.png" alt="" class="weatherImg">
    200. <span class="weather">多云</span>
    201. <div class="temp">
    202. <span class="temDay">12</span>-
    203. <span class="temNight">12</span>
    204. <span></span>
    205. </div>
    206. <div class="wind">
    207. <span class="windDirection">东南风</span>
    208. <span class="windPower">&lt;3</span>
    209. </div>
    210. </li>
    211. </ul>
    212. </div>
    213. </div>
    214. <!-- 自己封装myAxios函数 -->
    215. <script src="./js/my-axios.js"></script>
    216. <!-- 搜索框+下拉菜单出现逻辑 -->
    217. <script src="./js/search.js"></script>
    218. <!-- 核心js -->
    219. <script src="./js/index.js"></script>
    220. </body>
    221. </html>

  • 相关阅读:
    台达PLC出现故障该怎么进行远程维护和程序上下载?
    扬帆牧哲—跨境电商商标注册要注意的地方
    kafka 通过 jdbc 从oracle抓取数据
    单元测试,集成测试,系统测试的区别是什么?
    设计模式之拦截器模式
    Tomcat常见问题解决方法总结,无法自动,无法访问,控制台乱码
    彻底理解Java并发:synchronized关键字
    requests模块高级用法练习
    Oracle数据库:oracle启动,oracle客户端工具plsql安装教程和使用方法
    Pyinstaller+InstallForge多文件项目软件打包
  • 原文地址:https://blog.csdn.net/weixin_48719464/article/details/138055230