1. 京东图片列表

05.实战练习 - 图1

开发准备

  1. //img14.360buyimg.com/babel/s380x300_jfs/t1/168591/2/9328/64891/603ddb1aE93567699/3e4e717eeac051b2.jpg.webp
  2. //img12.360buyimg.com/babel/s380x300_jfs/t1/152314/13/19839/57522/603e118dE941f0ce9/fdff58457adbef3e.jpg.webp
  3. //img10.360buyimg.com/babel/s380x300_jfs/t1/154848/7/7426/82296/5fc072eeE20809200/34dca267e049d035.jpg.webp
  4. /*这里就可以进行图片另存为了,当然你也可以直接在src上填写这些地址*/
  5. /*其中 图片后缀名为jpg.webp 这是京东为了支持不同的浏览器进行的自动配置*/
  6. <!-- IE中的src地址 -->
  7. //img14.360buyimg.com/babel/s380x300_jfs/t1/168591/2/9328/64891/603ddb1aE93567699/3e4e717eeac051b2.jpg
  8. <!-- Chrome中的src地址 -->
  9. //img14.360buyimg.com/babel/s380x300_jfs/t1/168591/2/9328/64891/603ddb1aE93567699/3e4e717eeac051b2.jpg.webp
  10. /*知道这个原理,我们除了可以直接在图片另存为保存为jpg格式,其实还可以直接修改url地址*/

最后,我们将下载的图片放入assets(自定义目录)工程目录下即可

布局剖析

我们使用F12进行调试,可以看到京东图片列表的具体元素及属性
05.实战练习 - 图2

05.实战练习 - 图3

  • 整体使用一个li元素包裹,里面又套了一层div`元素,宽高比:190:470
  • 每张图片使用一个img元素,同时分别用a元素包裹,宽高比:190:150
  • 三张图片高度和为1503=450 < 470,注意到图片之间存在210px的外边距

这样,整个京东的图片列表的整体布局就非常清晰了
但是,我们不会那么去实现代码。因为li元素应该包裹在ul元素或者ol元素中,而这里并没有遵循css中的语义标签使用规范, 我们先看一下这么写会有什么问题

  1. <link rel="stylesheet" href="assets/reset.css">
  2. <!-- ul包裹li -->
  3. <ul>
  4. <li>ul li</li>
  5. <li>ul li</li>
  6. <li>ul li</li>
  7. </ul>
  8. <!-- div包裹li -->
  9. <div>
  10. <li>div li</li>
  11. <li>div li</li>
  12. <li>div li</li>
  13. </div>

05.实战练习 - 图4
由于使用了reset样式,浏览器的默认样式被我们去除了。但是使用ul包裹的li元素和使用div包裹的li元素存在明显的区别:

  • 使用ul包裹的li元素是没有默认样式的
  • 使用div包裹的li元素前仍然存在黑点

我想是因为京东在这里实现了自己的样式替换,所以为了避免重复reset默认样式,我们采用正常的列表标签

结构搭建

  1. <ul>
  2. <li><a href="javascript:;"><img src="assets/1.jpg"></a></li>
  3. <li><a href="javascript:;"><img src="assets/2.jpg"></a></li>
  4. <li><a href="javascript:;"><img src="assets/3.jpg"></a></li>
  5. </ul>

到这里我们基本骨架已经有了,不过因为没有写css样式,图片几乎占据了整个浏览器页面

样式添加

方式1

  1. ul {
  2. width: 190px;
  3. height: 470px;
  4. }
  5. ul>li img{
  6. /*
  7. 这里任意只调整高度或宽度,图片可以保持原比例大小
  8. */
  9. /* width: 190px; */
  10. height: 150px;
  11. }

方式2

  1. ul {
  2. width: 190px;
  3. height: 470px;
  4. overflow: hidden;
  5. }

05.实战练习 - 图5
但是因为图片本身的大小还没有做限制,所以图片保持了原来的图片比例和大小
那我们再对图片添加固定的宽或高不就行了?
不!我们直接指定宽或高的话,overflow属性不就显得多此一举嘛
我们给img元素设定一个100%width属性

  1. ul>li img {
  2. /* height: 150px; */
  3. width: 100%;
  4. }

Q:为什么子元素不能用**auto**呢?
A:我们前一节-盒模型中讲过,水平布局必须要满足一个等式,不满足即存在过渡约束,会做自动调整
ul元素是块元素,块元素什么特点?独占一行啊!
图片宽度为380px,浏览器宽度为1920px(我本机中最大化浏览器的宽度)
现在的等式为0 + 0 + 0 + 380px + 0 + 0 + 0 = 1920px
这七个值中没有auto的情况,所以浏览器会自动调整margin-right值以使等式满足
0 + 0 + 0 + 380px + 0 + 0 + (1920-380)px = 1920px
05.实战练习 - 图6
所以如果使用auto属性值,整个过程中图片的width不会发生变化,展现出来的效果就依然是裁剪的样式
Q:为什么**100%**可以呢?
A:我们知道100%是会按照父元素计算的,img的父元素是a,a父元素是lili的父元素是ul
也就是说,由于我们没有给ali单独设置样式,因此img最终会根据ul的宽度计算
而如果只调整图片的宽或高,图片是会保持原比例进行缩放的
所以这个时候就相当于给img设置了一个width=190px的属性值

细节完善

背景色

通过颜色拾取器,识别背景色(我这里使用的是FastStone Capture中自带的Screen Color Picker

  1. ul{
  2. ...
  3. /* 添加背景色 */
  4. background-color: #F4F4F4;
  5. }

外边距

  1. ul>li:not(:last-child){
  2. margin-bottom: 10px;
  3. }

Q:为什么是给**li**元素添加呢?
A:我们在调整布局结构的时候,特别是设置外边距,一般是设置块元素的,而不建议去调整行内元素或行内块元素

最终效果

05.实战练习 - 图7

核心代码

  1. <link rel="stylesheet" href="css/reset.css">
  2. <style>
  3. ul {
  4. /* 宽高 */
  5. width: 190px;
  6. height: 470px;
  7. /* 处理溢出部分,这块不写效果也是一样的 */
  8. overflow: hidden;
  9. /* 设置背景色 */
  10. background-color: #F4F4F4;
  11. }
  12. ul>li:not(:last-child) {
  13. /* 设置下外边距 */
  14. margin-bottom: 10px;
  15. }
  16. ul>li img {
  17. /* 设定图片宽度 */
  18. width: 100%;
  19. }
  20. </style>
  21. <ul>
  22. <li><a href="javascript:;"><img src="assets/1.jpg"></a></li>
  23. <li><a href="javascript:;"><img src="assets/2.jpg"></a></li>
  24. <li><a href="javascript:;"><img src="assets/3.jpg"></a></li>
  25. </ul>

2. 京东左侧导航条

开发准备

  1. 家用电器
  2. 手机 / 运营商 / 数码
  3. 电脑 / 办公
  4. 家居 / 家具 / 家装 / 厨具
  5. 男装 / 女装 / 童装 / 内衣
  6. 美妆 / 个护清洁 / 宠物
  7. 女鞋 / 箱包 / 钟表 / 珠宝
  8. 男鞋 / 运动 / 户外
  9. 房产 / 汽车 / 汽车用品
  10. 母婴 / 玩具乐器
  11. 食品 / 食品 / 生鲜 / 特产
  12. 艺术 / 礼品鲜花 / 农资绿植
  13. 医药保健 / 计生情趣
  14. 图书 / 文娱 / 教育 / 电子书
  15. 机票 / 酒店 / 旅游 / 生活
  16. 理财 / 众筹 / 白条 / 保险
  17. 安装 / 维修 / 清洗 / 二手
  18. 工业品

布局剖析

05.实战练习 - 图8

  • 整体使用ulli元素,宽高比=190px:470px,其中上下存在10px的内边距(影响盒子大小)和10px的外边距(影响盒子布局)

05.实战练习 - 图9

  • li中每个元素也比较简单,用a包裹文字,用span包裹斜杠
  • 每个li元素的宽高比=190px:25px,其中左边存在18px的内边距(注意右边是不存在的)

05.实战练习 - 图10

  • a元素没有什么大的布局,span元素左右存在2px的内边距

结构搭建

  1. <link rel="stylesheet" href="css/reset.css">
  2. <!--可以使用nav(div) div(div) ul(li)-->
  3. <ul>
  4. <li>
  5. <a href="javascript:;">家用电器</a>
  6. </li>
  7. <li>
  8. <a href="javascript:;">手机</a>
  9. <span>/</span>
  10. <a href="javascript:;">运营商</a>
  11. <span>/</span>
  12. <a href="javascript:;">数码</a>
  13. </li>
  14. <li>
  15. <a href="javascript:;">电脑</a>
  16. <span>/</span>
  17. <a href="javascript:;">办公</a>
  18. </li>
  19. <li>
  20. <a href="javascript:;">家居</a>
  21. <span>/</span>
  22. <a href="javascript:;">家具</a>
  23. <span>/</span>
  24. <a href="javascript:;">家装</a>
  25. <span>/</span>
  26. <a href="javascript:;">厨具</a>
  27. </li>
  28. <li>
  29. <a href="javascript:;">男装</a>
  30. <span>/</span>
  31. <a href="javascript:;">女装</a>
  32. <span>/</span>
  33. <a href="javascript:;">童装</a>
  34. <span>/</span>
  35. <a href="javascript:;">内衣</a>
  36. </li>
  37. <li>
  38. <a href="javascript:;">美妆</a>
  39. <span>/</span>
  40. <a href="javascript:;">个护清洁</a>
  41. <span>/</span>
  42. <a href="javascript:;">宠物</a>
  43. </li>
  44. <li>
  45. <a href="javascript:;">女鞋</a>
  46. <span>/</span>
  47. <a href="javascript:;">箱包</a>
  48. <span>/</span>
  49. <a href="javascript:;">钟表</a>
  50. <span>/</span>
  51. <a href="javascript:;">珠宝</a>
  52. </li>
  53. <li>
  54. <a href="javascript:;">男鞋</a>
  55. <span>/</span>
  56. <a href="javascript:;">运动</a>
  57. <span>/</span>
  58. <a href="javascript:;">户外</a>
  59. </li>
  60. <li>
  61. <a href="javascript:;">房产</a>
  62. <span>/</span>
  63. <a href="javascript:;">汽车</a>
  64. <span>/</span>
  65. <a href="javascript:;">汽车用品</a>
  66. </li>
  67. <li>
  68. <a href="javascript:;">母婴</a>
  69. <span>/</span>
  70. <a href="javascript:;">玩具乐器</a>
  71. </li>
  72. <li>
  73. <a href="javascript:;">食品</a>
  74. <span>/</span>
  75. <a href="javascript:;">酒类</a>
  76. <span>/</span>
  77. <a href="javascript:;">生鲜</a>
  78. <span>/</span>
  79. <a href="javascript:;">特产</a>
  80. </li>
  81. <li>
  82. <a href="javascript:;">艺术</a>
  83. <span>/</span>
  84. <a href="javascript:;">礼品鲜花</a>
  85. <span>/</span>
  86. <a href="javascript:;">农资绿植</a>
  87. </li>
  88. <li>
  89. <a href="javascript:;">医药保健</a>
  90. <span>/</span>
  91. <a href="javascript:;">计生情趣</a>
  92. </li>
  93. <li>
  94. <a href="javascript:;">图书</a>
  95. <span>/</span>
  96. <a href="javascript:;">文娱</a>
  97. <span>/</span>
  98. <a href="javascript:;">教育</a>
  99. <span>/</span>
  100. <a href="javascript:;">电子书</a>
  101. </li>
  102. <li>
  103. <a href="javascript:;">机票</a>
  104. <span>/</span>
  105. <a href="javascript:;">酒店</a>
  106. <span>/</span>
  107. <a href="javascript:;">旅游</a>
  108. <span>/</span>
  109. <a href="javascript:;">生活</a>
  110. </li>
  111. <li>
  112. <a href="javascript:;">理财</a>
  113. <span>/</span>
  114. <a href="javascript:;">众筹</a>
  115. <span>/</span>
  116. <a href="javascript:;">白条</a>
  117. <span>/</span>
  118. <a href="javascript:;">保险</a>
  119. </li>
  120. <li>
  121. <a href="javascript:;">安装</a>
  122. <span>/</span>
  123. <a href="javascript:;">维修</a>
  124. <span>/</span>
  125. <a href="javascript:;">清洗</a>
  126. <span>/</span>
  127. <a href="javascript:;">二手</a>
  128. </li>
  129. <li>
  130. <a href="javascript:;">工业品</a>
  131. </li>
  132. </ul>

Q:那有些人会问了,我们不是引入了**reset.css**重置了浏览器的默认样式吗?为什么超链接还有样式?
A:其实,如果仔细看reset.css的源代码,会发现a元素只是重置了一些基本的内外边距、边框和字体大小,并没有做完全把a元素的样式去除。这个下面会具体介绍

样式添加

根据布局剖析,我们可以直接设置整体的样式

  1. body{
  2. /* 这里顺便添加下背景色,通过颜色拾取器识别 */
  3. background-color: #F4F4F4;
  4. }
  5. ul {
  6. /* 宽高 */
  7. width: 190px;
  8. height: 450px;
  9. /* 内外边距 */
  10. padding: 10px 0;
  11. margin: 10px auto;
  12. /* 处理溢出部分 */
  13. overflow: hidden;
  14. /* 这里顺便添加下背景色,通过颜色拾取器识别 */
  15. background-color: #fefefe;
  16. }
  17. ul>li {
  18. /* 宽高,根据继承关系可以不写宽度 */
  19. height: 25px;
  20. /* 内外边距,这里只有一个内边距 */
  21. padding-left: 18px;
  22. /* 设置背景色:不是必须的,这里只是为了发现一些问题 */
  23. background-color: #bfa;
  24. }
  25. ul>li span{
  26. /* 内外边距*/
  27. padding: 0 2px;
  28. }

细节完善

两个主要问题

  1. 要求效果文字居中显示,而我们的文字偏左上角,底部有一定间距
  2. 文字存在换行和重叠现象

    文字调整

    文字居中,只需要给li元素添加一行属性
    1. /*要让一个文字在父元素中居中,只需将父元素的line-height 设置为一个和父元素height的值*/
    2. line-height: 25px;
    解决文字重叠现象,要知道文字有几个属性:
  • 文字大小、颜色\样式

    1. font-size: 14px;
    2. color: #333;
    3. text-decoratoion:none;//去掉下划线

    符号调整

    1. ul>li span {
    2. padding: 0 2px;
    3. /* 调整符号字体大小 */
    4. font-size: 12px;
    5. }

    悬浮样式

    我们注意到,当鼠标悬浮在某一行时,其背景颜色会有变化;同时,悬浮在某一个超链接上时,字体颜色变红
    这里要用到一个伪类选择器:hover,我们还是直接上代码

    1. ul>li {
    2. height: 25px;
    3. padding-left: 18px;
    4. /* background-color: #bfa; 同时注释掉之前的一个辅助我们查看问题的背景色 */
    5. line-height: 25px;
    6. }
    7. /* 悬浮在某一行时,其背景颜色会有变化 */
    8. ul>li:hover {
    9. background-color: #D9D9D9;
    10. }
    11. /* 悬浮在某一个超链接上时,字体颜色变红 */
    12. ul>li a:hover {
    13. color: #C81724;
    14. }

    最终效果

    05.实战练习 - 图11

    核心代码

    ```html

    1. <a name="dda10b38"></a>
    2. ### 存疑问题
    3. 因为在编写HTML代码时,每个`li`元素中的`a`的`span`标签都是换行的<br />而HTML中会将多个空格合并成一个,所以`a`的`span`之间都多了一个空格<br />有几种解决这个问题的方式
    4. - 一是调整HTML中每个`li`元素中的代码,使之在一行上
    5. - 二是给ul元素或li元素设置一个`font-size: 0`的属性值
    6. - 三是通过js去除多余的换行字符(目前还没有学习到,所以不用这种方式,而且较麻烦)
    7. 我这里采用第二种方式
    8. ```css
    9. ul>li {
    10. height: 25px;
    11. padding-left: 18px;
    12. line-height: 25px;
    13. /* 设置font-size */
    14. font-size: 0;
    15. }
    16. ul>li span {
    17. /* 设置内边距 */
    18. padding: 0 2px;
    19. font-size: 12px;
    20. }

    3. 网易新闻列表

    05.实战练习 - 图12
    有了上面的实战步骤,对于网易新闻列表,我们就不进行那么详细的剖析了,直接上代码

    结构搭建

    1. <div class="news_money">
    2. <div class="news_title">
    3. <h2 class="title"><a href="#">财经</a></h2>
    4. </div>
    5. <div class="news_img">
    6. <a href="#">
    7. <img width="300" height="150" alt="楼市"加息潮"来了?" src="assets/news.png">
    8. <div class="bg">
    9. <h3>楼市"加息潮"来了?</h3>
    10. </div>
    11. </a>
    12. </div>
    13. <ul class="news_list">
    14. <li>
    15. <a href="#">太疯狂!1000万芯片投资 "换来"7个涨停</a>
    16. </li>
    17. <li>
    18. <a href="#">重磅定调!打击比特币挖矿和交易行为</a>
    19. </li>
    20. <li>
    21. <a href="#">拜登愿将基建规模砍去6000亿美元</a>
    22. </li>
    23. <li>
    24. <a href="#">呷哺呷哺高管大换血 经营模式要变?</a>
    25. </li>
    26. </ul>
    27. </div>

    05.实战练习 - 图13

    样式添加

    1. /* ====================整体==================== */
    2. .news_money {
    3. /* 整体布局 */
    4. width: 300px;
    5. height: 324px;
    6. margin: 35px auto;
    7. }
    8. a {
    9. /* 去除超链接样式 */
    10. text-decoration: none;
    11. }
    12. /* ====================标题==================== */
    13. .news_title {
    14. height: 40px;
    15. border-top: 1px #ddeedd solid;
    16. }
    17. .news_title .title {
    18. /* 标题整体布局 */
    19. width: 32px;
    20. height: 24px;
    21. line-height: 24px;
    22. padding-top: 6px;
    23. border-top: 1px #f34540 solid;
    24. margin-top: -1px;
    25. }
    26. .news_title a {
    27. /* 标题字体样式 */
    28. font-size: 16px;
    29. font-weight: bold;
    30. color: #404040;
    31. }
    32. .news_title a:hover {
    33. /* 标题悬浮样式 */
    34. color: red;
    35. }
    36. /* ====================图片==================== */
    37. .new_img {
    38. height: 150px;
    39. }
    40. .news_img:hover {
    41. /*
    42. 图片悬浮样式
    43. 这部分知识还没有学习到,所以只是做了一个简单的放大效果
    44. 但现在的效果其实是不对的,标题文字也被放大了
    45. */
    46. transform: scale(2);
    47. }
    48. /* 图片标题 */
    49. .news_img .img_title {
    50. /* 图片标题整体布局 */
    51. height: 40px;
    52. line-height: 40px;
    53. margin-top: -40px;
    54. padding-left: 30px;
    55. }
    56. .news_img a {
    57. /* 图片标题字体样式 */
    58. color: #fff;
    59. font-weight: bold;
    60. }
    61. /* ====================新闻列表==================== */
    62. .news_list {
    63. height: 120px;
    64. margin-top: 12px;
    65. }
    66. .news_list li {
    67. /* 新闻列表整体布局 */
    68. width: 285px;
    69. height: 30px;
    70. line-height: 30px;
    71. padding-left: 15px;
    72. }
    73. .news_list a {
    74. /* 新闻列表字体样式 */
    75. font-size: 14px;
    76. color: #666;
    77. }
    78. .news_list a:hover {
    79. /* 新闻列表悬浮样式 */
    80. color: red;
    81. }

    //总结:在样式编写部分的分析:

    • 先设置总体大盒子,(划分出一个个的部门)再去找一个个的小盒子嵌套的(从这也可以明白为什么写框架的时候,有些简洁的地方也嵌套了很多元素标签)
    • 一般都可以从 先布局(宽高、内外边框位置的设置)、** **后样式(大小、颜色、样式)去写
    • 盒子设置:宽高、内外边框位置的设置
    • 字体的设置: 字体大小、样式、颜色、是否添加悬浮、超链接去样式(text-decoration)
    • 图片的设置:整体盒子的长宽、图片是否悬浮、图片上布局和样式

    // 新增:

    • 图片样式的放大
    • 图片上加字体
    • 字体的加粗:font-weight: bold;
    • 伪类元素选择器 临时代替一些符号:
      1. .list li::before{
      2. content:'。'
      3. }
      05.实战练习 - 图14