一、移动端开发要点

  • 视图,指的是屏幕可以展示的地方
    1. <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0,
    2. maximum-scale=1.0, minimum-scale=1.0">
    | 属性 | 说明 | | —- | —- | | width | 宽度设置的是viewport宽度,可以设置device-width的特殊值 | | initial-scale | 初始缩放比,大于0的数字,一般取值为1.0 | | maximum-scale | 最大缩放比,大于0的数字,一般取值为1.0 | | minimum-scale | 最小缩放比,大于0的数字,一般取值为1.0 | | user-scalable | 用户是否可以缩放,取值yes或no(1或0) |
  1. <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0,
  2. minimum-scale=1.0, user-scalable=no">
  3. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  • css中的px不等于手机的物理像素值,通常是1px=2物理像素或者1px=3物理像素等等

1.1 二倍图以及多倍图(和背景图缩放方式)

  • 一张50*50px的图片,在手机上展开,按照刚才的物理像素比会将图片放大倍数导致图片模糊
  • 因此用倍图来解决这个问题
  • 通常这样子做:
    • 在手机上要想展示清楚的图片,就优先考虑图片在手机上会放大的因素,因此先选用在手机上能高清展示的多倍图,
    • 然后手动通过调节css样式,将图片按照进行物理像素比进行缩小即可 ```html img{ /原始能在手机上高清展示的100100px的图片,进行手动按照物理像素比缩小*/ width:50px; heigh:50px; }

.box{ /背景图片缩放/ /可以写百分比,根据父盒子的长度或宽度取百分比值/ /如果只写一个,则默认是宽度,长度根据宽度等比例缩放/ /如果取值cover,则是等比例缩放至完全覆盖div盒子/ /如果取值contain,则是等比例缩放至当高度或宽度铺满div盒子为止/ background-size:50px 50px; }

css高级(二——移动端布局) - 图1

  1. <a name="JKEQT"></a>
  2. ## 1.2 移动端开发选择
  3. <a name="Agvsg"></a>
  4. ### (1)移动端css初始化normalize.css
  5. - normalize.css:保护了有价值的默认值,修复了浏览器的bug,是模块化的,拥有详细的文档;
  6. - 官网:http://necolas.github.io/normalize.css/
  7. <a name="rQAFY"></a>
  8. ### (2)移动端特殊样式
  9. - css3盒子模型:
  10. - box-sizing:border-box;
  11. - -webkit-box-sizing:border-box;
  12. - 清除点击高亮效果:
  13. - -webkit-tap-highlight-color:transparent;
  14. - 取消移动端按钮、输入框默认的样式,以便自定义样式
  15. - -webkit-appearance:none;
  16. - 禁用长按页面时弹出菜单(尤其是图片和链接)
  17. - img,a{ -webkit-touch-callout:none; }
  18. <a name="BfdrX"></a>
  19. ## 3.3 移动端常见的页面布局
  20. <a name="wI4vF"></a>
  21. ### (1)技术选型——单独制作移动端页面(主流)
  22. - 说白了就是单独写几个页面,pc端和移动端单独制作,移动端通常在域名中加个“m”
  23. <a name="cSRMU"></a>
  24. #### 流式布局(百分比布局):
  25. - 通过盒子的宽度设置成百分比来进行伸缩,不受固定像素的限制,内容项两侧填充
  26. - max-width 最大宽度(max-height 最大高度)
  27. - min-width 最小宽度(min-height 最小高度)
  28. - 流式布局案例
  29. - index.html
  30. ```html
  31. <!DOCTYPE html>
  32. <html lang="en">
  33. <head>
  34. <meta charset="UTF-8">
  35. <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no,maximum-scale=1.0,minimum-scale=1.0">
  36. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  37. <!-- 引入我们的css初始化文件 -->
  38. <link rel="stylesheet" href="css/normalize.css">
  39. <!-- 引入我们首页的css -->
  40. <link rel="stylesheet" href="css/index.css">
  41. <title>Document</title>
  42. </head>
  43. <body>
  44. <!-- 顶部 -->
  45. <header class="app">
  46. <ul>
  47. <li>
  48. <img src="images/close.png" alt="">
  49. </li>
  50. <li>
  51. <img src="images/logo.png" alt="">
  52. </li>
  53. <li>打开京东App,购物更轻松</li>
  54. <li>立即打开</li>
  55. </ul>
  56. </header>
  57. <!-- 搜索 -->
  58. <div class="search-wrap">
  59. <div class="search-btn"></div>
  60. <div class="search">
  61. <div class="jd-icon"></div>
  62. <div class="sou"></div>
  63. </div>
  64. <div class="search-login">登陆</div>
  65. </div>
  66. <!-- 主体内容部分 -->
  67. <div class="main-content">
  68. <!-- 滑动图 -->
  69. <div class="slider">
  70. <img src="upload/banner.dpg" alt="">
  71. </div>
  72. <!-- 小家电品牌日 -->
  73. <div class="brand">
  74. <div>
  75. <a href="#">
  76. <img src="upload/pic11.dpg" alt="">
  77. </a>
  78. </div>
  79. <div>
  80. <a href="#">
  81. <img src="upload/pic22.dpg" alt="">
  82. </a>
  83. </div>
  84. <div>
  85. <a href="#">
  86. <img src="upload/pic33.dpg" alt="">
  87. </a>
  88. </div>
  89. </div>
  90. <!-- nav部分 -->
  91. <nav class="clearfix">
  92. <a href="">
  93. <img src="upload/nav1.webp" alt="">
  94. <span>京东超市</span>
  95. </a>
  96. <a href="">
  97. <img src="upload/nav2.webp" alt="">
  98. <span>京东超市</span>
  99. </a>
  100. <a href="">
  101. <img src="upload/nav1.webp" alt="">
  102. <span>京东超市</span>
  103. </a>
  104. <a href="">
  105. <img src="upload/nav1.webp" alt="">
  106. <span>京东超市</span>
  107. </a>
  108. <a href="">
  109. <img src="upload/nav1.webp" alt="">
  110. <span>京东超市</span>
  111. </a>
  112. <a href="">
  113. <img src="upload/nav3.webp" alt="">
  114. <span>京东超市</span>
  115. </a>
  116. <a href="">
  117. <img src="upload/nav1.webp" alt="">
  118. <span>京东超市</span>
  119. </a>
  120. <a href="">
  121. <img src="upload/nav1.webp" alt="">
  122. <span>京东超市</span>
  123. </a>
  124. <a href="">
  125. <img src="upload/nav1.webp" alt="">
  126. <span>京东超市</span>
  127. </a>
  128. <a href="">
  129. <img src="upload/nav1.webp" alt="">
  130. <span>京东超市</span>
  131. </a>
  132. </nav>
  133. <!-- 新闻模块 -->
  134. <div class="news">
  135. <a href="#">
  136. <img src="upload/new1.dpg" alt="">
  137. </a>
  138. <a href="#">
  139. <img src="upload/new2.dpg" alt="">
  140. </a>
  141. <a href="#">
  142. <img src="upload/new3.dpg" alt="">
  143. </a>
  144. </div>
  145. </div>
  146. </body>
  147. </html>
  • index.css ```css body { width: 100%; min-width: 320px; max-width: 640px; margin: 0 auto; font-size: 14px; font-family: -apple-system, Helvetica, sans-serif; color: #666; line-height: 1.5; }

/点击高亮我们需要清除清除 设置为transparent 完成透明/

  • { -webkit-tap-highlight-color: transparent; }

/在移动端浏览器默认的外观在iOS上加上这个属性才能给按钮和输入框自定义样式/

input { -webkit-appearance: none; }

/禁用长按页面时的弹出菜单/

img, a { -webkit-touch-callout: none; }

a { color: #666; text-decoration: none; }

ul { margin: 0; padding: 0; list-style: none; }

img { vertical-align: middle; }

div { / css3 盒子模型 / box-sizing: border-box; }

.clearfix:after { content: “”; display: block; line-height: 0; visibility: hidden; height: 0; clear: both; }

.app { height: 45px; }

.app ul li { float: left; height: 45px; line-height: 45px; background-color: #333333; text-align: center; color: #fff; }

.app ul li:nth-child(1) { width: 8%; }

.app ul li:nth-child(1) img { width: 10px; }

.app ul li:nth-child(2) { width: 10%; }

.app ul li:nth-child(2) img { width: 30px; vertical-align: middle; }

.app ul li:nth-child(3) { width: 57%; }

.app ul li:nth-child(4) { width: 25%; background-color: #F63515; }

/ 搜索 /

.search-wrap { position: fixed; overflow: hidden; width: 100%; height: 44px; min-width: 320px; max-width: 640px; }

.search-btn { position: absolute; top: 0; left: 0; width: 40px; height: 44px; }

.search-btn::before { content: “”; display: block; width: 20px; height: 18px; background: url(../images/s-btn.png) no-repeat; background-size: 20px 18px; margin: 14px 0 0 15px; }

.search-login { position: absolute; right: 0; top: 0; width: 40px; height: 44px; color: #fff; line-height: 44px; }

.search { position: relative; height: 30px; background-color: #fff; margin: 0 50px; border-radius: 15px; margin-top: 7px; }

.jd-icon { width: 20px; height: 15px; position: absolute; top: 8px; left: 13px; background: url(../images/jd.png) no-repeat; background-size: 20px 15px; }

.jd-icon::after { content: “”; position: absolute; right: -8px; top: 0; display: block; width: 1px; height: 15px; background-color: #ccc; }

.sou { position: absolute; top: 8px; left: 50px; width: 18px; height: 15px; background: url(../images/jd-sprites.png) no-repeat -81px 0; background-size: 200px auto; }

.slider img { width: 100%; }

/ 品牌日 /

.brand { overflow: hidden; border-radius: 10px 10px 0 0; }

.brand div { float: left; width: 33.33%; }

.brand div img { width: 100%; }

/ nav /

nav { padding-top: 5px; }

nav a { float: left; width: 20%; text-align: center; }

nav a img { width: 40px; margin: 10px 0; }

nav a span { display: block; }

/ news /

.news { margin-top: 20px; }

.news img { width: 100%; }

.news a { float: left; box-sizing: border-box; }

.news a:nth-child(1) { width: 50%; }

/ .news a:nth-child(2), .news a:nth-child(3), { width: 25%; } /

/ n+2 就是从从2个往后面选 /

.news a:nth-child(n+2) { width: 25%; border-left: 1px solid #ccc; }

/ .news a:nth-child(3) { width: 25%; } /

  1. - 初始化样式文件normalize.css
  2. ```css
  3. /*! normalize.css v5.0.0 | MIT License | github.com/necolas/normalize.css */
  4. /**
  5. * 1. Change the default font family in all browsers (opinionated).
  6. * 2. Correct the line height in all browsers.
  7. * 3. Prevent adjustments of font size after orientation changes in
  8. * IE on Windows Phone and in iOS.
  9. */
  10. /* Document
  11. ========================================================================== */
  12. html {
  13. font-family: sans-serif; /* 1 */
  14. line-height: 1.15; /* 2 */
  15. -ms-text-size-adjust: 100%; /* 3 */
  16. -webkit-text-size-adjust: 100%; /* 3 */
  17. }
  18. /* Sections
  19. ========================================================================== */
  20. /**
  21. * Remove the margin in all browsers (opinionated).
  22. */
  23. body {
  24. margin: 0;
  25. }
  26. /**
  27. * Add the correct display in IE 9-.
  28. */
  29. article,
  30. aside,
  31. footer,
  32. header,
  33. nav,
  34. section {
  35. display: block;
  36. }
  37. /**
  38. * Correct the font size and margin on `h1` elements within `section` and
  39. * `article` contexts in Chrome, Firefox, and Safari.
  40. */
  41. h1 {
  42. font-size: 2em;
  43. margin: 0.67em 0;
  44. }
  45. /* Grouping content
  46. ========================================================================== */
  47. /**
  48. * Add the correct display in IE 9-.
  49. * 1. Add the correct display in IE.
  50. */
  51. figcaption,
  52. figure,
  53. main { /* 1 */
  54. display: block;
  55. }
  56. /**
  57. * Add the correct margin in IE 8.
  58. */
  59. figure {
  60. margin: 1em 40px;
  61. }
  62. /**
  63. * 1. Add the correct box sizing in Firefox.
  64. * 2. Show the overflow in Edge and IE.
  65. */
  66. hr {
  67. box-sizing: content-box; /* 1 */
  68. height: 0; /* 1 */
  69. overflow: visible; /* 2 */
  70. }
  71. /**
  72. * 1. Correct the inheritance and scaling of font size in all browsers.
  73. * 2. Correct the odd `em` font sizing in all browsers.
  74. */
  75. pre {
  76. font-family: monospace, monospace; /* 1 */
  77. font-size: 1em; /* 2 */
  78. }
  79. /* Text-level semantics
  80. ========================================================================== */
  81. /**
  82. * 1. Remove the gray background on active links in IE 10.
  83. * 2. Remove gaps in links underline in iOS 8+ and Safari 8+.
  84. */
  85. a {
  86. background-color: transparent; /* 1 */
  87. -webkit-text-decoration-skip: objects; /* 2 */
  88. }
  89. /**
  90. * Remove the outline on focused links when they are also active or hovered
  91. * in all browsers (opinionated).
  92. */
  93. a:active,
  94. a:hover {
  95. outline-width: 0;
  96. }
  97. /**
  98. * 1. Remove the bottom border in Firefox 39-.
  99. * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
  100. */
  101. abbr[title] {
  102. border-bottom: none; /* 1 */
  103. text-decoration: underline; /* 2 */
  104. text-decoration: underline dotted; /* 2 */
  105. }
  106. /**
  107. * Prevent the duplicate application of `bolder` by the next rule in Safari 6.
  108. */
  109. b,
  110. strong {
  111. font-weight: inherit;
  112. }
  113. /**
  114. * Add the correct font weight in Chrome, Edge, and Safari.
  115. */
  116. b,
  117. strong {
  118. font-weight: bolder;
  119. }
  120. /**
  121. * 1. Correct the inheritance and scaling of font size in all browsers.
  122. * 2. Correct the odd `em` font sizing in all browsers.
  123. */
  124. code,
  125. kbd,
  126. samp {
  127. font-family: monospace, monospace; /* 1 */
  128. font-size: 1em; /* 2 */
  129. }
  130. /**
  131. * Add the correct font style in Android 4.3-.
  132. */
  133. dfn {
  134. font-style: italic;
  135. }
  136. /**
  137. * Add the correct background and color in IE 9-.
  138. */
  139. mark {
  140. background-color: #ff0;
  141. color: #000;
  142. }
  143. /**
  144. * Add the correct font size in all browsers.
  145. */
  146. small {
  147. font-size: 80%;
  148. }
  149. /**
  150. * Prevent `sub` and `sup` elements from affecting the line height in
  151. * all browsers.
  152. */
  153. sub,
  154. sup {
  155. font-size: 75%;
  156. line-height: 0;
  157. position: relative;
  158. vertical-align: baseline;
  159. }
  160. sub {
  161. bottom: -0.25em;
  162. }
  163. sup {
  164. top: -0.5em;
  165. }
  166. /* Embedded content
  167. ========================================================================== */
  168. /**
  169. * Add the correct display in IE 9-.
  170. */
  171. audio,
  172. video {
  173. display: inline-block;
  174. }
  175. /**
  176. * Add the correct display in iOS 4-7.
  177. */
  178. audio:not([controls]) {
  179. display: none;
  180. height: 0;
  181. }
  182. /**
  183. * Remove the border on images inside links in IE 10-.
  184. */
  185. img {
  186. border-style: none;
  187. }
  188. /**
  189. * Hide the overflow in IE.
  190. */
  191. svg:not(:root) {
  192. overflow: hidden;
  193. }
  194. /* Forms
  195. ========================================================================== */
  196. /**
  197. * 1. Change the font styles in all browsers (opinionated).
  198. * 2. Remove the margin in Firefox and Safari.
  199. */
  200. button,
  201. input,
  202. optgroup,
  203. select,
  204. textarea {
  205. font-family: sans-serif; /* 1 */
  206. font-size: 100%; /* 1 */
  207. line-height: 1.15; /* 1 */
  208. margin: 0; /* 2 */
  209. }
  210. /**
  211. * Show the overflow in IE.
  212. * 1. Show the overflow in Edge.
  213. */
  214. button,
  215. input { /* 1 */
  216. overflow: visible;
  217. }
  218. /**
  219. * Remove the inheritance of text transform in Edge, Firefox, and IE.
  220. * 1. Remove the inheritance of text transform in Firefox.
  221. */
  222. button,
  223. select { /* 1 */
  224. text-transform: none;
  225. }
  226. /**
  227. * 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`
  228. * controls in Android 4.
  229. * 2. Correct the inability to style clickable types in iOS and Safari.
  230. */
  231. button,
  232. html [type="button"], /* 1 */
  233. [type="reset"],
  234. [type="submit"] {
  235. -webkit-appearance: button; /* 2 */
  236. }
  237. /**
  238. * Remove the inner border and padding in Firefox.
  239. */
  240. button::-moz-focus-inner,
  241. [type="button"]::-moz-focus-inner,
  242. [type="reset"]::-moz-focus-inner,
  243. [type="submit"]::-moz-focus-inner {
  244. border-style: none;
  245. padding: 0;
  246. }
  247. /**
  248. * Restore the focus styles unset by the previous rule.
  249. */
  250. button:-moz-focusring,
  251. [type="button"]:-moz-focusring,
  252. [type="reset"]:-moz-focusring,
  253. [type="submit"]:-moz-focusring {
  254. outline: 1px dotted ButtonText;
  255. }
  256. /**
  257. * Change the border, margin, and padding in all browsers (opinionated).
  258. */
  259. fieldset {
  260. border: 1px solid #c0c0c0;
  261. margin: 0 2px;
  262. padding: 0.35em 0.625em 0.75em;
  263. }
  264. /**
  265. * 1. Correct the text wrapping in Edge and IE.
  266. * 2. Correct the color inheritance from `fieldset` elements in IE.
  267. * 3. Remove the padding so developers are not caught out when they zero out
  268. * `fieldset` elements in all browsers.
  269. */
  270. legend {
  271. box-sizing: border-box; /* 1 */
  272. color: inherit; /* 2 */
  273. display: table; /* 1 */
  274. max-width: 100%; /* 1 */
  275. padding: 0; /* 3 */
  276. white-space: normal; /* 1 */
  277. }
  278. /**
  279. * 1. Add the correct display in IE 9-.
  280. * 2. Add the correct vertical alignment in Chrome, Firefox, and Opera.
  281. */
  282. progress {
  283. display: inline-block; /* 1 */
  284. vertical-align: baseline; /* 2 */
  285. }
  286. /**
  287. * Remove the default vertical scrollbar in IE.
  288. */
  289. textarea {
  290. overflow: auto;
  291. }
  292. /**
  293. * 1. Add the correct box sizing in IE 10-.
  294. * 2. Remove the padding in IE 10-.
  295. */
  296. [type="checkbox"],
  297. [type="radio"] {
  298. box-sizing: border-box; /* 1 */
  299. padding: 0; /* 2 */
  300. }
  301. /**
  302. * Correct the cursor style of increment and decrement buttons in Chrome.
  303. */
  304. [type="number"]::-webkit-inner-spin-button,
  305. [type="number"]::-webkit-outer-spin-button {
  306. height: auto;
  307. }
  308. /**
  309. * 1. Correct the odd appearance in Chrome and Safari.
  310. * 2. Correct the outline style in Safari.
  311. */
  312. [type="search"] {
  313. -webkit-appearance: textfield; /* 1 */
  314. outline-offset: -2px; /* 2 */
  315. }
  316. /**
  317. * Remove the inner padding and cancel buttons in Chrome and Safari on macOS.
  318. */
  319. [type="search"]::-webkit-search-cancel-button,
  320. [type="search"]::-webkit-search-decoration {
  321. -webkit-appearance: none;
  322. }
  323. /**
  324. * 1. Correct the inability to style clickable types in iOS and Safari.
  325. * 2. Change font properties to `inherit` in Safari.
  326. */
  327. ::-webkit-file-upload-button {
  328. -webkit-appearance: button; /* 1 */
  329. font: inherit; /* 2 */
  330. }
  331. /* Interactive
  332. ========================================================================== */
  333. /*
  334. * Add the correct display in IE 9-.
  335. * 1. Add the correct display in Edge, IE, and Firefox.
  336. */
  337. details, /* 1 */
  338. menu {
  339. display: block;
  340. }
  341. /*
  342. * Add the correct display in all browsers.
  343. */
  344. summary {
  345. display: list-item;
  346. }
  347. /* Scripting
  348. ========================================================================== */
  349. /**
  350. * Add the correct display in IE 9-.
  351. */
  352. canvas {
  353. display: inline-block;
  354. }
  355. /**
  356. * Add the correct display in IE.
  357. */
  358. template {
  359. display: none;
  360. }
  361. /* Hidden
  362. ========================================================================== */
  363. /**
  364. * Add the correct display in IE 10-.
  365. */
  366. [hidden] {
  367. display: none;
  368. }

flex弹性布局(强烈推荐):

  • 采用flex布局的元素,称之为flex容器,简称“容器”,它的所有的子元素自动成为容器的一员,称为flex项目,简称“项目”
  • 子元素就可以纵向、横向排列了
  • 当我们为父元素添加display=flex之后,子元素的float、clear、vertical-align将失效
  • 常见的父项元素属性(设置在父元素中的属性)
    • flex-direction:设置主轴方向(设置子元素按行排列还是列排列),取值为:row(默认从左到右排列);row-reverse(从右到左);column(从上到下);column-reverse(从下到上)
    • justify-content:属性定义了项目在主轴上的对齐方式;使用该属性的前提是确定好主轴排列的方式;取值为:flex-start(默认从头开始排列,如果是主轴x轴则是从左到右);flex-end(从尾部开始排列);center(居中排列);space-around(平分剩余空间);space-between(先两边贴边,再;平分剩余空间)
    • flex-wrap:决定子元素是否换行,取值为nowrap(默认值不换行);wrap(换行);当装不下子元素,则将子元素收缩
    • align-items:设置侧轴上的元素排列方式(单行),取值为:flex-start(默认从头开始排列,如果是主轴x轴则是从左到右);flex-end(从尾部开始排列);center(挤在一起居中(垂直居中));stretch(拉伸默认值,前提是不设置盒子高度)
    • flex-flow属性是flex-direction和flex-wrap属性的属性复合:flex-flow:row wrap
  • 常见子项元素属性:
    • flex属性:定义子项元素分配父元素剩余空间:.item{ flex: num(数字) }
    • align-self属性:控制子项元素自己在侧轴上的排列方式,允许单个项目有与其他项目不一样的对齐方式,可以覆盖align-items属性,默认值是auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch。取值跟align-items属性一样;
    • order属性:定义子项目的排列顺序;数值越小排列越靠前,默认是零;
      • flex弹性布局案例
  • index.html ```html <!DOCTYPE html>
我 的
css高级(二——移动端布局) - 图2

  1. - index.css
  2. ```css
  3. body {
  4. max-width: 540px;
  5. min-width: 320px;
  6. margin: 0 auto;
  7. font: normal 14px/1.5 Tahoma, "Lucida Grande", Verdana, "Microsoft Yahei", STXihei, hei;
  8. color: #000;
  9. background: #f2f2f2;
  10. overflow-x: hidden;
  11. -webkit-tap-highlight-color: transparent;
  12. }
  13. ul {
  14. list-style: none;
  15. margin: 0;
  16. padding: 0;
  17. }
  18. a {
  19. text-decoration: none;
  20. color: #222;
  21. }
  22. div {
  23. box-sizing: border-box;
  24. }
  25. /* 搜索模块 */
  26. .search-index {
  27. display: flex;
  28. /* 固定定位跟父级没有关系 它以屏幕为准 */
  29. position: fixed;
  30. top: 0;
  31. left: 50%;
  32. /* 固定的盒子应该有宽度 */
  33. -webkit-transform: translateX(-50%);
  34. transform: translateX(-50%);
  35. width: 100%;
  36. min-width: 320px;
  37. max-width: 540px;
  38. height: 44px;
  39. /* background-color: pink; */
  40. background-color: #F6F6F6;
  41. border-top: 1px solid #ccc;
  42. border-bottom: 1px solid #ccc;
  43. }
  44. .search {
  45. position: relative;
  46. height: 26px;
  47. line-height: 24px;
  48. border: 1px solid #ccc;
  49. flex: 1;
  50. font-size: 12px;
  51. color: #666;
  52. margin: 7px 10px;
  53. padding-left: 25px;
  54. border-radius: 5px;
  55. box-shadow: 0 2px 4px rgba(0, 0, 0, .2);
  56. }
  57. .search::before {
  58. content: "";
  59. position: absolute;
  60. top: 5px;
  61. left: 5px;
  62. width: 15px;
  63. height: 15px;
  64. background: url(../images/sprite.png) no-repeat -59px -279px;
  65. background-size: 104px auto;
  66. }
  67. .user {
  68. width: 44px;
  69. height: 44px;
  70. /* background-color: purple; */
  71. font-size: 12px;
  72. text-align: center;
  73. color: #2eaae0;
  74. }
  75. .user::before {
  76. content: "";
  77. display: block;
  78. width: 23px;
  79. height: 23px;
  80. background: url(../images/sprite.png) no-repeat -59px -194px;
  81. background-size: 104px auto;
  82. margin: 4px auto -2px;
  83. }
  84. /* focus */
  85. .focus {
  86. padding-top: 44px;
  87. }
  88. .focus img {
  89. width: 100%;
  90. }
  91. /* local-nav */
  92. .local-nav {
  93. display: flex;
  94. height: 64px;
  95. margin: 3px 4px;
  96. background-color: #fff;
  97. border-radius: 8px;
  98. }
  99. .local-nav li {
  100. flex: 1;
  101. }
  102. .local-nav a {
  103. display: flex;
  104. flex-direction: column;
  105. /* 侧轴居中对齐 因为是单行 */
  106. align-items: center;
  107. font-size: 12px;
  108. }
  109. .local-nav li [class^="local-nav-icon"] {
  110. width: 32px;
  111. height: 32px;
  112. background-color: pink;
  113. margin-top: 8px;
  114. background: url(../images/localnav_bg.png) no-repeat 0 0;
  115. background-size: 32px auto;
  116. }
  117. .local-nav li .local-nav-icon-icon2 {
  118. background-position: 0 -32px;
  119. }
  120. .local-nav li .local-nav-icon-icon3 {
  121. background-position: 0 -64px;
  122. }
  123. .local-nav li .local-nav-icon-icon4 {
  124. background-position: 0 -96px;
  125. }
  126. .local-nav li .local-nav-icon-icon5 {
  127. background-position: 0 -128px;
  128. }
  129. /* nav */
  130. nav {
  131. overflow: hidden;
  132. border-radius: 8px;
  133. margin: 0 4px 3px;
  134. }
  135. .nav-common {
  136. display: flex;
  137. height: 88px;
  138. background-color: pink;
  139. }
  140. .nav-common:nth-child(2) {
  141. margin: 3px 0;
  142. }
  143. .nav-items {
  144. /* 不冲突的 */
  145. flex: 1;
  146. display: flex;
  147. flex-direction: column;
  148. }
  149. .nav-items a {
  150. flex: 1;
  151. text-align: center;
  152. line-height: 44px;
  153. color: #fff;
  154. font-size: 14px;
  155. /* 文字阴影 */
  156. text-shadow: 1px 1px rgba(0, 0, 0, .2);
  157. }
  158. .nav-items a:nth-child(1) {
  159. border-bottom: 1px solid #fff;
  160. }
  161. .nav-items:nth-child(1) a {
  162. border: 0;
  163. background: url(../images/hotel.png) no-repeat bottom center;
  164. background-size: 121px auto;
  165. }
  166. /* -n+2就是选择前面两个元素 */
  167. .nav-items:nth-child(-n+2) {
  168. border-right: 1px solid #fff;
  169. }
  170. .nav-common:nth-child(1) {
  171. background: -webkit-linear-gradient(left, #FA5A55, #FA994D);
  172. }
  173. .nav-common:nth-child(2) {
  174. background: -webkit-linear-gradient(left, #4B90ED, #53BCED);
  175. }
  176. .nav-common:nth-child(3) {
  177. background: -webkit-linear-gradient(left, #34C2A9, #6CD559);
  178. }
  179. /* subnav-entry */
  180. .subnav-entry {
  181. display: flex;
  182. border-radius: 8px;
  183. background-color: #fff;
  184. margin: 0 4px;
  185. flex-wrap: wrap;
  186. padding: 5px 0;
  187. }
  188. .subnav-entry li {
  189. /* 里面的子盒子可以写 % 相对于父级来说的 */
  190. flex: 20%;
  191. }
  192. .subnav-entry a {
  193. display: flex;
  194. flex-direction: column;
  195. align-items: center;
  196. }
  197. .subnav-entry-icon {
  198. width: 28px;
  199. height: 28px;
  200. background-color: pink;
  201. margin-top: 4px;
  202. background: url(../images/subnav-bg.png) no-repeat;
  203. background-size: 28px auto;
  204. }
  205. /* sales-box */
  206. .sales-box {
  207. border-top: 1px solid #bbb;
  208. background-color: #fff;
  209. margin: 4px;
  210. }
  211. .sales-hd {
  212. position: relative;
  213. height: 44px;
  214. border-bottom: 1px solid #ccc;
  215. }
  216. .sales-hd h2 {
  217. position: relative;
  218. text-indent: -999px;
  219. overflow: hidden;
  220. }
  221. .sales-hd h2::after {
  222. position: absolute;
  223. top: 5px;
  224. left: 8px;
  225. content: "";
  226. width: 79px;
  227. height: 15px;
  228. background: url(../images/hot.png) no-repeat 0 -20px;
  229. background-size: 79px auto;
  230. }
  231. .more {
  232. position: absolute;
  233. right: 5px;
  234. top: 0px;
  235. background: -webkit-linear-gradient(left, #FF506C, #FF6BC6);
  236. border-radius: 15px;
  237. padding: 3px 20px 3px 10px;
  238. color: #fff;
  239. }
  240. .more::after {
  241. content: "";
  242. position: absolute;
  243. top: 9px;
  244. right: 9px;
  245. width: 7px;
  246. height: 7px;
  247. border-top: 2px solid #fff;
  248. border-right: 2px solid #fff;
  249. transform: rotate(45deg);
  250. }
  251. .row {
  252. display: flex;
  253. }
  254. .row a {
  255. flex: 1;
  256. border-bottom: 1px solid #eee;
  257. }
  258. .row a:nth-child(1) {
  259. border-right: 1px solid #eee;
  260. }
  261. .row a img {
  262. width: 100%;
  263. }

less+rem+媒体查询布局:

  • 什么是rem?rem跟px一样是个单位,相对于html元素字体大小来说的,1rem=html中的字体像素大小,之前学过的em则是相对于父元素的字体大小来说的
  • 优点:可以通过修改html元素文字大小来改变页面中的元素大小,可以整体控制;
  • 什么是媒体查询?媒体查询(media query)是css3的语法
  • 特点:使用@media查询,可以针对不同的媒体类型定义不同的样式;@media可以针对不同屏幕尺寸设置不同的样式;当你重置浏览器大小的过程中,页面也会根据浏览器的宽度和高度重新渲染页面;目前针对很多苹果手机、adroit手机,平板等设备都用到多媒体查询;
  • 语法:@media mediatype and|not|only (media feature){ css code; } 其中mediatype有all(所有设备)、print(打印机和打印预览)、scree(电脑屏幕、平板电脑、智能手机等等);关键字and(且)、not(非)、only(仅仅只);media feature(媒体特性width输出设备中页面可见区域的宽度)、min-width(输出设备中页面最小可见区域宽度)、max-width(输出设备中页面最大可见区域宽度)

    1. @media mediatype and|not|only (media feature1) and|not|only(media feature2){
    2. css code;
    3. }
  • 理解:个人感觉有点像if判断,满足该条件就进入执行里面的样式代码,小于最大可见宽度则满足,大于最小可见宽度则满足

  • 引入页源:

    • 当样式比较频繁时,可以针对不同媒体使用不同stylesheets(样式表)
    • 原理:就是直接在link标签中判断设备的尺寸,然后引入不同的css样式文件
    • 语法:
      1. <link rel="stylesheet" media="mediatype and|not|only(media feature)" href="引入的样式文件路径">
  • less的认识

    • 它是一门css扩展语言,也成为css预处理器,加入了程序式语言的特性,引入了变量、Mixin(混入)、运算及函数等功能,大大简化了css的编写,并且降低了css的维护成本;
    • 官网:http://lesscss.cn/
    • 常见的css预处理器:sass、less、stylus
    • less是一门css预处理器语言,它扩展了css的动态特性;
  • less的使用:

    • 把它编写在后缀名为less的文件中;
    • less变量:@变量名:值; 变量命名规范,不能包含特殊字符,不能以数字开头大小写敏感

      1. //变量书写格式
      2. @变量名:值;
      3. @color:pink;
      4. //变量引用
      5. body{
      6. background-color:@color;
      7. }
    • less编译:将less语句编译成css代码,通过vscode插件——easy less实现;安装好该插件之后,重启vscode即可,之后只要将.less文件保存即可自动编译生成.css文件;


    • less嵌套:后代选择器直接在嵌套写即可;伪类选择器在前面加个“&”即可
    • less运算:直接在less文件中做加减乘除运算即可,两个数有单位且不同则以第一个为准,只有一个数有单位则以有单位的为准,注意,除法运算需要加括号,相关运算函数
      • escape(@string); // 通过 URL-encoding 编码字符串

e(@string); // 对字符串转义
%(@string, values…); // 格式化字符串
unit(@dimension, [@unit: “”]); // 移除或替换属性值的单位
color(@string); // 将字符串解析为颜色值
data-uri([mimetype,] url); // 将资源内嵌到css中,可能回退到url()
ceil(@number); // 向上取整
floor(@number); // 向下取整
percentage(@number); // 将数字转换为百分比,例如 0.5 -> 50%
round(number, [places: 0]); // 四舍五入取整
sqrt(number); //
计算数字的平方根
abs(number); // 数字的绝对值
sin(number); //
sin函数
asin(number); // arcsin函数
cos(number); //
cos函数
acos(number); // arccos函数
tan(number); //
tan函数
atan(number); // arctan函数
pi(); //
返回PI
pow(@base, @exponent); // 返回@base的@exponent次方
mod(number, number); //
第一个参数对第二个参数取余
convert(number, units); // 在数字之间转换
unit(number, units); //
不转换的情况下替换数字的单位
color(string); // 将字符串或者转义后的值转换成颜色
rgb(@r, @g, @b); // 转换为颜色值
rgba(@r, @g, @b, @a); // 转换为颜色值
argb(@color); // 创建 #AARRGGBB 格式的颜色值
hsl(@hue, @saturation, @lightness); // 创建颜色值
hsla(@hue, @saturation, @lightness, @alpha); // 创建颜色值
hsv(@hue, @saturation, @value); // 创建颜色值
hsva(@hue, @saturation, @value, @alpha); // 创建颜色值
hue(@color); // 从颜色值中提取 hue 值(色相)
saturation(@color); // 从颜色值中提取 saturation 值(饱和度)
lightness(@color); // 从颜色值中提取 ‘lightness’ 值(亮度)
hsvhue(@color); // 从颜色中提取 hue 值,以HSV色彩空间表示(色相)
hsvsaturation(@color); //
从颜色中提取 saturation 值,以HSV色彩空间表示(饱和度)
hsvvalue(@color); // 从颜色中提取 value 值,以HSV色彩空间表示(色调)
red(@color); // 从颜色值中提取 ‘red’ 值(红色)
green(@color); // 从颜色值中提取 ‘green’ 值(绿色)
blue(@color); // 从颜色值中提取 ‘blue’ 值(蓝色)
alpha(@color); // 从颜色值中提取 ‘alpha’ 值(透明度)
luma(@color); // 从颜色值中提取 ‘luma’ 值(亮度的百分比表示法)
saturate(@color, 10%); // 饱和度增加 10%
desaturate(@color, 10%); // 饱和度降低 10%
lighten(@color, 10%); // 亮度增加 10%
darken(@color, 10%); // 亮度降低 10%
fadein(@color, 10%); // 透明度增加 10%
fadeout(@color, 10%); // 透明度降低 10%
fade(@color, 50%); // 设定透明度为 50%
spin(@color, 10); // 色相值增加 10
mix(@color1, @color2, [@weight: 50%]); // 混合两种颜色
greyscale(@color); // 完全移除饱和度,输出灰色
contrast(@color1, [@darkcolor: black], [@lightcolor: white], [@threshold: 43%]); // 如果 @color1 的 luma 值 > 43% 输出 @darkcolor,否则输出 @lightcolor
multiply(@color1, @color2);
screen(@color1, @color2);
overlay(@color1, @color2);
softlight(@color1, @color2);
hardlight(@color1, @color2);
difference(@color1, @color2);
exclusion(@color1, @color2);
average(@color1, @color2);
negation(@color1, @color2);
iscolor(@colorOrAnything); // 判断一个值是否是颜色
isnumber(@numberOrAnything); // 判断一个值是否是数字(可含单位)
isstring(@stringOrAnything); // 判断一个值是否是字符串
iskeyword(@keywordOrAnything); // 判断一个值是否是关键字
isurl(@urlOrAnything); // 判断一个值是否是url
ispixel(@pixelOrAnything); // 判断一个值是否是以px为单位的数值
ispercentage(@percentageOrAnything); // 判断一个值是否是百分数
isem(@emOrAnything); // 判断一个值是否是以em为单位的数值
isunit(@numberOrAnything, “rem”); //
判断一个值是否是指定单位的数值
含*号的函数只在1.4.0 beta以上版本中可用

  • rem适配方案:
    • 原理:
      • 让一些不能等比自适应的元素,达到当设备尺寸发生改变时,等比适配当前设备;
      • 使用媒体查询根据不同的设备按比例设置html的字体大小,然后页面元素使用rem单位做尺寸;当html字体大小变化时元素尺寸也发生变化,从而达到等比缩放的适配效果
    • 总结:按照设计稿与设备宽度的比例,动态计算并设置html根标签的font-size大小;(媒体查询);css中,设计稿元素的宽、高、相对位置等取值按照同比例换算为rem为单位的值;
    • 方案一:
      • less
      • 媒体查询
      • rem
      • 实现:①假设设计稿是750px;假设我们把整个屏幕分为15等分(划分标准不一定可以是20份也可以是10等分);②每一份作为html字体大小,这里就是50px;③那么在320ppx的设备时,字体带线啊哦为320/15就是21.33px;④用我们页面元素的大小除以不同的html字体大小会发现他们是等比例缩放的;
      • 最终公式:页面元素的rem值 = 页面元素值(px) / (屏幕宽度 / 划分的份数); 其中:屏幕宽度 / 划分的份数 = html的font-size
      • 苏宁首页案例:
      • common.less文件 ```less // 设置常见的屏幕尺寸 修改里面的html文字大小 a { text-decoration: none; } // 一定要写到最上面 html { font-size: 50px; } // 我们此次定义的划分的份数 为 15 @no: 15; // 320 @media screen and (min-width: 320px) { html { font-size: 320px / @no; } } // 360 @media screen and (min-width: 360px) { html { font-size: 360px / @no; } } // 375 iphone 678 @media screen and (min-width: 375px) { html { font-size: 375px / @no; } }

// 384 @media screen and (min-width: 384px) { html { font-size: 384px / @no; } }

// 400 @media screen and (min-width: 400px) { html { font-size: 400px / @no; } } // 414 @media screen and (min-width: 414px) { html { font-size: 414px / @no; } } // 424 @media screen and (min-width: 424px) { html { font-size: 424px / @no; } }

// 480 @media screen and (min-width: 480px) { html { font-size: 480px / @no; } }

// 540 @media screen and (min-width: 540px) { html { font-size: 540px / @no; } } // 720 @media screen and (min-width: 720px) { html { font-size: 720px / @no; } }

// 750 @media screen and (min-width: 750px) { html { font-size: 750px / @no; } }

  1. - index.css
  2. ```css
  3. // 首页的样式less文件
  4. @import "common";
  5. // @import 导入的意思 可以把一个样式文件导入到另外一个样式文件里面
  6. // link 是把一个 样式文件引入到 html页面里面
  7. body {
  8. min-width: 320px;
  9. width: 15rem;
  10. margin: 0 auto;
  11. line-height: 1.5;
  12. font-family: Arial,Helvetica;
  13. background: #F2F2F2;
  14. }
  15. // 页面元素rem计算公式: 页面元素的px / html 字体大小 50
  16. // search-content
  17. @baseFont: 50;
  18. .search-content {
  19. display: flex;
  20. position: fixed;
  21. top: 0;
  22. left: 50%;
  23. transform: translateX(-50%);
  24. width: 15rem;
  25. height: 88rem / @baseFont;
  26. background-color:#FFC001;
  27. .classify {
  28. width: 44rem / @baseFont;
  29. height: 70rem / @baseFont;
  30. margin: 11rem / @baseFont 25rem / @baseFont 7rem / @baseFont 24rem / @baseFont;
  31. background: url(../images/classify.png) no-repeat;
  32. // 背景缩放
  33. background-size: 44rem / @baseFont 70rem / @baseFont;
  34. }
  35. .search {
  36. flex: 1;
  37. input {
  38. outline: none;
  39. width: 100%;
  40. border: 0;
  41. height: 66rem / @baseFont;
  42. border-radius: 33rem / @baseFont;
  43. background-color:#FFF2CC;
  44. margin-top: 12rem / @baseFont;
  45. font-size: 25rem / @baseFont;
  46. padding-left: 55rem / @baseFont;
  47. color: #757575;
  48. }
  49. }
  50. .login {
  51. width: 75rem / @baseFont;
  52. height: 70rem / @baseFont;
  53. line-height: 70rem / @baseFont;
  54. margin: 10rem / @baseFont;
  55. font-size: 25rem / @baseFont;
  56. text-align: center;
  57. color: #fff;
  58. }
  59. }
  60. // banner
  61. .banner {
  62. width: 750rem / @baseFont;
  63. height: 368rem / @baseFont;
  64. img {
  65. width: 100%;
  66. height: 100%;
  67. }
  68. }
  69. // ad
  70. .ad {
  71. display: flex;
  72. a {
  73. flex: 1;
  74. img {
  75. width: 100%;
  76. }
  77. }
  78. }
  79. // nav
  80. nav {
  81. width: 750rem / @baseFont;
  82. a {
  83. float: left;
  84. width: 150rem / @baseFont;
  85. height: 140rem / @baseFont;
  86. text-align: center;
  87. img {
  88. display: block;
  89. width: 82rem / @baseFont;
  90. height: 82rem / @baseFont;
  91. margin: 10rem / @baseFont auto 0;
  92. }
  93. span {
  94. font-size: 25rem / @baseFont;
  95. color: #333;
  96. }
  97. }
  98. }
  1. - index.html
  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, maximum-scale=1.0, user-scalable=0" />
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <link rel="stylesheet" href="css/normalize.css">
  8. <link rel="stylesheet" href="css/index.css">
  9. <title>Document</title>
  10. </head>
  11. <body>
  12. <!-- 顶部搜索框 -->
  13. <div class="search-content">
  14. <a href="#" class="classify"></a>
  15. <div class="search">
  16. <form action="">
  17. <input type="search" value="厨卫保暖季 哒哒哒">
  18. </form>
  19. </div>
  20. <a href="#" class="login">登录</a>
  21. </div>
  22. <!-- banner部分 -->
  23. <div class="banner">
  24. <img src="upload/banner.gif" alt="">
  25. </div>
  26. <!-- 广告部分 -->
  27. <div class="ad">
  28. <a href="#"><img src="upload/ad1.gif" alt=""></a>
  29. <a href="#"><img src="upload/ad2.gif" alt=""></a>
  30. <a href="#"><img src="upload/ad3.gif" alt=""></a>
  31. </div>
  32. <!-- nav模块 -->
  33. <nav>
  34. <a href="#">
  35. <img src="upload/nav1.png" alt="">
  36. <span>爆款手机</span>
  37. </a>
  38. <a href="#">
  39. <img src="upload/nav1.png" alt="">
  40. <span>爆款手机</span>
  41. </a>
  42. <a href="#">
  43. <img src="upload/nav1.png" alt="">
  44. <span>爆款手机</span>
  45. </a>
  46. <a href="#">
  47. <img src="upload/nav1.png" alt="">
  48. <span>爆款手机</span>
  49. </a>
  50. <a href="#">
  51. <img src="upload/nav1.png" alt="">
  52. <span>爆款手机</span>
  53. </a>
  54. <a href="#">
  55. <img src="upload/nav1.png" alt="">
  56. <span>爆款手机</span>
  57. </a>
  58. <a href="#">
  59. <img src="upload/nav1.png" alt="">
  60. <span>爆款手机</span>
  61. </a>
  62. <a href="#">
  63. <img src="upload/nav1.png" alt="">
  64. <span>爆款手机</span>
  65. </a>
  66. <a href="#">
  67. <img src="upload/nav1.png" alt="">
  68. <span>爆款手机</span>
  69. </a>
  70. <a href="#">
  71. <img src="upload/nav1.png" alt="">
  72. <span>爆款手机</span>
  73. </a>
  74. </nav>
  75. </body>
  76. </html>
  1. - 方案二(推荐):
  2. - flexble.js
  3. - rem
  4. - 网址:https://github.com/amfe/lib-flexible

(2)技术选型——响应式页面兼容移动端(其次)

  • 响应式页面是根据浏览器的宽度进行实时样式改变,这种方式要花费大量精力编写浏览器兼容的样式代码
  • 原理:使用媒体查询针对不同的宽度的设备进行布局和样式的设置,从而适配不同的设备; | 设备划分 | 尺寸区间 | | —- | —- | | 超小屏幕(手机) | width<768px | | 小屏设备(平板) | 768px<=width<992px | | 中等屏幕(桌面显示器) | 992px<=width<1200px | | 宽屏设备(大桌名设备显示器) | width>=1200px |

  • 媒体查询布局:

    • 准备一个父级作为布局容器,来配合自己元素实现变化效果。原理就是在不同的屏幕下,通过媒体查询的方式来改变这个布局容器的大小,再改变子元素的排列方式和大小,从而实现不同屏幕下,看到不同的页面布局和样式变化;
    • 超小屏幕:设置布局容器宽度为100%;
    • 小屏幕:设置布局容器宽度为750px;
    • 中等屏幕:设置布局容器宽度为970px;
    • 大屏幕:设置布局容器宽度为1170px;
  • bootstarp:来自于推特;是目前最受欢迎的前端框架,它基于html、css和javascript的,简介灵活的特性使得web开发更加快捷
  • 中文官网:http://www.bootcss.com
  • 官网:http://getbootstrap.com
  • 推荐网址:http://bootstrap.css88.com
  • 栅格系统:

    • 其用于通过一系列的行(row)和列(column)的组合来创建页面布局 | | 超小屏幕 | 小屏幕 | 中等屏幕 | 大屏幕 | | —- | —- | —- | —- | —- | | .container的最大宽度 | 设置布局容器宽度为100% | 设置布局容器宽度为750px | 设置布局容器宽度为970px | 设置布局容器宽度为1170px | | 类前缀 | .col-xs- | .col-sm- | .col-md- | .col-lg | | 列数(column) | 12列 | | | |