• 综合案例:学成在线案例


    1.准备素材和工具

    1.学成在线PDS源文件。

    2.开发工具=PS(切图)/cutterman插件+vscode(代码)+Chrome(测试)。

    2.案例准备工作

    本次采取结构与样式相分离思想:

    1.创建study目录文件夹(用于存放页面的相关内容)

    2.用vscode打开这么目录文件夹

    3.study目录内新建images文件夹,用于保存图片

    4.新建首页文件index.heml(网站首页统一规定为index.html

    5.新建style.css样式文件,采用外链接样式表

    6.使用<link>标签将样式引入到html页面文件中

    7.样式表写入清除内外边距的样式,来监测样式是否引入成功

    3.css属性书写书序***

    建议遵循以下顺序:

    1.布局定位属性:display、position、float、clear、visibility、overflow(建议display第一个写,其关系到模式)

    2.自身属性:width、height、margin、padding、border、background

    3.文件属性:color、font、text-decoration、text-align、vertical-align、white-space、break-word

    4.其他属性:(css):content、cursor、borde-radis、box-shadow、text-shadow、background:linear-fradident......

    .jdc{

        display:block;

        position:relative;

        float:left;

        width:100px;

        height:100px;

        margin:0 auto;

        padding:10px 10px;

        font-family:Arial;

        color:#333;

        background:rbga(0,0,0,.3);

        border-radis:10px;

    }

    4.页面布局的思路 为了提高网页制作的效率,布局时通常有以下的整体思路:

    1.必须确定页面的版心(可视区)。测量可得知

    2.分析页面中的行模块,以及每个行模块中的列模块,页面布局第一准则

    3.一行中的列模块经常浮动布局,先确定每个列的大小,之后确定列的位置,页面布局第二准则

    4.制作HTML结构,遵循先有结构,后有样式的原则,结构永远最重要

    5.先理清布局结构,再写代码尤为重要,这需要多写积累经验

    5.确定版心

    该页面的版心是1200像素,每个版心都需要水平居中对齐,可以定义版心为公共类;

    .w{

        width:1200px;

        margin:auto;

    }

     6.头部制作

    导航栏注意点:
    实际开发中,我们不会直接用链接a而是用i包含链接(i+)的做法。
    1.i+a语义更清晰,一看这就是有条理的列表型内容。
    2.如果直接拥a,搜索引擎容易辨别为有堆砌关键字嫌凝(故意堆砌关键字容易被搜索擎有降权的风险),从而影响网站排名
    注意:
    1.让导航栏一行显示,给ⅱ加浮动,因为ⅱ是块级元素,需要一行显示
    2.这个nv导航栏可以不给宽度将来可以继续添其余文字
    3.因为导航栏里面文字不一样多,所以最好给链接a左右padding:撑开盒子,而不是指定宽度

    7.banner制作

     8.精品推荐小模块制作

     9.精品推荐大模块制 

     盒子模型:

    • 1号盒子为最大的盒子,b0x版心水平居中对齐
    • 2号盒子为上面部分,b0x-hd-里面左侧标题H3左浮动,右侧链接a右浮动
    • 3号盒子为底下部分,b0bd-里面是无序列表,有10个小i组成
    • 小li外边距的问题,这里有个小技巧:给box-hd宽度为1215就可以一行装开5个li

    10.底部模块

    css样式代码: 

    1. * {
    2. margin: 0;
    3. padding: 0;
    4. }
    5. /* 设置页面版心的宽度及外边距 */
    6. .w {
    7. width: 1200px;
    8. margin: auto;
    9. }
    10. body {
    11. background-color: #f3f5f7;
    12. }
    13. li {
    14. list-style: none;
    15. }
    16. a {
    17. text-decoration: none;
    18. }
    19. .clearfix:after {
    20. content: "";
    21. display: block;
    22. height: 0;
    23. clear: both;
    24. visibility: hidden;
    25. }
    26. .clearfix {
    27. /* IE6、7专有 */
    28. *zoom: 1;
    29. }
    30. .head {
    31. height: 42px;
    32. /* 注意:此地方会层叠(就近原则)w里面的auto,所以需要设置head中margin的左右边距 */
    33. margin: 30px auto;
    34. }
    35. /* logo部分 */
    36. .logo {
    37. float: left;
    38. width: 198px;
    39. height: 42px;
    40. }
    41. /* 导航栏部分 */
    42. .nav {
    43. float: left;
    44. margin-left: 65px;
    45. }
    46. .nav ul li {
    47. float: left;
    48. margin: 0 15px;
    49. }
    50. .nav ul li a {
    51. /* 将a(行内元素)标签转换为行内块元素 */
    52. display: inline-block;
    53. height: 42px;
    54. padding: 0 10px;
    55. line-height: 42px;
    56. font-size: 18px;
    57. color: #050505;
    58. }
    59. /* 鼠标经过时展示下划线 */
    60. .nav ul li a:hover {
    61. border-bottom: 2px solid #00a4ff;
    62. }
    63. /* 搜索部分 */
    64. .search {
    65. float: left;
    66. width: 412px;
    67. height: 42px;
    68. margin-left: 50px;
    69. }
    70. .search input {
    71. /* input属于行内块元素,想要挨在一起没有缝隙,需要浮动 */
    72. float: left;
    73. /* 输入框宽度是360px,左侧内边距设置为20px,为了不影响盒子的大小,需要减掉内边距 */
    74. width: 340px;
    75. height: 40px;
    76. padding-left: 20px;
    77. border: 1px solid #00a4ff;
    78. border-right: 0;
    79. font-size: 14px;
    80. color: #bfbfbf;
    81. }
    82. .search button {
    83. float: left;
    84. height: 42px;
    85. width: 50px;
    86. border: 0;
    87. background: url(images/btn.png);
    88. }
    89. .user {
    90. float: right;
    91. margin-right: 35px;
    92. line-height: 42px;
    93. color: #666666;
    94. }
    95. .user p {
    96. float: right;
    97. line-height: 42px;
    98. display: inline-block;
    99. }
    100. .user img {
    101. margin: 5px 0;
    102. }
    103. /* banner部分 */
    104. .banner {
    105. height: 420px;
    106. background-color: #033db2;
    107. }
    108. .banner .w {
    109. height: 420px;
    110. background-image: url(images/banner1.png);
    111. }
    112. /* banner侧边栏部分 */
    113. .subnav {
    114. float: left;
    115. width: 190px;
    116. height: 420px;
    117. background: rgba(0, 0, 0, 0.3);
    118. }
    119. .subnav ul li {
    120. height: 45px;
    121. line-height: 45px;
    122. padding: 0 20px;
    123. }
    124. .subnav ul li a {
    125. font-size: 14px;
    126. color: #fff;
    127. }
    128. .subnav ul li a span {
    129. float: right;
    130. }
    131. /* 课程部分 */
    132. .course {
    133. float: right;
    134. width: 230px;
    135. height: 300px;
    136. margin: 50px 0;
    137. background-color: #ffffff;
    138. }
    139. .course h3 {
    140. display: inline-block;
    141. width: 230px;
    142. height: 50px;
    143. line-height: 50px;
    144. background: #9bceea;
    145. text-align: center;
    146. color: #ffffff;
    147. }
    148. .course .bd {
    149. padding: 0 20px;
    150. }
    151. .course ul li h4 {
    152. font-size: 14px;
    153. color: #4e4e4e;
    154. }
    155. .course .bd ul li p {
    156. font-size: 12px;
    157. color: #a5a5a5;
    158. }
    159. .course .bd ul .last {
    160. width: 192px;
    161. height: 38px;
    162. margin: 0 15px;
    163. border: 1px solid #aad8ff;
    164. }
    165. .course .bd ul li {
    166. padding: 14px 0;
    167. border-bottom: 1px solid #bebebe;
    168. }
    169. .course .bd .more {
    170. display: inline-block;
    171. height: 38px;
    172. width: 188px;
    173. border: 1px solid #22b0ff;
    174. margin-top: 5px;
    175. line-height: 38px;
    176. text-align: center;
    177. font-size: 16px;
    178. color: #00a4ff;
    179. font-weight: 700;
    180. }
    181. /* 精品推荐部分 */
    182. .goods {
    183. height: 60px;
    184. margin-top: 8px;
    185. line-height: 60px;
    186. background-color: #ffffff;
    187. box-shadow: 0 2px 3px 3px rgba(0, 0, 0, 0.1);
    188. }
    189. .goods h3 {
    190. float: left;
    191. margin: 0 35px;
    192. font-size: 16px;
    193. color: #00a4ff;
    194. font-weight: 700;
    195. }
    196. .goods ul {
    197. float: left;
    198. }
    199. .goods ul li {
    200. float: left;
    201. }
    202. .goods ul li a {
    203. padding: 0 35px;
    204. border-left: 1px solid #ccc;
    205. font-size: 16px;
    206. color: #050505;
    207. border-left: 1px solid #ccc;
    208. }
    209. .mod {
    210. float: right;
    211. margin-right: 27px;
    212. }
    213. .mod a {
    214. font-size: 14px;
    215. color: #00a4ff;
    216. }
    217. /* 精品推荐具体课程部分 */
    218. .box1 {
    219. margin-top: 10px;
    220. }
    221. .box1 .box-hd {
    222. height: 60px;
    223. line-height: 60px;
    224. }
    225. .box1 .box-hd h3 {
    226. float: left;
    227. font-size: 20px;
    228. color: #494949;
    229. font-weight: normal;
    230. }
    231. .box1 .box-hd a {
    232. float: right;
    233. margin-right: 30px;
    234. font-size: 12px;
    235. color: #a5a5a5;
    236. }
    237. /* 把li的父亲ul修改为足够宽一行能装5个盒子 就不会换行了 */
    238. .box-bd ul {
    239. width: 1225px;
    240. }
    241. .box-bd ul li {
    242. /* 子绝父相 */
    243. position: relative;
    244. float: left;
    245. width: 230px;
    246. height: 270px;
    247. margin-right: 12px;
    248. margin-bottom: 15px;
    249. background-color: #fff;
    250. }
    251. /* 强制图片宽度和父级li的宽度一样,使用子级选择器 */
    252. .box-bd ul li > img {
    253. width: 100%;
    254. }
    255. em {
    256. /* 子绝父相 */
    257. position: absolute;
    258. top: 4px;
    259. right: -4px;
    260. }
    261. .box-bd ul li h4 {
    262. margin: 20px 20px 20px 25px;
    263. font-size: 14px;
    264. color: #050505;
    265. font-weight: normal;
    266. }
    267. .box-bd ul li .info {
    268. padding-left: 25px;
    269. font-size: 12px;
    270. color: #999;
    271. }
    272. .box-bd ul li span {
    273. color: #ff7c2d;
    274. }
    275. /* 编程入门头部部分 */
    276. .box2 .box2-hd {
    277. height: 60px;
    278. line-height: 60px;
    279. }
    280. .box2-hd h4 {
    281. float: left;
    282. margin-right: 350px;
    283. font-size: 20px;
    284. color: #494949;
    285. font-weight: normal;
    286. }
    287. .box2-hd ul {
    288. float: left;
    289. }
    290. .box2-hd ul li a {
    291. display: inline-block;
    292. margin-right: 70px;
    293. font-size: 16px;
    294. color: #868686;
    295. }
    296. .box2-hd .more {
    297. float: right;
    298. margin-right: 30px;
    299. font-size: 12px;
    300. color: #a5a5a5;
    301. }
    302. /* 编程入门主体部分 */
    303. .box2-bd .left {
    304. float: left;
    305. width: 229px;
    306. height: 393px;
    307. }
    308. .box2-bd .right {
    309. float: right;
    310. }
    311. .box2-bd .right-s {
    312. float: right;
    313. height: 100px;
    314. }
    315. .box2-bd .right-x ul {
    316. float: right;
    317. }
    318. .box2-bd .right-x ul li {
    319. float: right;
    320. margin: 22px 0 0 14px;
    321. width: 228px;
    322. height: 270px;
    323. background-color: #fff;
    324. }
    325. .box2-bd .right-x ul li img {
    326. width: 100%;
    327. }
    328. .box2-bd .right-x ul li h4 {
    329. margin: 25px 20px 20px 20px;
    330. height: 30px;
    331. width: 190px;
    332. font-size: 14px;
    333. color: #050505;
    334. }
    335. .box2-bd .right-x ul li .info {
    336. margin-left: 25px;
    337. font-size: 12px;
    338. color: #999;
    339. }
    340. .box2-bd .right-x ul li .info span {
    341. color: #ff7c2d;
    342. }
    343. /* footer部分 */
    344. .footer {
    345. height: 415px;
    346. margin-top: 30px;
    347. background-color: #fff;
    348. }
    349. .footer .w {
    350. padding-top: 35px;
    351. }
    352. .copyright {
    353. float: left;
    354. }
    355. .copyright p {
    356. margin: 20px 0 15px 0;
    357. font-size: 12px;
    358. color: #333;
    359. }
    360. /* a标签属于行内元素,设置的高度和宽度无效,需要转换成块元素或行内块元素 */
    361. .copyright a {
    362. display: block;
    363. width: 118px;
    364. height: 33px;
    365. border: 1px solid #00a4ff;
    366. font-size: 16px;
    367. color: #00a4ff;
    368. line-height: 33px;
    369. text-align: center;
    370. }
    371. .links {
    372. float: right;
    373. }
    374. .links dl {
    375. float: left;
    376. padding-left: 120px;
    377. }
    378. .links dl dt {
    379. font-size: 16px;
    380. color: #333;
    381. }
    382. .links dl dd a {
    383. margin-top: 7px;
    384. font-size: 12px;
    385. color: #333;
    386. }

    结构代码:

    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>学成在线首页</title>
    8. <link rel="stylesheet" href="style.css" />
    9. </head>
    10. <body>
    11. <!-- 头部区域开始 -->
    12. <div class="head w">
    13. <!-- logo部分 -->
    14. <div class="logo">
    15. <img src="images/logo.png" alt="" />
    16. </div>
    17. <!-- 导航栏部分 -->
    18. <div class="nav">
    19. <ul>
    20. <li>
    21. <a href="#">首页</a>
    22. </li>
    23. <li>
    24. <a href="#">课程</a>
    25. </li>
    26. <li class="last">
    27. <a href="#">职业规划</a>
    28. </li>
    29. </ul>
    30. </div>
    31. <!-- 搜索部分 -->
    32. <div class="search">
    33. <input type="text" value="输入关键词" />
    34. <button></button>
    35. </div>
    36. <!-- 用户部分 -->
    37. <div class="user">
    38. <img src="images/user.png" alt="" />
    39. <p>qq-leishui</p>
    40. </div>
    41. </div>
    42. <!-- 头部区域结束 -->
    43. <!-- banner部分开始 -->
    44. <div class="banner">
    45. <!-- 版心 -->
    46. <div class="w">
    47. <!-- 左侧边栏部分开始 -->
    48. <div class="subnav">
    49. <ul>
    50. <li>
    51. <a href="#">前端开发 <span>&gt</span></a>
    52. </li>
    53. <li><a href="#">后端开<span>&gt</span></a></li>
    54. <li><a href="#">移动开<span>&gt</span></a></li>
    55. <li><a href="#">人工智<span>&gt</span></a></li>
    56. <li><a href="#">商业预<span>&gt</span></a></li>
    57. <li><a href="#">云计算<span>&gt</span>大数据</a></li>
    58. <li><a href="#">运维&<span>&gt</span>测试</a></li>
    59. <li><a href="#">UI设计<span>&gt</span>a></li>
    60. <li><a href="#">产品<span>&gt</span></li>
    61. </ul>
    62. </div>
    63. <!-- 左侧边栏结束 -->
    64. <!-- 右侧边栏开始 -->
    65. <div class="course">
    66. <h3>我的课程表</h3>
    67. <div class="bd">
    68. <ul>
    69. <li>
    70. <h4>继续学习 编程语言设计</h4>
    71. <p>正在学习-面向对象</p>
    72. </li>
    73. <li>
    74. <h4>继续学习 编程语言设计</h4>
    75. <p>正在学习-面向对象</p>
    76. </li>
    77. <li>
    78. <h4>继续学习 编程语言设计</h4>
    79. <p>正在学习-面向对象</p>
    80. </li>
    81. </ul>
    82. <a href="#" class="more">全部课程</a>
    83. </div>
    84. <!-- 右侧边栏结束 -->
    85. </div>
    86. </div>
    87. </div>
    88. <!-- banner部分结束 -->
    89. <!-- 精品推荐部分开始 -->
    90. <div class="goods w">
    91. <h3>精品推荐</h3>
    92. <!-- 精品推荐课程部分开始 -->
    93. <div class="">
    94. <ul>
    95. <li>
    96. <a href="#"> JQuery</a>
    97. </li>
    98. <li>
    99. <a href="#"> Apark</a>
    100. </li>
    101. <li>
    102. <a href="#"> MySQL</a>
    103. </li>
    104. <li>
    105. <a href="#"> JavaWeb</a>
    106. </li>
    107. <li>
    108. <a href="#"> MySQL</a>
    109. </li>
    110. <li>
    111. <a href="#"> JavaWeb</a>
    112. </li>
    113. </ul>
    114. </div>
    115. <!-- 精品课程推荐部分结束 -->
    116. <!-- 修改兴趣部分开始 -->
    117. <div class="mod"><a href="#">修改兴趣</a></div>
    118. <!-- 修改兴趣部分结束 -->
    119. </div>
    120. <!-- 精品推荐部分结束 -->
    121. <!-- 精品推荐课程部分开始 -->
    122. <div class="box1 w">
    123. <div class="box-hd">
    124. <h3>精品推荐</h3>
    125. <a href="#">查看全部</a>
    126. </div>
    127. <div class="box-bd">
    128. <ul class="clearfix">
    129. <li>
    130. <em>
    131. <img src="images/hot.png" alt="">
    132. </em>
    133. <img src="images/tj1.png" alt="">
    134. <h4>Think PHP 5.0 博客系统实战项目演练 </h4>
    135. <div class="info">
    136. <span>高级</span> • 1125人在学习
    137. </div>
    138. </li>
    139. <li>
    140. <img src="images/tj2.png" alt="">
    141. <h4>Android 网络图片加载框架详解 </h4>
    142. <div class="info">
    143. <span>高级</span> • 1125人在学习
    144. </div>
    145. </li>
    146. <li>
    147. <img src="images/tj3.png" alt="">
    148. <h4>Angular 2 最新框架+主流技术+项目实战 </h4>
    149. <div class="info">
    150. <span>高级</span> • 1125人在学习
    151. </div>
    152. </li>
    153. <li>
    154. <img src="images/tj45.png" alt="">
    155. <h4>Android Hybrid APP开发实战 H5+原生! </h4>
    156. <div class="info">
    157. <span>高级</span> • 1125人在学习
    158. </div>
    159. </li>
    160. <li>
    161. <img src="images/tj1.png" alt="">
    162. <h4>Android Hybrid APP开发实战 H5+原生! </h4>
    163. <div class="info">
    164. <span>高级</span> • 1125人在学习
    165. </div>
    166. </li>
    167. <li>
    168. <img src="images/tj1.png" alt="">
    169. <h4>Think PHP 5.0 博客系统实战项目演练 </h4>
    170. <div class="info">
    171. <span>高级</span> • 1125人在学习
    172. </div>
    173. </li>
    174. <li>
    175. <img src="images/tj2.png" alt="">
    176. <h4>Think PHP 5.0 博客系统实战项目演练 </h4>
    177. <div class="info">
    178. <span>高级</span> • 1125人在学习
    179. </div>
    180. </li>
    181. <li>
    182. <img src="images/tj3.png" alt="">
    183. <h4>Think PHP 5.0 博客系统实战项目演练 </h4>
    184. <div class="info">
    185. <span>高级</span> • 1125人在学习
    186. </div>
    187. </li>
    188. <li>
    189. <img src="images/tj45.png" alt="">
    190. <h4>Android Hybrid APP开发实战 H5+原生! </h4>
    191. <div class="info">
    192. <span>高级</span> • 1125人在学习
    193. </div>
    194. </li>
    195. <li>
    196. <img src="images/tj45.png" alt="">
    197. <h4>Android Hybrid APP开发实战 H5+原生! </h4>
    198. <div class="info">
    199. <span>高级</span> • 1125人在学习
    200. </div>
    201. </li>
    202. </ul>
    203. </div>
    204. </div>
    205. <!-- 精品推荐课程部分结束 -->
    206. <!-- 编程入门部分开始 -->
    207. <div class="box2 w">
    208. <!-- 编程入门头部开始 -->
    209. <div class="box2-hd">
    210. <h4>编程入门</h4>
    211. <div>
    212. <ul>
    213. <li>
    214. <a href="#">热门</a>
    215. <a href="#">初级</a>
    216. <a href="#">中级</a>
    217. <a href="#">高级</a>
    218. </li>
    219. </ul>
    220. </div>
    221. <a href="#" class="more">查看全部</a>
    222. </div>
    223. <!-- 编程入门头部结束 -->
    224. <!-- 编程入门主体部分开始 -->
    225. <div class="box2-bd clearfix">
    226. <!-- 编程入门主体部分结束 -->
    227. <div class="left">
    228. <img src="images/编程入门左侧.png" alt="">
    229. </div >
    230. <div class="right">
    231. <div class="right-s">
    232. <img src="images/编程入门右上.png" alt="">
    233. </div>
    234. <div class="right-x">
    235. <ul>
    236. <li>
    237. <img src="images/tj1.png" alt="">
    238. <h4>Android Hybrid APP开发实战 H5+原生!</h4>
    239. <div class="info">
    240. <span>高级</span> • 1125人在学习
    241. </div>
    242. </li>
    243. <li><img src="images/tj2.png" alt="">
    244. <h4>Android Hybrid APP开发实战 H5+原生!</h4>
    245. <div class="info">
    246. <span>高级</span> • 1125人在学习
    247. </div></li>
    248. <li><img src="images/tj3.png" alt="">
    249. <h4>Kami2首页界面切换效果 </h4>
    250. <div class="info">
    251. <span>高级</span> • 1125人在学习
    252. </div></li>
    253. <li><img src="images/tj45.png" alt="">
    254. <h4>Android Hybrid APP开发实战 H5+原生!</h4>
    255. <div class="info">
    256. <span>高级</span> • 1125人在学习
    257. </div></li>
    258. </ul>
    259. </div>
    260. </div>
    261. </div >
    262. </div>
    263. <!-- 编程入门部分结束 -->
    264. <!-- footer 部分开始 -->
    265. <div class="footer ">
    266. <div class="w">
    267. <div class="copyright">
    268. <img src="images/logo.png" alt="">
    269. <!-- 版本描述分为两行,p标签中使用br标签 -->
    270. <p>学成在线致力于普及中国最好的教育它与中国一流大学和机构合作提供在线课程。<br>
    271. © 2017年XTCG Inc.保留所有权利。-沪ICP备15025210号</p>
    272. <a href="#" class="app">下载app</a>
    273. </div>
    274. <div class="links">
    275. <dl>
    276. <dt>关于学成网</dt>
    277. <dd><a href="#">关于</a></dd>
    278. <dd><a href="#">管理团队</a></dd>
    279. <dd><a href="#">工作机会</a></dd>
    280. <dd><a href="#">客户服务</a></dd>
    281. <dd><a href="#">帮助</a></dd>
    282. </dl>
    283. <dl>
    284. <dt>新手指南</dt>
    285. <dd><a href="#">如何注册</a></dd>
    286. <dd><a href="#">如何选课</a></dd>
    287. <dd><a href="#">如何拿到毕业证</a></dd>
    288. <dd><a href="#">学分是什么</a></dd>
    289. <dd><a href="#">考试未通过怎么办</a></dd>
    290. </dl>
    291. <dl>
    292. <dt>合作伙伴</dt>
    293. <dd><a href="#">合作机构</a></dd>
    294. <dd><a href="#">合作导师</a></dd>
    295. </dl>
    296. </div>
    297. </div>
    298. </div>
    299. <!-- footer 部分结束 -->
    300. </body>
    301. </html>

  • 相关阅读:
    Hive安装教程-Hadoop集成Hive
    eyb:Redis学习(3)
    html+CSS+js部分基础运用14
    学长讲解 - FPGA与单片机的区别 【毕设基础概念】
    PHP is_file 和file_exists的区别
    Postgresql实验系列(4)SIMD提升线性搜索性能24.5%(附带PG SIMD完整用例)
    寒假训练——第三周(记忆化搜索)
    Find My背包|苹果Find My技术与背包相结合,智能防丢,全球定位
    分布式和微服务
    JUC第四讲:Java中的锁/CAS原理与案例分析
  • 原文地址:https://blog.csdn.net/weixin_47481102/article/details/124978353