博客列表 >HTML flex弹性布局实战之PC端通用布局和移动端布局解决方案

HTML flex弹性布局实战之PC端通用布局和移动端布局解决方案

写代码的张先森
写代码的张先森原创
2020年06月24日 15:46:111909浏览

PC端通用布局解决方案


我们利用flex弹性布局来快速完成一个PC端通用布局的解决方案,以后遇到类似布局可以直接仿照当前布局方案来做

代码:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>PC端布局的通用解决方案</title>
  7. <style>
  8. /* 初始化 */
  9. * {
  10. margin: 0;
  11. padding: 0;
  12. box-sizing: border-box;
  13. }
  14. a {
  15. color: #666;
  16. text-decoration: none;
  17. }
  18. body {
  19. /* 设置最小宽度 */
  20. min-width: 680px;
  21. /* 将body转为flex弹性容器 */
  22. display: flex;
  23. /* 主轴垂直方向,不换行 因为body下的元素都需要垂直布局 */
  24. flex-flow: column nowrap;
  25. }
  26. header,
  27. footer {
  28. /* 添加页眉和页脚的公共样式 */
  29. height: 50px;
  30. border: 1px solid #000;
  31. }
  32. header {
  33. /* 将页眉转为flex 弹性容器*/
  34. display: flex;
  35. /* 所有项目在交叉轴方向上居中显示 因为页眉的导航栏需要居中显示*/
  36. align-items: center;
  37. }
  38. header > a {
  39. /* 给定每个header下的弹性项目 不增长 不收缩 基础宽度100px */
  40. flex: 0 1 100px;
  41. /* 文本居中 */
  42. text-align: center;
  43. }
  44. /* Logo */
  45. header > a:first-of-type {
  46. margin-right: 50px;
  47. }
  48. header > a:last-of-type {
  49. margin-left: auto;
  50. }
  51. /* 鼠标悬停时忽略logo */
  52. header > a:hover:not(:first-of-type) {
  53. color: coral;
  54. }
  55. .banner {
  56. width: 1020px;
  57. height: 180px;
  58. /* 转为弹性布局 */
  59. display: flex;
  60. margin: 10px auto;
  61. }
  62. .banner img {
  63. width: 100%;
  64. }
  65. .container {
  66. /* 主体这里为了显示方便给定最小高度为400px */
  67. min-height: 400px;
  68. margin: 10px auto;
  69. /* 转为弹性布局 */
  70. display: flex;
  71. /* 剩余空间给两端平均分配 达到主体居中效果 */
  72. justify-content: center;
  73. }
  74. .container > aside,
  75. .container > main {
  76. border: 1px solid #000;
  77. padding: 10px;
  78. }
  79. .container > aside {
  80. /* 给定两个侧边栏基础宽度为200px */
  81. flex: 0 0 200px;
  82. }
  83. .container > main {
  84. /* 主体基础宽度为600px */
  85. flex: 0 0 600px;
  86. margin: 0 10px;
  87. }
  88. footer {
  89. /* 将页脚转为弹性布局 */
  90. display: flex;
  91. /* 弹性项目主轴为垂直排列 */
  92. flex-flow: column nowrap;
  93. /* 文本居中显示 */
  94. text-align: center;
  95. }
  96. </style>
  97. </head>
  98. <body>
  99. <!-- 页眉 -->
  100. <header>
  101. <a href="">LOGO</a>
  102. <a href="">首页</a>
  103. <a href="">栏目1</a>
  104. <a href="">栏目2</a>
  105. <a href="">栏目3</a>
  106. <a href="">登录</a>
  107. </header>
  108. <!-- 轮播图 -->
  109. <div class="banner">
  110. <img src="static/images/banner_pc.jpg" alt="" />
  111. </div>
  112. <!-- 主体 -->
  113. <div class="container">
  114. <!-- 左边栏 -->
  115. <aside>左边栏</aside>
  116. <!-- 主体内容区 -->
  117. <main>主体内容区</main>
  118. <!-- 右边栏 -->
  119. <aside>右边栏</aside>
  120. </div>
  121. <!-- 页脚 -->
  122. <footer>
  123. <p>
  124. 北京xx公司 &copy;版权所有 &nbsp;&nbsp;(2018-2022) | 备案号:
  125. <a href="">京ICP-18********</a>
  126. </p>
  127. <p>中国.北京市通州区金融街园中园999号 | 电话: 0551-888999**</p>
  128. </footer>
  129. </body>
  130. </html>

效果:

PC端的通用布局大体上就这样,可以仿照这个flex自己动手试试
注:图中为了演示效果把高度都调低了 实际开发科根据自身需求调节高度大小

移动端布局解决方案


接下来我们利用flex弹性布局来快速完成一个移动端通用布局的解决方案,以后遇到类似布局可以直接仿照当前布局方案来做

代码:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <!-- 加载字体图标 -->
  7. <link rel="stylesheet" href="static/css/font-icon.css" />
  8. <title>移动端的解决方案</title>
  9. <style>
  10. * {
  11. margin: 0;
  12. padding: 0;
  13. box-sizing: border-box;
  14. }
  15. a {
  16. text-decoration: none;
  17. color: #666;
  18. }
  19. html {
  20. /* vw: 可视区宽度,100指100份 */
  21. /* vh:可视区的高度,100指100分 */
  22. width: 100vw;
  23. height: 100vh;
  24. font-size: 14px;
  25. color: #666;
  26. }
  27. body {
  28. min-width: 360px;
  29. background-color: #fff;
  30. display: flex;
  31. flex-flow: column nowrap;
  32. }
  33. body > header {
  34. color: white;
  35. background-color: #333;
  36. height: 30px;
  37. display: flex;
  38. align-items: center;
  39. justify-content: space-between;
  40. position: fixed;
  41. width: 100vw;
  42. padding: 0 15px;
  43. }
  44. body > .slider {
  45. margin-top: 30px;
  46. height: 180px;
  47. }
  48. body > .slider > img {
  49. width: 100%;
  50. height: 100%;
  51. }
  52. /* 主导航区 */
  53. nav {
  54. height: 200px;
  55. margin-bottom: 10px;
  56. display: flex;
  57. /* 转为多行容器 */
  58. flex-flow: row wrap;
  59. align-content: space-around;
  60. }
  61. nav > div {
  62. width: 25vw;
  63. display: flex;
  64. flex-flow: column nowrap;
  65. align-items: center;
  66. }
  67. nav > div > a:first-of-type {
  68. text-align: center;
  69. }
  70. nav > div img {
  71. width: 50%;
  72. }
  73. /* 每个区域的标题样式 */
  74. .title {
  75. margin-top: 10px;
  76. font-size: 1.2rem;
  77. font-weight: normal;
  78. text-align: center;
  79. }
  80. /* 热销商品区 */
  81. .hot-goods {
  82. border-top: 1px solid #cdcdcd;
  83. margin-top: 10px;
  84. font-size: 0.8rem;
  85. display: flex;
  86. /* 水平多行容器 */
  87. flex-flow: row wrap;
  88. }
  89. .hot-goods img {
  90. width: 100%;
  91. }
  92. .hot-goods > .goods-img {
  93. /* 内边距并重置大小 */
  94. padding: 10px;
  95. box-sizing: border-box;
  96. /* 允许放大不允许缩小,否则项目不会换行,多行容器失效 */
  97. flex: 1 0 30vw;
  98. /* 再将每个商品描述转为flex */
  99. display: flex;
  100. /* 主轴垂直且不允许换行 */
  101. flex-flow: column nowrap;
  102. justify-content: center;
  103. }
  104. /* 商品描述的最后一个区域转flex,并设置项目在主轴上排列对齐方式 */
  105. .hot-goods > .goods-img > div {
  106. display: flex;
  107. /* 分散对齐 */
  108. justify-content: space-around;
  109. }
  110. /* 热销样式 */
  111. .hot {
  112. color: coral;
  113. }
  114. /* 商品列表区 */
  115. .list-goods {
  116. padding: 10px;
  117. border-top: 1px solid #cdcdcd;
  118. margin-top: 10px;
  119. font-size: 0.8rem;
  120. display: flex;
  121. /* 主轴水平 转为多行容器 */
  122. flex-flow: row wrap;
  123. /* 把底部占用的空间撑开 */
  124. margin-bottom: 55px;
  125. }
  126. /* 每个项目也转为flex */
  127. .list-goods > .goods-desc {
  128. /* 定义每个弹性项目的宽度 */
  129. width: 47vw;
  130. margin: 10px 0;
  131. /* 转为弹性布局 */
  132. display: flex;
  133. /* 弹性项目垂直排列 不换行 */
  134. flex-flow: column nowrap;
  135. }
  136. /* 列表中每个项目的样式,加些间距 */
  137. .list-goods > .goods-desc > a {
  138. padding: 10px;
  139. box-sizing: border-box;
  140. }
  141. .list-goods > .goods-desc > a:last-of-type:hover {
  142. color: lightseagreen;
  143. }
  144. /* 图片全部适应项目空间 */
  145. .list-goods img {
  146. width: 100%;
  147. }
  148. body > footer {
  149. color: #666;
  150. background-color: #efefef;
  151. border-top: 1px solid #ccc;
  152. height: 55px;
  153. position: fixed;
  154. bottom: 0;
  155. width: 100vw;
  156. display: flex;
  157. justify-content: space-evenly;
  158. }
  159. body > footer a {
  160. margin-top: 10px;
  161. font-size: 0.8rem;
  162. display: flex;
  163. /* 垂直排列不换行 */
  164. flex-flow: column nowrap;
  165. /* 交叉轴项目居中显示 */
  166. align-items: center;
  167. }
  168. body > footer a > span:first-of-type {
  169. /* 图标字体应该大一些 */
  170. font-size: 1.6rem;
  171. }
  172. </style>
  173. </head>
  174. <body>
  175. <!-- 页眉 -->
  176. <header>
  177. <a href="">LOGO</a>
  178. <span class="iconfont">&#xe61f;</span>
  179. </header>
  180. <!-- 轮播图 -->
  181. <div class="slider">
  182. <img src="static/images/banner.jpg" alt="" />
  183. </div>
  184. <!-- 主导航区 -->
  185. <nav>
  186. <div>
  187. <a href=""><img src="static/images/link1.webp" alt="" /></a>
  188. <a href="">京东超市</a>
  189. </div>
  190. <div>
  191. <a href=""><img src="static/images/link2.webp" alt="" /></a>
  192. <a href="">服装百货</a>
  193. </div>
  194. <div>
  195. <a href=""><img src="static/images/link3.webp" alt="" /></a>
  196. <a href="">数码精品</a>
  197. </div>
  198. <div>
  199. <a href=""><img src="static/images/link4.webp" alt="" /></a>
  200. <a href="">优惠劵</a>
  201. </div>
  202. <div>
  203. <a href=""><img src="static/images/link1.webp" alt="" /></a>
  204. <a href="">超市精选</a>
  205. </div>
  206. <div>
  207. <a href=""><img src="static/images/link2.webp" alt="" /></a>
  208. <a href="">服装百货</a>
  209. </div>
  210. <div>
  211. <a href=""><img src="static/images/link3.webp" alt="" /></a>
  212. <a href="">数码精品</a>
  213. </div>
  214. <div>
  215. <a href=""><img src="static/images/link4.webp" alt="" /></a>
  216. <a href="">优惠劵</a>
  217. </div>
  218. </nav>
  219. <!-- 热销商品 -->
  220. <h2>
  221. 热销商品<span class="iconfont hot" style="color: coral;">&#xe60b;</span>
  222. </h2>
  223. <div class="hot-goods">
  224. <div class="goods-img">
  225. <a href=""><img src="static/images/goods1.jpg" alt="" /></a>
  226. <p>Apple iPhone 11 128G</p>
  227. <div>
  228. <span>6299&nbsp;元</span>
  229. <span class="iconfont hot">&#xe602;</span>
  230. </div>
  231. </div>
  232. <div class="goods-img">
  233. <a href=""><img src="static/images/goods1.jpg" alt="" /></a>
  234. <p>Apple iPhone X 512G</p>
  235. <div>
  236. <span>8299&nbsp;元</span>
  237. <span class="iconfont hot">&#xe602;</span>
  238. </div>
  239. </div>
  240. <div class="goods-img">
  241. <a href=""><img src="static/images/goods2.jpg" alt="" /></a>
  242. <p>华为笔记本电脑</p>
  243. <div>
  244. <span>5699&nbsp;元</span>
  245. <span class="iconfont hot">&#xe602;</span>
  246. </div>
  247. </div>
  248. <div class="goods-img">
  249. <a href=""><img src="static/images/goods2.jpg" alt="" /></a>
  250. <p>小米笔记本电脑</p>
  251. <div>
  252. <span>3999&nbsp;元</span>
  253. <span class="iconfont hot">&#xe602;</span>
  254. </div>
  255. </div>
  256. <div class="goods-img">
  257. <a href=""><img src="static/images/goods2.jpg" alt="" /></a>
  258. <p>联想笔记本电脑</p>
  259. <div>
  260. <span>4399&nbsp;元</span>
  261. <span class="iconfont hot">&#xe602;</span>
  262. </div>
  263. </div>
  264. </div>
  265. <!-- 商品列表区 -->
  266. <h2 class="title">
  267. 商品列表<span class="iconfont hot" style="color: coral;">&#xe64b;</span>
  268. </h2>
  269. <div class="list-goods">
  270. <div class="goods-desc">
  271. <a href=""><img src="static/images/goods4.jpg" alt="" /></a>
  272. <a href=""
  273. >[白条24期免息]Apple苹果iPhone 11 手机 128G 全网通, 免费领取500元话费,
  274. 今天17:00下单,明晨12:00之前送达,7天无理由退货,官方提供售后,
  275. 以上都是我瞎编的<span
  276. class="iconfont hot"
  277. style="vertical-align: middle;"
  278. >&#xe675;</span
  279. ></a
  280. >
  281. </div>
  282. <div class="goods-desc">
  283. <a href=""><img src="static/images/goods3.jpg" alt="" /></a>
  284. <a href=""
  285. >[白条24期免息]Apple洗衣机,专业清洗苹果手机,
  286. 苹果电脑,iPad,洗好保证不能用, 免费领取500元保险费,
  287. 今天17:00下单,明晨12:00之前送达,7天无理由退货,官方提供售后,
  288. 以上都是我瞎编的<span
  289. class="iconfont hot"
  290. style="vertical-align: middle;"
  291. >&#xe675;</span
  292. ></a
  293. >
  294. </div>
  295. <div class="goods-desc">
  296. <a href=""><img src="static/images/goods5.png" alt="" /></a>
  297. <a href=""
  298. >[白条24期免息]Apple苹果iPhone 11 手机 128G 全网通, 免费领取500元话费,
  299. 今天17:00下单,明晨12:00之前送达,7天无理由退货,官方提供售后,
  300. 以上都是我瞎编的<span
  301. class="iconfont hot"
  302. style="vertical-align: middle;"
  303. >&#xe675;</span
  304. ></a
  305. >
  306. </div>
  307. <div class="goods-desc">
  308. <a href=""><img src="static/images/goods2.jpg" alt="" /></a>
  309. <a href=""
  310. >[白条24期免息]华为笔记本MateBook 14 全面屏轻薄性能笔记本电脑
  311. 十代酷睿(i5 16G 512G MX250 触控屏 多屏协同)灰, 以上都是我瞎编的<span
  312. class="iconfont hot"
  313. style="vertical-align: middle;"
  314. >&#xe675;</span
  315. ></a
  316. >
  317. </div>
  318. </div>
  319. <footer>
  320. <a href="">
  321. <span class="iconfont hot">&#xe60c;</span>
  322. <span>首页</span>
  323. </a>
  324. <a href="">
  325. <span class="iconfont hot">&#xe64b;</span>
  326. <span>分类</span>
  327. </a>
  328. <a href="">
  329. <span class="iconfont hot">&#xe602;</span>
  330. <span>购物车</span>
  331. </a>
  332. <a href="">
  333. <span class="iconfont hot">&#xe65b;</span>
  334. <span>未登录</span>
  335. </a>
  336. </footer>
  337. </body>
  338. </html>

效果图:

注:以上主要代码都在代码块重做了注释,请详细阅读代码,以上移动端布局示例都是采用flex弹性布局来做的。

小结:


1.请结合图中代码亲自动手试一下效果,用到的技术:阿里云字体图标的引用,flex弹性布局,css其他样式属性
2.以上两个示例只是大部分网站通用的格式,可根据自己的想法进行修改和重新布局

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议