10 主体区 - 推荐列表区
- 头部区域
.large-header分为导航区.bili-nav,banner 区.bili-banner,频道区.bili-channel。 - 主体 main:推荐列表
.recommended-container和侧边栏.sidebar。 - 前面课程完成了头部区域
.large-header,这节课完成主体推荐列表区.recommended-container里的推荐卡片列表。
布局分析

推荐列表是由左右两部分组成:轮播图
.carousel+ 推荐卡片列表。我们先做列表项推荐卡片.recommended-card,做完一个以后复制为多份铺满即可。推荐卡片
.recommended-card是有上下两部分组成:上面视频封面图片区.recommended-card__image,下面视频信息区.recommended-card__info。视频封面图片区
.recommended-card__image分为 视频封面图片img和遮罩层区.recommended-card__mask- 遮罩层区
.recommended-card__mask分为:统计数据区.recommended-card__stats、视频时长.recommended-card__duration- 统计数据项
.recommended-card__stat分为播放量/弹幕数图标svg和 统计计数.recommended-card__count
- 统计数据项
- 遮罩层区
视频信息区
.recommended-card__info分为:视频标题.recommended-card__title和元信息区.recommended-card__meta- 元信息区
.recommended-card__meta分为 up svg 图标,up 主.recommended-card__author和视频发布时间.recommended-card__date
- 元信息区
bash
.recommended-container # 推荐容器
├─ .recommended-card # 推荐卡片
│ ├─ .recommended-card__image # 视频封面图片区
│ │ ├─ img # 视频封面图片
│ │ └─ .recommended-card__mask # 遮罩层区
│ │ ├─ .recommended-card__stats # 统计数据区
│ │ │ ├─ .recommended-card__stat # 统计数据项
│ │ │ │ ├─ svg # 播放量/弹幕数 图标
│ │ │ │ └─ .recommended-card__count # 统计计数
│ │ │ └─ .recommended-card__stat
│ │ └─ .recommended-card__duration # 视频时长
│ └─ .recommended-card__info # 视频信息区
│ ├─ .recommended-card__title # 视频标题
│ └─ .recommended-card__meta # 元信息区
│ ├─ svg # up 主图标
│ ├─ .recommended-card__author # up 主
│ └─ .recommended-card__date # 视频发布时间
├─ .recommended-item
└─ .recommended-item结构搭建
html
<!-- 主体 -->
<div class="main">
<!-- 推荐列表 -->
<div class="recommended-container">
<div class="recommended-card">
<!-- 视频封面 -->
<a href="#">
<div class="recommended-card__image">
<img src="./img/rcmd-1.png@672w_378h_1c_!web-home-common-cover" alt="" />
<div class="recommended-card__mask">
<div class="recommended-card__stats">
<div class="recommended-card__stat">
<svg class="iconpark-icon">
<use href="#bo-fang-liang"></use>
</svg>
<span class="recommended-card__count">10.5 万</span>
</div>
<div class="recommended-card__stat">
<svg class="iconpark-icon">
<use href="#dan-mu-shu"></use>
</svg>
<span class="recommended-card__count">128</span>
</div>
</div>
<div class="recommended-card__duration">03:16</div>
</div>
</div>
</a>
<!-- 视频信息 -->
<div class="recommended-card__info">
<h3 class="recommended-card__title">
<a href="#">钢铁侠、美队确认回归!托比蜘蛛侠,金刚狼领衔主演《复联 6》</a>
</h3>
<div class="recommended-card__meta">
<a href="#">
<svg class="iconpark-icon">
<use href="#up"></use>
</svg>
<span class="recommended-card__author">努力的 Lorre</span>
<span class="recommended-card__date">· 11-07</span>
</a>
</div>
</div>
</div>
</div>
</div>样式处理
基础样式
css
img {
/* 使图片在垂直方向上与周围的元素居中对齐,从而去除图片的默认上下间距 */
vertical-align: middle;
}
a:focus,
a:hover,
a:active {
/* 去除轮廓 */
outline: none 0;
}推荐列表
css
/**
* 主体
*/
.main {
width: 100%;
padding: 0 60px;
box-sizing: border-box;
}
/**
* 推荐列表
*/
.recommended-container {
display: grid;
grid-template-columns: repeat(5, 1fr);
gap: 20px;
width: 100%;
}视频封面图片区
css
/* 视频封面图片区 */
.recommended-card a {
transition: color 0.2s linear;
cursor: pointer;
}
.recommended-card a:hover {
color: #00aeec;
}
.recommended-card__image {
position: relative;
border-radius: 6px;
overflow: hidden;
}
.recommended-card__image img {
width: 100%;
height: 100%;
vertical-align: middle;
}视频封面遮罩层
css
/* 视频封面遮罩层 */
.recommended-card__mask {
position: absolute;
left: 0;
bottom: 0;
padding: 16px 8px 6px;
box-sizing: border-box;
width: 100%;
height: 38px;
background-image: linear-gradient(180deg, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.8) 100%);
color: #fff;
font-size: 13px;
display: flex;
align-items: center;
}
.recommended-card__stats {
flex: 1;
display: flex;
align-items: center;
}
.recommended-card__stat {
display: flex;
align-items: center;
margin-right: 12px;
}
.recommended-card__mask svg {
width: 18px;
height: 18px;
color: #fff;
margin-right: 2px;
}视频信息区
css
/* 视频信息区 */
.recommended-card__info {
margin-top: 10px;
}
.recommended-card__title {
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
text-overflow: ellipsis;
line-break: anywhere;
padding-right: 16px;
line-height: 22px;
font-size: 15px;
overflow: hidden;
font-weight: 500;
color: #18191c;
}
.recommended-card__meta {
margin-top: 4px;
display: flex;
font-size: 13px;
}
.recommended-card__meta a {
color: #9499a0;
display: flex;
align-items: center;
}
.recommended-card__meta svg {
width: 17px;
height: 17px;
margin-right: 2px;
}
.recommended-card__date {
margin-left: 4px;
}