实现王者荣耀首页 https://pvp.qq.com/
1. 整体代码
2. 重置样式
1 | body,div,ul,li,p,span,a,h1,dl,dt,dd,em,i,table,thead,tbody,tr,td{ |
3. 共同样式
3.1. 尺寸
1 | .wrapper_01 { |
3.2. 图标
1 | .title_icon_01 { |
3.3. 清浮动
1 | /* 清浮动 */ |
4. top
4.1. 思路

- div.top 中包含一个水平居中的div.wrapper_01
- div.wrapper_01包含div.left,div.right元素,两者贴边
- div.left元素中有a.logo,img.ost-ads,a.ost-big元素
- a.logo元素是块级元素,显示的是背景图片
- a.logo元素拥有文字是为了搜索引擎的检索,进一步为了文字不显示需要向前缩进超大值
- a.ost-big元素默认相对于div.left元素绝对定位,默认元素隐藏。只有鼠标在img.ost-ads元素上悬停时a.ost-big元素才会显示
- 鼠标离开img.ost-ads元素时,a.ost-big元素为了能够显示,还需要设置鼠标悬停在a.ost-big元素上时,元素显示
- div.right元素中有div.platform,div.recommend,div.recommend-box元素
- div.platform,div.recommend元素都有i元素作为图标
- div.platform,div.recommend元素内部都是flex布局,侧轴居中,元素垂直居中
- div.recommend-box元素相对于div.right元素绝对定位,默认元素隐藏。只有鼠标在div.recommend元素上悬停时div.recommend-box元素才有高度
- div.recommend-box元素内部 div.pc,div.mobile元素
- div.pc,div.mobile元素内部都有div.title,div.list元素
- div.list元素中有多个dl-dt-dd列表
4.2. div.top
1 | <div class="top"> |

- 整个div.top的高度由子元素div.wrapper_01撑起来,div.wrapper_01元素宽高为980x41
- div.wrapper_01元素为了内部元素垂直居中,设置行高=盒高
1 | .top { |
4.3. div.left/div.right
- div.left元素中有a.logo,img.ost-ads,a.ost-big元素
- div.right元素中有div.platform,div.recommend,div.recommend-box元素
1 | .top .left, |
4.4. a.logo
1 | <a href="#" class="logo">腾讯游戏logo</a> |

1 | /* 腾讯游戏logo */ |
4.5. img.ost-ads
1 | <img src="./img/top/ost.jpeg" class="ost-ads"> |

1 | /* 广告位 */ |
4.6. a.ost-big
1 | <a href="#" class="ost-big"> |

- 默认该元素不显示(display:none),只有鼠标悬停在 img.ost-ads上时才显示
- 在显示 a.ost-big 元素时,还能显示 a.logo元素
- 所以a.logo的层级高于a.ost-big,但a.ost-big层级不能低于img.ost-ads
- 所以设置a.ost-big的z-index为10,a.logo的z-index为11。要保证两者都是定位元素z-index才有效
1 | .top .ost-ads:hover + .ost-big, |
4.7. div.platform
1 | <div class="platform"> |

- 绿色圆图标是来自于一张精灵图
- 为了内部两者垂直居中,需要设置侧轴居中 align-items: center
1 | /* 成长守护平台 */ |
4.8. div.recommend
1 | <div class="recommend"> |

- 箭头图标和div.platform中的图标来自于同一张精灵图,图中箭头方向向右,为了让其向下,用到rotate形变
1 | /* 腾讯游戏热门推荐 */ |
4.9. div.recommend-box
1 | <div class="recommend-box"> |

- div.recommend-box高度为0,默认不可见,鼠标悬停在div.recommmend元素上时,div.recommend-box才拥有高度
- 为了高度从0-658px有缓慢增加效果,添加tansition属性
- div.pc + div.mobile,div.pc元素宽度确定,div.mobile元素宽度扩充至占满剩余空间
1 | .top .recommend:hover + .recommend-box, |
4.9.1. div.title
1 | <div class="pc"> |

- div.title元素中有 i.icon,span元素,两者要垂直居中 align-items: center;
- i.icon为行内块级元素,宽高为4x16
- span为行内非替换元素,只能设置字号18px
1 | /* 下拉框标题 */ |
4.9.2. div.list
1 | <div class="list"> |
- 分为 热门推荐 和 新品推荐 两个模块,两者水平排布
1 | /* 下拉框列表 */ |
4.9.3. div.rank.hot
1 | <!-- pc --> |

客户端的热门推荐模块右边有1px的边框,手机端的左边有1px的边框
1
2
3
4
5
6
7
8.top .pc .rank.hot {
padding-left: 68px;
border-right: 1px solid #EDF1F5;
}
.top .mobile .rank.hot {
padding-left: 47px;
border-left: 1px solid #EDF1F5;
}热门推荐模块的标题都是红色大字
1
2
3
4
5
6
7
8
9
10
11.top .recommend-box .rank-title {
font-size: 16px;
font-weight: 600;
line-height: 22px;
padding-bottom: 28px;
padding-top: 20px;
padding-left: 30px;
}
.top .recommend-box .hot .rank-title {
color: #FF3C6A;
}手机端的热门推荐是有两个列表,使其水平排布
1
2
3.top .recommend-box .list .more {
display: flex;
}列表中的每一个a元素,必须显示在一行中,多余用…表示
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17.top .recommend-box .item {
display: block;
min-width: 116px;
margin-right: 28px;
margin-bottom: 12px;
font-size: 16px;
line-height: 22px;
color: #868B90;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
.top .recommend-box .item:hover {
color: #000;
}
4.9.4. div.rank.new
1 | <!-- pc --> |

- 手机端新品推荐的左边有1px的边框
1 | .top .pc .rank.new { |
5. header
5.1. 思路

div.header 元素高度为84px
div.header元素中有 div.wrapper_02,div.sub-nav元素
div.wrapper_02元素高度等于84px,内部放横栏,有h1,ul.list,div.login三个元素,三者水平贴边
div.sub-nav元素中放下拉导航栏,默认不可见
鼠标悬停在div.header元素上时,div.sub-nav元素高度才展示
div.sub-nav元素中a元素文字前的图标通过伪元素::before实现
5.2. div.header
1 | <div class="header"> |

div.header元素设置透明背景,高度由子元素div.wrapper_02元素撑起来,div.sub-nav元素已脱标
div.wrapper_02元素宽高为1300x84
1 | .header { |
5.3. h1.logo
1 | <h1><a href="#" class="logo">王者荣耀</a></h1> |

- 一般就是用 h1元素,也是在网页中唯一使用h1元素的地方
- a元素中的文字是为了给浏览器检索,在网页中不应该显示,向前缩进至无法显示,但存在 text-indent: -9999px;
1 | .header .logo { |
5.4. ul.list
1 | <ul class="list"> |

- 整个div.wrapper_02元素的宽度是固定的1200px,h1.logo元素宽度也固定200px,div.login元素宽度固定为182px,所以 ul.list设置 flex:1; 即flex-grow:1; 将占据父元素所有剩余空间
- 鼠标悬停在每个li元素上时,鼠标是会变为小手的,说明a元素占据整个li元素,所以将a元素变为快元素,设置宽高=li元素
- a元素内部是垂直布局的,所以将span和em元素都改为块级元素
1 | .header .list { |
5.5. div.login
1 | <div class="login"> |

- 头像和文字是水平布局,文字垂直布局
1 | .header .login { |
5.6. div.sub-nav
1 | <div class="sub-nav"> |

div.sub-nav元素已脱标,为绝对定位
div.sub-nav元素内部有div.wrapper_03元素,该元素宽度为890px,水平居中
div.wrapper_03元素是由多个ul>li>a元素组成的,水平居中
设置每个li元素宽度为115px = 上面ul.list中li元素的宽度
设置li元素内容显示在一行,不能换行white-space: nowrap;
有些文字前有红色图标,用伪元素::before,分为.hot,.fans,.guard不同显示内容
- 为了图标和文字垂直居中,设置父元素a为flex布局
有些a元素加了图标,内容宽度>115px,需要设置整体内容后移margin-left: 5px;
1 | .header:hover .sub-nav{ |
6. wrapper
6.1. 思路

- div.wrapper元素由 div.bg-container,div.man元素组成
- div.bg-container元素脱标,充当div.wrapper元素部分的背景
- div.wrapper元素的高度由div.main元素撑起来
- div.main元素设置较大的上外边距,使得div.bg-container元素的图片头部可以显示
6.2. div.wrapper
1 | <div class="wrapper"> |
- css
1 | .wrapper { |
6.3. div.bg-container
1 | <div class="bg-container"> |

- div.bg-container元素向上偏移84px,而84px就是div.header元素的高度。这么做是为了实现叠放在div.header元素下方效果
- div.bg-container元素高度由div.bg元素撑起来,因为a元素为了迎合图片中的按钮位置已脱标
- a元素宽高为1200x440,水平居中
1 | .wrapper .bg-container { |
6.4. div.main
1 | <div class="main wrapper_04"> |
- div.main元素自身宽度为1200px,水平居中,设置比div.bg-container中a元素高度更大的上偏移值才能避免误触
- div.main元素中有div.main-top,div.quick-entrance,两个div.main-item元素,都是垂直布局
1 | .wrapper .main { |
6.5. div.main-top
1 | <div class="main-top"> |

- div.main-top元素由背景图将区域分为div.left,div.center,div.right三个元素,三者水平居中
- div.left元素中图片是自动+手动轮播
- div.center元素中根据标题实现新闻内容的切换
- div.right元素就是三张背景图的堆积
1 | .wrapper .main-top { |
6.6. div.left
1 | <div class="left"> |

- div.left元素有明确的宽度604px,也就规定了内部图片宽度为604px
- div.left元素中有ul.photos,div.btns两个元素,垂直布局
1 | .main-top .left { |
6.6.1. ul.photos
- ul.photos元素中每个li元素的宽度为100%,5个li元素水平排列
1 | .main-top .photos { |
6.6.2. 图片轮播
6.6.3. div.btns
- div.btns元素中5个a元素,平分div.btns元素宽度
- active类是为了js控制按钮切换时,选中按钮的需要
1 | .main-top .btns { |
6.6.4. 按钮点播
6.7. div.right
1 | <div class="right"> |

- div.right元素宽度占满div.main-top元素的剩余空间
- div.right元素高度是三个a元素垂直布局堆积的高度
- a元素都是块级元素,内容来自于同一张精灵图不同位置
1 | /* right */ |
6.8. div.center
1 | <div class="center"> |

- div.center元素由div.nav,div.news元素组成,垂直布局
- div.center元素宽度占满div.main-top的剩余空间
- div.center元素设置溢出隐藏,是为了内部新闻列表移动时,其他新闻项不可见
1 | /* center */ |
6.8.1. div.nav
1 | <div class="nav"> |

- 为了让ul.list,a.more元素水平排布,设置div.nav是flex布局,其实div.nav元素中ul.list每个li.item元素样式其实和a.more样式都一样,除了:hover时的样式
- 每个li.item元素
- 为了看起来文字和下划线有一定间距,设置line-height很大,但不能超过整个元素的高度
- 为了鼠标悬停和未悬停状态的li元素下边框不影响整体高度,设置下边框颜色透明
1 | .main-top .nav { |
6.8.2. div.news
1 | <div class="news"> |
6.8.3. .news_list类样式
1 | /* main-top和match-center的新闻列表样式相同 */ |
6.8.4. div.news_list

- div.news 由多个ul.new_list组成,每个ul.new_list元素宽度为100%,水平排布。此时就需要在div.news的父元素中设置溢出隐藏-div.center
- ul.new_list中的布局和div.main-item中div.match-center中的新闻布局一样,所以抽取成 new_list类
- 第一个li元素是不同的,只有a元素
- 其余li元素有div.left,em.date元素,div.left中有span和a元素,三者垂直居中
- span和a外套一个div.left是为了让span元素贴li元素左边,a元素贴span元素,而em贴li元素右边,单就flex布局无法实现
- span元素是块级元素,有宽高32x16
- a元素是块级元素,限制宽为230px,超过部分文字以…显示
- em元素字体小于span和a元素
1 | /* news */ |
6.8.5. 导航转换新闻列表
6.9. div.quick-entarnce
1 | <div class="quick-entrance"> |

- 4个a元素水平排布,a元素需要设置溢出隐藏,因为在鼠标悬停时img元素被放大一点
1 | /* quick-entrance */ |