移动端布局方案学习,并简易仿写今日头条移动端布局

原创 阁主  2023-07-27 09:19:38  阅读 764 次 评论 0 条
摘要:

记录移动端布局方案,并简易仿照今日头条移动端布局的学习笔记。

三个视口

  1. 布局视口(Layout viewport): CSS
  2. 视觉视口(Visual viewport): 页面显示区域
  3. 理想视口(Ideal viewport): 移动端

理想视口

  1. width=device-width: 布局视口宽度=设备视口宽度
  2. 不再使用默认的布局视口宽度(980px),防止出现缩放和滚动条

移动端布局方案

  1. rem + vw
  2. rem = html.font-size
  3. 1rem = 100px
  4. DPR: 设备像素比 = 设备像素 / 布局(CSS)像素
  5. iPhone SE = iPhone 6, DRP = 2
  6. 750px / 350px = 2
  7. 布局时用: 375px, 但是在设备中显示时,可以根据 DPR 换算成物理像素

rem 动态化

  1. 1rem = 100px = html.font-size
  2. iPhone6: 1rem = 100px = 375 / 3.75 = 100px
  3. iPhone12: 390/3.75 = 104px = 1rem
  4. rem 应该用一个相对单位表示,而不应该用绝对值 px
  5. 表示 rem 的相对单位: vw
  6. 100px => vw
  7. 375px = 100 宽度 = 100vw
  8. 100 * ? = 375px, ? = 3.75
  9. 1vw = 3.75px
  10. iPhone6: 375px = 3.75rem = 100vw
  11. rem 动态公式: font-size: calc(100vw / 3.75) = 100px
  12. 100vw 是一个相对值, 它的初始值(默认值): 375px

三个视口

  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. <!-- 设置视口
  7. width: 布局的时候的参考
  8. device-width: 设备视口,就是显示页面的屏幕
  9. width=device-width: 我直接为指定的设备进行布局
  10. -->
  11. <!-- <meta name="viewport" content="width=device-width, initial-scale=1.0" /> -->
  12. <meta name="viewport" content="width=device-width" />
  13. <title>三个视口</title>
  14. </head>
  15. <body>
  16. <div>Box</div>
  17. <style>
  18. html {
  19. /* 1rem = 100px 是为了布局的 */
  20. /* font-size: 100px; */
  21. /* 375px 是手机的宽度 */
  22. /* 手机100%宽度 = 375px = 100vw */
  23. /* vm: 视口的宽度,1vw = 1/100 */
  24. /* font-size: calc(375px / 3.75); */
  25. /* 375px = 100vw */
  26. /* 375px是一个绝对值 */
  27. /* 100vw 是一个相对值 */
  28. /* 500px = 100vw */
  29. /* 800px = 100vw */
  30. font-size: calc(100vw / 3.75);
  31. /* 如果将rem 变成一个相对值,变量 */
  32. /* iphone 6, 375px = 100vw , 1rem = 100px */
  33. /* iphone xr : 414px = 100vw , 1rem = 110.4px */
  34. /* iphone 12 pro, 390px = 100vw 1rem = 104px */
  35. }
  36. /* 必须在body中将字号还原 */
  37. body {
  38. /* 1rem = 100px */
  39. /* 16px = 0.16rem = 0.16 * 100 */
  40. font-size: 0.16rem;
  41. }
  42. </style>
  43. </body>
  44. </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. <title>手机端通用代码</title>
  8. <style>
  9. * {
  10. margin: 0;
  11. padding: 0;
  12. box-sizing: border-box;
  13. }
  14. header {
  15. background-color: lightblue;
  16. top: 0;
  17. left: 0;
  18. right: 0;
  19. /* 调整层级 */
  20. z-index: 8;
  21. }
  22. footer {
  23. background-color: lightgreen;
  24. bottom: 0;
  25. left: 0;
  26. right: 0;
  27. }
  28. header,
  29. footer {
  30. /* 固定定位 */
  31. position: fixed;
  32. height: 50px;
  33. }
  34. main {
  35. background-color: yellow;
  36. min-height: 2000px;
  37. position: relative;
  38. top: 50px;
  39. }
  40. </style>
  41. </head>
  42. <body>
  43. <!-- 1. 页眉 -->
  44. <header>页眉</header>
  45. <!-- 2. 主体 -->
  46. <main>主体</main>
  47. <!-- 3. 页脚 -->
  48. <footer>页脚</footer>
  49. </body>
  50. </html>

仿今日头条移动端

效果图如下:
今日头条移动端布局效果

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. <title>仿头条-主体</title>
  8. <!-- 首页css -->
  9. <link rel="stylesheet" href="static/css/index.css">
  10. </head>
  11. <body>
  12. <!-- 页眉 -->
  13. <div class="header">
  14. <!-- 1. 搜索框 -->
  15. <div class="search">
  16. <!-- 1.1 关键字输入框 left -->
  17. <div class="keys">
  18. <!-- 放大镜: 字体图标 -->
  19. <span class="iconfont icon-fangdajing"></span>
  20. <!-- 关键字,预置的 -->
  21. <span>习近平主席访问俄罗斯</span>
  22. </div>
  23. <!-- 1.2 发布按钮 right-->
  24. <div class="publish">
  25. <!-- 字体图标 -->
  26. <span class="iconfont icon-jiahao"></span>
  27. <span>发布</span>
  28. </div>
  29. </div>
  30. <!-- 2. 导航组 -->
  31. <div class="navs">
  32. <a href="" class="active">推荐</a>
  33. <a href="">科技</a>
  34. <a href="">数码</a>
  35. <a href="">军事</a>
  36. <a href="">科技</a>
  37. </div>
  38. </div>
  39. <!-- 主体 -->
  40. <div class="main">
  41. <!--
  42. 1. 文本 + 标签
  43. 2. 左边文本 + 右边图片
  44. 3. 上面文本 + 三张图片
  45. 4. 上面文本 + 视频
  46. -->
  47. <!-- 1. 文本 + 标签 -->
  48. <div class="rec-list">
  49. <a href="" class="item">
  50. <span class="title">习近平主席访俄第一天,这些信息值得关注</span>
  51. <div class="desc">
  52. <span class="tag">置顶</span>
  53. <div class="other">
  54. <span>已关注</span>
  55. <span>央视新闻</span>
  56. <span>1899条评论</span>
  57. </div>
  58. </div>
  59. </a>
  60. <a href="" class="item">
  61. <span class="title">习近平主席访俄第一天,这些信息值得关注</span>
  62. <div class="desc">
  63. <span class="tag">置顶</span>
  64. <div class="other">
  65. <span>已关注</span>
  66. <span>央视新闻</span>
  67. <span>1899条评论</span>
  68. </div>
  69. </div>
  70. </a>
  71. <a href="" class="item">
  72. <span class="title">习近平主席访俄第一天,这些信息值得关注</span>
  73. <div class="desc">
  74. <span class="tag">置顶</span>
  75. <div class="other">
  76. <span>已关注</span>
  77. <span>央视新闻</span>
  78. <span>1899条评论</span>
  79. </div>
  80. </div>
  81. </a>
  82. <a href="" class="item">
  83. <span class="title">习近平主席访俄第一天,这些信息值得关注</span>
  84. <div class="desc">
  85. <span class="tag">置顶</span>
  86. <div class="other">
  87. <span>已关注</span>
  88. <span>央视新闻</span>
  89. <span>1899条评论</span>
  90. </div>
  91. </div>
  92. </a>
  93. </div>
  94. <!-- 2. 左边文本 + 右边图片 -->
  95. <div class="img1-list">
  96. <a href="" class="item">
  97. <!-- 文本 -->
  98. <div class="left">
  99. <div class="title">还派什么大使,美图晾了我们14个月,是时候反击了</div>
  100. <div class="desc">
  101. <span class="author">默默读书君</span>
  102. <span class="replay-num">88条评论</span>
  103. <span class="time">10小时前</span>
  104. </div>
  105. </div>
  106. <!-- 图片 -->
  107. <img src="static/images/1.jpeg" class="right"></>
  108. </a>
  109. <a href="" class="item">
  110. <!-- 文本 -->
  111. <div class="left">
  112. <div class="title">还派什么大使,美图晾了我们14个月,是时候反击了</div>
  113. <div class="desc">
  114. <span class="author">默默读书君</span>
  115. <span class="replay-num">88条评论</span>
  116. <span class="time">10小时前</span>
  117. </div>
  118. </div>
  119. <!-- 图片 -->
  120. <img src="static/images/1.jpeg" class="right"></>
  121. </a>
  122. <a href="" class="item">
  123. <!-- 文本 -->
  124. <div class="left">
  125. <div class="title">还派什么大使,美图晾了我们14个月,是时候反击了</div>
  126. <div class="desc">
  127. <span class="author">默默读书君</span>
  128. <span class="replay-num">88条评论</span>
  129. <span class="time">10小时前</span>
  130. </div>
  131. </div>
  132. <!-- 图片 -->
  133. <img src="static/images/1.jpeg" class="right"></>
  134. </a>
  135. <a href="" class="item">
  136. <!-- 文本 -->
  137. <div class="left">
  138. <div class="title">还派什么大使,美图晾了我们14个月,是时候反击了</div>
  139. <div class="desc">
  140. <span class="author">默默读书君</span>
  141. <span class="replay-num">88条评论</span>
  142. <span class="time">10小时前</span>
  143. </div>
  144. </div>
  145. <!-- 图片 -->
  146. <img src="static/images/1.jpeg" class="right"></>
  147. </a>
  148. </div>
  149. <!-- 3. 上面文本 + 三张图片 -->
  150. <div class="img2-list">
  151. <a href="" class="item">
  152. <div class="title">2001年金吉奇用承诺诱捕米洛舍维奇,将其私自引渡海牙,下场如何?</div>
  153. <div class="imgs">
  154. <img src="static/images/2.jpeg" alt="">
  155. <img src="static/images/2.jpeg" alt="">
  156. <img src="static/images/2.jpeg" alt="">
  157. </div>
  158. </a>
  159. <a href="" class="item">
  160. <div class="title">2001年金吉奇用承诺诱捕米洛舍维奇,将其私自引渡海牙,下场如何?</div>
  161. <div class="imgs">
  162. <img src="static/images/2.jpeg" alt="">
  163. <img src="static/images/2.jpeg" alt="">
  164. <img src="static/images/2.jpeg" alt="">
  165. </div>
  166. </a>
  167. <a href="" class="item">
  168. <div class="title">2001年金吉奇用承诺诱捕米洛舍维奇,将其私自引渡海牙,下场如何?</div>
  169. <div class="imgs">
  170. <img src="static/images/2.jpeg" alt="">
  171. <img src="static/images/2.jpeg" alt="">
  172. <img src="static/images/2.jpeg" alt="">
  173. </div>
  174. </a>
  175. <a href="" class="item">
  176. <div class="title">2001年金吉奇用承诺诱捕米洛舍维奇,将其私自引渡海牙,下场如何?</div>
  177. <div class="imgs">
  178. <img src="static/images/2.jpeg" alt="">
  179. <img src="static/images/2.jpeg" alt="">
  180. <img src="static/images/2.jpeg" alt="">
  181. </div>
  182. </a>
  183. </div>
  184. <!-- 4. 上面文本 + 视频 -->
  185. <div class="video-list">
  186. <a href="" class="item">
  187. <div class="title">一生必须要去的5个地方,不要等老了才想来了,就太迟了,带上爱人现在出发</div>
  188. <div class="video"><video src="static/images/v1.mp4" controls></video></div>
  189. </a>
  190. <a href="" class="item">
  191. <div class="title">一生必须要去的5个地方,不要等老了才想来了,就太迟了,带上爱人现在出发</div>
  192. <div class="video"><video src="static/images/v1.mp4" controls></video></div>
  193. </a>
  194. <a href="" class="item">
  195. <div class="title">一生必须要去的5个地方,不要等老了才想来了,就太迟了,带上爱人现在出发</div>
  196. <div class="video"><video src="static/images/v1.mp4" controls></video></div>
  197. </a>
  198. <a href="" class="item">
  199. <div class="title">一生必须要去的5个地方,不要等老了才想来了,就太迟了,带上爱人现在出发</div>
  200. <div class="video"><video src="static/images/v1.mp4" controls></video></div>
  201. </a>
  202. </div>
  203. <!-- 页脚 -->
  204. <div class="footer">
  205. <a href="" class="active">
  206. <span class="iconfont icon-shouye"></span>
  207. <span>首页</span>
  208. </a>
  209. <a href="">
  210. <span class="iconfont icon-24gl-play"></span>
  211. <span>视频</span>
  212. </a>
  213. <a href="">
  214. <span class="iconfont icon-yonghuguanli_huaban"></span>
  215. <span>小组</span>
  216. </a>
  217. <a href="">
  218. <span class="iconfont icon-yonghu"></span>
  219. <span>我的</span>
  220. </a>
  221. </div>
  222. </body>
  223. </html>

index.css文件代码:

  1. /* 初始化css */
  2. @import url('reset.css');
  3. /* 字体图标css */
  4. @import url('../font_icon/iconfont.css');
  5. /* 页眉 css */
  6. @import url('header.css');
  7. /* 页脚 css */
  8. @import url('footer.css');
  9. /* 主体 css */
  10. @import url('main.css');

初始化css的reset.css文件代码:

  1. /* 初始化 */
  2. * {
  3. margin: 0;
  4. padding: 0;
  5. box-sizing: border-box;
  6. }
  7. /* 链接 */
  8. a {
  9. text-decoration: none;
  10. color: #555;
  11. }
  12. /* rem 随设备宽度自动适应 */
  13. html {
  14. /* 1rem = 100px */
  15. font-size: calc(100vw / 3.75);
  16. }
  17. /* 字号重置 */
  18. body {
  19. /* 移动端,禁止出现px */
  20. /* font-size: 16px; */
  21. font-size: 0.16rem;
  22. color: #333;
  23. background-color: #fff;
  24. /* 水平居中 */
  25. margin: 0 auto;
  26. /* 15px = 0.15rem */
  27. padding: 0 0.15rem;
  28. }
  29. /* 外部资源的自适应, img, video */
  30. body img,
  31. body video {
  32. width: 100%;
  33. }
  34. /* 可选: 媒体查询 */
  35. @media (max-width: 320px) {
  36. html {
  37. font-size: 85px;
  38. }
  39. }
  40. @media (min-width: 640px) {
  41. html {
  42. font-size: 170px;
  43. }
  44. }

页眉header.css文件代码:

  1. .header {
  2. /* 固定定位 */
  3. position: fixed;
  4. left: 0;
  5. top: 0;
  6. right: 0;
  7. border-bottom: 1px solid #ccc;
  8. /* 层级,确保永远在最前面,不被其它元素盖住 */
  9. z-index: 999;
  10. background-color: #fff;
  11. }
  12. /* 搜索框 */
  13. .header .search {
  14. background-color: red;
  15. padding: 0.08rem 0.15rem;
  16. /* 左输入框,右发布按钮 */
  17. display: grid;
  18. grid-template-columns: 1fr 0.5rem;
  19. }
  20. /* 关键字 */
  21. .header .search .keys {
  22. background-color: #fff;
  23. border-radius: 1.5rem;
  24. display: flex;
  25. /* 交叉轴居中 */
  26. place-items: center;
  27. padding-left: 0.1rem;
  28. }
  29. /* 发布按钮 */
  30. .header .search .publish {
  31. color: white;
  32. display: grid;
  33. place-items: center;
  34. }
  35. /* 图标大小跳调整 */
  36. .header .search .publish > span:first-child {
  37. font-size: 0.2rem;
  38. }
  39. /* 发布文字大小调整 */
  40. .header .search .publish > span:last-child {
  41. font-size: xx-small;
  42. }
  43. /* ------------------------ */
  44. .header .navs {
  45. display: flex;
  46. place-content: space-around;
  47. padding: 0.1rem 0 0.05rem;
  48. }
  49. .header .navs a.active {
  50. color: red;
  51. }
  52. /* 激活状态下才会显示红色的下划线 */
  53. /* 伪元素, html代码中看不到的,通过css添加的 */
  54. /* 伪元素前面使用双冒号, ::before, ::after */
  55. /* 宿主元素a 做为绝对定位的父级 */
  56. .header .navs a {
  57. position: relative;
  58. }
  59. .header .navs a.active::after {
  60. content: "";
  61. position: absolute;
  62. left: 0;
  63. width: 0.3rem;
  64. height: 0.03rem;
  65. bottom: -0.04rem;
  66. background-color: red;
  67. }

页脚footer.css文件代码:

  1. .footer {
  2. position: fixed;
  3. left: 0;
  4. right: 0;
  5. bottom: 0;
  6. background-color: #efefef;
  7. display: flex;
  8. place-content: space-around;
  9. }
  10. .footer a {
  11. display: grid;
  12. place-items: center;
  13. /* 12px */
  14. font-size: x-small;
  15. }
  16. /* 图标大一点 */
  17. .footer a .iconfont {
  18. font-size: xx-large;
  19. }
  20. .footer a.active {
  21. color: red;
  22. }

内容主体main.css文件代码:

  1. .main {
  2. min-height: 2000px;
  3. /* border: 1px solid #000; */
  4. position: relative;
  5. top: 1rem;
  6. padding-bottom: 0.6rem;
  7. }
  8. /* 1. 文本 + 标签 */
  9. .main .rec-list .item {
  10. display: block;
  11. margin-top: 0.1rem;
  12. }
  13. .main .rec-list .item .desc {
  14. display: flex;
  15. font-size: xx-small;
  16. gap: 0.1rem;
  17. }
  18. .main .rec-list .item .desc .tag {
  19. color: red;
  20. }
  21. .main .rec-list .item .desc .other {
  22. color: #ccc;
  23. }
  24. /* 2. 左边文本 + 右边图片 */
  25. .main .img1-list .item {
  26. margin-top: 0.1rem;
  27. display: grid;
  28. grid-template-columns: 1fr 1.3rem;
  29. gap: 0.2rem;
  30. }
  31. .main .img1-list .item .left {
  32. display: grid;
  33. /* 两端对齐 */
  34. place-content: space-between;
  35. }
  36. .main .img1-list .item .left .desc {
  37. font-size: xx-small;
  38. color: #ccc;
  39. }
  40. /* 3. 上面文本 + 三张图片 */
  41. .main .img2-list .item {
  42. display: block;
  43. margin-top: 0.1rem;
  44. }
  45. .main .img2-list .item .imgs {
  46. margin-top: 0.05rem;
  47. display: grid;
  48. grid-template-columns: repeat(3, 1fr);
  49. gap: 0.05rem;
  50. }
  51. /* 4. 上面文本 + 视频 */
  52. .main .video-list .item {
  53. display: block;
  54. margin-top: 0.1rem;
  55. }
  56. .main .video-list .item .video {
  57. margin-top: 0.05rem;
  58. }

附件

由于涉及到图标文件、字体文件、视频素材,同时上传一份完整源代码。

已经过安全软件检测无毒,请您放心下载。
本文地址:https://www.mainblog.cn/325.html
版权声明:本文为原创文章,版权归 阁主 所有,欢迎分享本文,转载请保留出处!
免责申明:有些内容源于网络,没能联系到作者。如侵犯到你的权益请告知,我们会尽快删除相关内容。

评论已关闭!