流式布局(京东项目为例)

630 阅读8分钟

笔记来源:拉勾教育 - 大前端就业集训营

文章内容:学习过程中的笔记、感悟、和经验

流式布局(京东项目为例)

流式布局(百分比布局)

流式布局(百分比布局),也称非固定像素布局

原理

使用百分比(%)的方式设置宽度或者高度,当父元素发生变化的时候,子盒子也会跟着变化

优点

可以自适应进行变化,不需要设置固定数值

注意事项: 制作过程中,需要定义页面的最大和最小支持宽度

  • max-width最大宽度(max-height最大高度)
  • min-width最大宽度(min-height最大高度)
body {
    min-width: 320px;
    max-width:960px
}

京东移动端首页准备工作(m.jd.com)

技术选型:单独制作移动端页面

技术:流式布局

  1. 搭建文件结构(index.html + css文件夹 + images文件夹)
  2. index设置视口标签、引入CSS文件(初始化css和样式css)
  3. 样式css设置body初始样式(最大宽度、最小宽度、背景色、字体、字号、行高、居中、文字颜色)
  4. 设置特殊样式
body {
    min-width: 320px;
    max-width: 560px;
    margin: 0 auto;
    background: #ffffff;
    line-height: 1.5;
    font-size: 14px;
    font-family: -apple-system, Helvetica, sans-serif;
    color: #666;
}
/*(通配符)点击高亮我们需要清除清除设置为transparent完成透明 */
* {
    -webkit-tap-highlight-color: transparent;
}
/* 在移动端浏览器默认的外观IOS上加上这个属性才能给按钮和输入框自定义样式(只需要给input标签即可) */
input {
    -webkit-appearance: none;
}
/* 禁用长按页面时的弹出菜单 */
img,
a {
    -webkit-touch-callout: none;
}

京东移动端首页项目

顶部小提示区域

B5OxUA.png

结构分析:

整体是一个大盒子,从左到右浮动四个元素,每个都是垂直居中显示(其中一些CSS样式可以打开m.jd.com查看,不需要手动测量)

<!-- 顶部提示栏 -->
<ul class="top-tips">
    <li><img src="./images/close.png" alt=""></li>
    <li><img src="./images/logo1.png" alt=""></li>
    <li>打开京东App,购物更轻松</li>
    <li>立即打开</li>
</ul>
/* top-tips样式 */
/* 整体宽高、居中、边距背景、文字属性、固定定位 */
.top-tips {
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 45px;
    margin: 0 auto;
    padding: 0;
    background: #262626;
    line-height: 45px;
    text-align: center;
    color: #fff;
}
/* 所有li左浮动 */
.top-tips li {
    float: left;
}
/* 第1个li宽度 */
.top-tips li:nth-child(1) {
    width: 8%;
}
/* 大尺寸限制图片高度、垂直居中对齐父元素 */
.top-tips li:nth-child(1) img {
    width: 10px;
    vertical-align: middle;
}
/* 第2个li宽度 */
.top-tips li:nth-child(2) {
    width: 10%;
}
/* 大尺寸限制图片高度、垂直居中对齐父元素 */
.top-tips li:nth-child(2) img {
    width: 30px;
    vertical-align: middle;
}
/* 第3个li宽度 */
.top-tips li:nth-child(3) {
    width: 57%;
}
/* 第4个li宽度、背景色 */
.top-tips li:nth-child(4) {
    width: 25%;
    background: #f11d13;
}

搜索栏区域

BonJsS.png

结构分析:

整体一个大盒子包裹三个子盒子,并且中间搜索栏要跟着屏幕大小变化,两边要保持一致不变,可以使用两侧绝对定位,中间两侧设置margin让出空间来实现

搜索框内部从左到右可以分我三块,由于搜索内容区域要跟着父元素宽度变化,所以我们可以使用绝对定位,宽度设置为100%,左边两个可以设置左浮动,搜索区域只要让出来空间就可以了

可能会用到的CSS属性:

  • background: transparent;背景透明
  • outline: none;去掉轮廓线(去掉input默认点击出现边框)
<!-- header开始 -->
<header class="header">
    <!-- 左侧菜单按钮 -->
    <div class="cd l">
        <span></span>
    </div>
    <!-- 搜索框 -->
    <div class="search">
        <span></span>
        <i></i>
        <input type="seach" placeholder="轻薄本">
    </div>
    <!-- 登录按钮 -->
    <div class="login r">登录</div>
</header>
<!-- header结束 -->
/* header区域 */
/* 整体固定定位、宽高、行高、文字颜色 */
.header {
    position: fixed;
    top: 45px;
    left: 0;
    width: 100%;
    height: 44px;
    background: pink;
    line-height: 44px;
    color: #fff;
}
/* 左和右绝对定位,宽高 */
.header .l,
.header .r {
    position: absolute;
    width: 40px;
    height: 44px;
}
/* 左侧定位 */
.header .l {
    left: 0;
    top: 0;
}
/* 图标使用二倍图 */
.header .l span {
    display: block;
    width: 20px;
    height: 18px;
    margin: 14px 0 0 15px;
    background: url(../images/s-btn.png);
    background-size: 20px 18px;
}
/* 搜索框相对定位。不设置宽度自动撑开,设置边距、圆角、背景色 */
.header .search {
    position: relative;
    left: 0;
    top: 0;
    height: 30px;
    margin: 7px 50px;
    border-radius: 15px;
    background: #fff;
}
/* jd图标 相对定位、左浮动、宽高、边距、二倍图背景 */
.header .search span {
    position: relative;
    float: left;
    width: 20px;
    height: 15px;
    margin: 8px 8px 0 15px;
    background: url(../images/logo2.png) no-repeat 0 0;
    background-size: 20px 15px;
}
/* 伪元素变竖线、病危、背景色、宽高 */
.header .search span::before {
    content: '';
    position: absolute;
    top: 0;
    right: -8px;
    width: 1px;
    height: 15px;
    background: #ccc;
}
/* 精灵二倍图 */
.header .search i {
    float: left;
    width: 18px;
    height: 15px;
    margin: 8px 0 0 15px;
    background: url(../images/jd-sprites.png) no-repeat -82px 0;
    background-size: 200px 200px;
}
/* 搜索框绝对定位、边距、去除边框、背景透明、去掉默认点击边框 */
.header .search input {
    position: absolute;
    top: 0;
    left: 0;
    padding: 0 20px 0 78px;
    height: 30px;
    width: 100%;
    border: 0;
    background: transparent;
    font-size: 12px;
    outline: none;
}
/* 登录按钮右侧定位 */
.header .r {
    right: 0;
    top: 0;
}

多倍精灵图的使用

  1. 使用图片工具(ps等)将精灵图尺寸呢缩小n倍
  2. 量取所需精灵图尺寸获取定位值
  3. 引入背景,修改定位,同时修改background-size为缩小后的尺寸
/* 下面是使用400*400精灵图 */
background: url(../images/jd-sprites.png) no-repeat -82px 0;
background-size: 200px 200px;

主要内容区域

CSS背景渐变

实现背景颜色逐渐变化的效果

background-image:linear-gradient(方向, 颜色1 停止,颜色2 停止)

/* 从左到右依次是前50%纯红色,50%-80%红-绿过渡,80%-100%绿和蓝过渡 */
background-image: linear-gradient(to right, #f00 50%, #0f0 80%, #00f);

Boy3rT.png

图片格式

DPG图片压缩技术

京东自主研发推出DPG图片压缩技术,经测试该技术,可直接节省用户近50%的浏览流量,极大的提升了用户的网页打开速度。 能够兼容jpeg,实现全平台、全部浏览器的兼容支持,经过内部和外部上万张图片的人眼浏览测试后发现,压缩后的图片和webp的清晰度对比没有差距。

webp图片格式

谷歌开发的一种旨在加快图片加载速度的图片格式。图片压缩体积大约只有JPEG的2/3,并能节省大量的服务器宽带资源和数据空间。

焦点图部分

Bocdu6.png

结构分析:

上面的搜索栏部分其实是不包括在焦点图里面的,焦点图区域只有两个东西,一个后边的背景,一个前面的轮播图,背景可以使用div元素,这里面北京实际上是一个150%宽度的元素,再经过下半部圆角和颜色过渡实现的,上面的轮播图就是一个轮播图结构

<!-- 焦点图 -->
<div class="banner">
    <!-- 背景 -->
    <div class="banner-bg"></div>
    <!-- 图片 -->
    <ul class="images">
        <li><a href="javascript:;"><img src="./images/banner01.dpg" alt=""></a></li>
        <li><a href="javascript:;"><img src="./images/banner01.dpg" alt=""></a></li>
        <li><a href="javascript:;"><img src="./images/banner01.dpg" alt=""></a></li>
    </ul>
    <!-- 指示灯 -->
    <ol>
        <li class="now"></li>
        <li></li>
        <li></li>
    </ol>
</div>
/* main 主要内容区域 */
.content {
    width: 100%;
    margin-top: 45px;
}
/* 焦点图定位、宽高、溢出隐藏 */
.content .banner {
    position: relative;
    width: 100%;
    height: 187px;
    overflow: hidden;
}
/* 背景定位、宽高、圆角、渐变背景色 */
.content .banner .banner-bg {
    position: absolute;
    left: -25%;
    width: 150%;
    height: 187px;
    border-bottom-left-radius: 100%;
    border-bottom-right-radius: 100%;
    background: linear-gradient(0deg,#f1503b,#c82519 50%);
}
/* 图片列表定位、宽度、边距 */
.content .banner ul li {
    position: absolute;
    left: 0;
    top: 0;
    width: 100%;
    padding: 44px 3.33% 0;
}
/* 后两张图片定位 */
.content .banner ul li:nth-child(2) {
    left: 100%;
}
.content .banner ul li:nth-child(3) {
    left: 200%;
}
/* 图片宽高 */
.content .banner ul li a img {
    width: 100%;
}
/* 指示灯定位、宽高、边距 */
.content .banner ol {
    position: absolute;
    bottom: 10px;
    left: 50%;
    width: 60px;
    height: 10px;
    margin: 0 0 0 -30px;
    padding: 0;
}
/* 指示灯浮动、宽高、背景、圆角 */
.content .banner ol li {
    float: left;
    width: 10px;
    height: 10px;
    border-radius: 50%;
    background: #cccccc;
    margin-right: 10px;
}
/* 当选选中样式 */
.content .banner ol .now {
    background: #ffffff;
}

优惠活动布局

Bo47wt.png

结构分析

整体从左到右为3块区域,并排显示,使用大盒子包裹三个小盒子,三个小盒子都占用三分之一的宽度,高度无需设置,让元素自动撑开

<!-- 优惠券 -->
<ol class="youhui">
    <li><a href="javascript:;"><img src="./images/banner_bottom_01.dpg" alt=""></a></li>
    <li><a href="javascript:;"><img src="./images/banner_bottom_02.dpg" alt=""></a></li>
    <li><a href="javascript:;"><img src="./images/banner_bottom_03.dpg" alt=""></a></li>
</ol>
/* 优惠券 */
/* 优惠券宽度、清除边距、溢出隐藏 */
.content .youhui {
    width: 100%;
    padding: 0;
    margin: 0;
    overflow: hidden;
}
/* 左浮动,宽度平分100% */
.content .youhui li {
    float: left;
    width: 33.333%;
}
/* 图片宽度 */
.content .youhui li a img {
    width: 100%;
}

导航栏

BoIQDs.png

结构分析:

导航栏一共两个,右侧还有一个,只不过隐藏了,导航栏内部有10个块,每行5块平分整行,平均每个块20%宽度,内部元素正常设置即可,两个导航栏使用定位,后面的超出隐藏

<!-- 导航 -->
<nav class="daohang">
    <ol>
        <li><img src="./images/nav01.webp" alt=""><span>京东超市</span></li>
        <li><img src="./images/nav01.webp" alt=""><span>京东超市</span></li>
        <li><img src="./images/nav01.webp" alt=""><span>京东超市</span></li>
        <li><img src="./images/nav01.webp" alt=""><span>京东超市</span></li>
        <li><img src="./images/nav01.webp" alt=""><span>京东超市</span></li>
        <li><img src="./images/nav01.webp" alt=""><span>京东超市</span></li>
        <li><img src="./images/nav01.webp" alt=""><span>京东超市</span></li>
        <li><img src="./images/nav01.webp" alt=""><span>京东超市</span></li>
        <li><img src="./images/nav01.webp" alt=""><span>京东超市</span></li>
        <li><img src="./images/nav01.webp" alt=""><span>京东超市</span></li>
    </ol>
    <ol>
        <li><img src="./images/nav01.webp" alt=""><span>京东超市</span></li>
        <li><img src="./images/nav01.webp" alt=""><span>京东超市</span></li>
        <li><img src="./images/nav01.webp" alt=""><span>京东超市</span></li>
        <li><img src="./images/nav01.webp" alt=""><span>京东超市</span></li>
        <li><img src="./images/nav01.webp" alt=""><span>京东超市</span></li>
        <li><img src="./images/nav01.webp" alt=""><span>京东超市</span></li>
        <li><img src="./images/nav01.webp" alt=""><span>京东超市</span></li>
        <li><img src="./images/nav01.webp" alt=""><span>京东超市</span></li>
        <li><img src="./images/nav01.webp" alt=""><span>京东超市</span></li>
        <li><img src="./images/nav01.webp" alt=""><span>京东超市</span></li>
    </ol>
</nav>
/* 导航菜单 */
/* 整体大结构定位、宽高、溢出隐藏 */
.content .daohang {
    position: relative;
    width: 100%;
    height: 160px;
    overflow: hidden;
}
/* 导航菜单定位、溢出隐藏 */
.content .daohang ol {
    position: absolute;
    top: 0;
    left: 0;
    overflow: hidden;
}
/* 第二个菜单在右侧 */
.content .daohang ol:nth-child(2) {
    left: 100%;
}
/* 每个小块左浮动、宽度、居中文字 */
.content .daohang li {
    float: left;
    width: 20%;
    text-align: center;
}
/* 图片转块、宽度、边距 */
.content .daohang li img {
    display: block;
    width: 40px;
    margin: 10px auto 6px;
}
/* 文字属性 */
.content .daohang li span {
    line-height: 18px;
    font-size: 12px;
}

信任专享

BoH8L4.png

结构分析:

和上面优惠券模块基本相同,大盒子包裹两个小图片,图片占用50%宽度

<!-- 新人专享 -->
<div class="new">
    <a href="javascript:;"><img src="./images/new1.dpg" alt=""></a>
    <a href="javascript:;"><img src="./images/new2.dpg" alt=""></a>
</div>
/* 新人专享 */
/* 大结构宽度、边距、溢出隐藏 */
.content .new {
    width: 100%;
    padding: 10px;
    overflow: hidden;
}
/* a标签浮动。一半宽度、转块 */
.content .new a {
    float: left;
    display: block;
    width: 50%;
}
/* 图片占满父元素宽度 */
.content .new a img {
    width: 100%;
}