0
点赞
收藏
分享

微信扫一扫

移动web开发——Flex布局

你的益达233 2022-04-02 阅读 60
前端

一、Flex布局

思考

  • 多个盒子横向排列使用什么属性?
    • 浮动
  • 设置盒子间的间距使用什么属性?
    • margin 
  • 需要注意什么问题?
    • 浮动的盒子脱标 

Flex布局/弹性布局:(PC端对低版本浏览器不兼容/移动端可以随便用)

  • 是一种浏览器提倡布局模型 非常适合结构化的布局(左右、上下...)
  • 布局网页更简单、灵活
  • 避免浮动脱标的问题 

一个网站:http://caniuse.com 查看一个技术兼容和不兼容的浏览器版本 

1.1 Flex布局模型构成

作用

  • 基于Flex精确灵活控制块级盒子的布局方式,避免浮动布局中脱离文档流现象发生
  • Flex布局非常适合结构化布局

设置方式

  • 父元素添加display:flex;子元素可以自动的挤压或拉伸 (一行排列/水平排列)
  • 水平排列:默认主轴在水平,弹性盒子都是沿着主轴排列

组成部分

  • 弹性容器(父元素)
  • 弹性盒子 (子元素)
  • 主轴
  • 侧轴/交叉轴

 

 1.2 主轴对齐方式

使用justify-content调节元素在主轴的对齐方式

  • 思考:网页中,盒子之间有距离吗?        

在Flex布局模型中,调节主轴或侧轴的对齐方式来设置盒子之间的间距 

属性值作用
flex-start默认值,起点开始依次排列
flex-end终点开始依次排列
center沿主轴居中排列
space-around弹性盒子沿主轴均匀排列,空白间距均分在弹性盒子两侧
space-between弹性盒子沿主轴均匀排列,空白间距均分在相邻盒子之间
space-evenly弹性盒子沿主轴均匀排列,弹性盒子与容器之间间距相等
  • 修改主轴对齐方式属性:justify-content

 

 

 

 

 1.3 侧轴对齐方式

使用align-items调节元素在侧轴的对齐方式

 修改侧轴对齐方式属性:

  • align-items (添加到弹性容器)
  • align-self:控制某个弹性盒子在侧轴的对齐方式(添加到弹性盒子
属性值作用
flex-start默认值,起点开始依次排列
flex-end终点开始依次排列
center沿侧轴居中排列
stretch默认值,弹性盒子沿着侧轴线被拉伸至铺满容器(子盒子没有高度的时候)

 

 

控制某个盒子在侧轴方向的对齐方式

 

 1.4 Flex弹性盒子尺寸特点

 

 

 2.1 伸缩比

使用flex属性修改弹性盒子伸缩比

属性

  • flex:值

取值分类

  • 数值(整数) 

注意:只占用父盒子剩余尺寸的份数 

 

 特点:可以根据父元素的尺寸发生变化

案例——小兔鲜儿确认订单页面

 注意点:

如果设计图上的图标有这样的框框(如果图标没有也要注意),这是表示这个图标的触发范围是这一个框,一般是44px 

关于为什么不设置img的宽高而设置其父元素的宽高

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>确认订单</title>
    <link rel="stylesheet" href="./lib/iconfont/iconfont.css">
    <link rel="stylesheet" href="./css/base.css">
    <link rel="stylesheet" href="./css/orders.css">
</head>

<body>
    <!-- 主体内容:滑动查看 -->

    <div class="main">
        <!-- 用户信息 -->
        <div class="user_msg pannel">
            <div class="location">
                <i class="iconfont icon-location"></i>
            </div>
            <div class="user">
                <div class="top">
                    <h5>林丽</h5>
                    <p>18500667882</p>
                </div>
                <div class="bottom">
                    北京市 海淀区 中关村软件园 信息科技大厦1号
                    楼410#
                </div>
            </div>
            <div class="more">
                <i class="iconfont icon-more"></i>
            </div>
        </div>
        <!-- 用户信息 -->
        <!-- 商品 -->
        <div class="goods pannel">
            <div class="pic">
                <a href="#"><img src="./uploads/pic.png" alt=""></a>
            </div>
            <div class="info">
                <h5>康尔贝 非接触式红外体温仪
                    领券立减30元 婴儿级材质 测温…</h5>
                <p>
                    <span>粉色</span>
                    <span>红外体温计</span>
                </p>
                <div class="price">
                    <span class="red">¥<i>266</i></span>
                    <span>¥299</span>
                </div>
            </div>
            <div class="count">
                <i class="iconfont icon-x"></i>
                <span>1</span>
            </div>
        </div>
        <!-- 商品 -->

        <!-- 其他信息 -->
        <section class="rest pannel">
            <div>
                <h5>配送方式</h5>
                <p>顺丰快递</p>
            </div>
            <div>
                <h5>买家备注</h5>
                <p>希望可以尽快发货,谢谢~</p>
            </div>
            <div>
                <h5>支付方式</h5>
                <p>支付宝<i class="iconfont icon-more"></i></p>
            </div>
        </section>
        <!-- 其他信息 -->

        <!-- 总价 -->
        <section class="total pannel">
            <div>
                <h5>商品总价</h5>
                <p><span>¥<i>299.00</i></span></p>
            </div>
            <div>
                <h5>运费</h5>
                <p><span>¥<i>0.00</i></span></p>
            </div>
            <div>
                <h5>折扣</h5>
                <p><i>-</i><span>¥<i>299.00</i></span></p>
            </div>
        </section>
        <!-- 总价 -->

    </div>
    <!-- 主体内容:滑动查看 -->

    <!-- 底部内容:固定定位 -->
    <div class="pay">
        <div class="left">
            <!-- 因为金额需要从数据库中获得,需要经常改变 所以单独用一个标签包裹 -->
            合计:<span class="red">¥<i>266.00</i></span>
        </div>
        <div class="right">
            <a href="#">去支付</a>
        </div>
    </div>
    <!-- 底部内容:固定定位 -->

</body>

</html>
body {
    background-color: #f7f7f8;
}

/* 公共样式 */
.red {
    color: #cf4444;
}

.pannel {
    margin-bottom: 10px;
    background-color: #fff;
    border-radius: 5px;
}
/* 公共样式 */

/* 主体内容:滑动查看 */
.main {
    /* 因为底部的盒子固定定位 会脱标,会压住主体的内容,所以需要将主体内容距离底部盒子一段距离(底部盒子的高度) */
    padding: 12px 11px 80px;
}
/* 用户信息 */
.user_msg {
    display: flex;
    padding: 15px 0 14px 11px;
    align-items: center;
}

.user_msg .location {
    width: 30px;
    height: 30px;
    margin-right: 10px;
    background-image: linear-gradient(90deg, 
		#6fc2aa 5%, 
		#54b196 100%);
    border-radius: 50%;
    text-align: center;
    line-height: 30px;
    color: #fff;
}

.user_msg .user {
    flex: 1;
}

.user_msg .user .top {
    display: flex;
}

.user_msg .user .top h5 {
    width: 52px;
    font-size: 15px;
    font-weight: 400;
    color: #262626;
}

.user_msg .user .top p {
    font-size: 14px;
    color: #333333;
}
.user_msg .user .bottom {
    margin-top: 5px;
    font-size: 12px;
    color: #333;
}

.user_msg .more {
    width: 44px;
    height: 44px;
    /* ps */
    /* background-color: pink; */
    text-align: center;
    line-height: 44px;
    color: #808080;
}
/* 用户信息 */

/* 商品 */
.goods {
    display: flex;
    padding: 11px 0 11px 11px;
}
    /* 因为在base.css里面设置了图片width:100%等于父元素宽度的百分之百,所以这里可以直接给父元素设置宽高,图片的宽高也会变化 */
.goods .pic {
    width: 85px;
    height: 85px;
    margin-right: 12px;
}

.goods .info {
    flex: 1;
}

.goods .count {
    width: 44px;
    height: 44px;
    /* ps */
    /* background-color: pink; */
    text-align: center;
    line-height: 44px;
}

.info h5 {
    font-size: 13px;
    font-weight: 400;
    color: #262626;
}

.info p {
    width: 95px;
    height: 20px;
    margin: 5px 0;
    background-color: #f7f7f8;
    font-size: 12px;
    color: #888;
    border-radius: 2px;
}

.info p span:first-child {
    margin-right: 3px;
}

.info .price {
    font-size: 12px;
}

.info .price span:first-child i {
    font-size: 16px;
}

.info .price span:last-child {
    margin-left: 5px;
    color: #999;
    text-decoration: line-through;
} 
/* 商品 */

/* 其他信息 */

.rest {
    padding: 15px;
}

.rest div {
    display: flex;
    margin-bottom: 30px;
}

.rest div:last-child {
    margin-bottom: 0;
}

.rest div:last-child p i {
    font-size: 11px;
    color: #808080;
}

.rest div:nth-child(2n+1) {
    justify-content: space-between;
}

.rest div:nth-child(2) p {
    margin-left: 20px;
    font-size: 12px;
    color: #989898;
}

.rest h5,
.rest p {
    font-size: 13px;
    font-weight: 400;
    color: #262626;

}
/* 其他信息 */

/* 总价 */
.total {
    padding: 15px;
}

.total div {
    display: flex;
    justify-content: space-between;
    margin-bottom: 30px;
}

.total div:last-child {
    margin-bottom: 0;
}

.total h5,
.total p {
    font-size: 13px;
    font-weight: 400;
    color: #262626;
}

.total div:last-child p {
    color: #cf4444;
}
/* 总价 */
/* 主体内容:滑动查看 */

/* 底部内容:固定定位 */
.pay {
    position: fixed;
    left: 0;
    bottom: 0;
    display: flex;
    justify-content: space-between;
    align-items: center;
    /* 设置了固定定位的盒子会脱标,就不能默认是占满父盒子的宽度 需要自己给设置宽度 */
    width: 100%;
    height: 80px;
    padding: 0 11px;
    /* ps */
    /* background-color: pink; */
    border-top: 1px solid #ededed;
}

.pay .left {
    font-size: 12px;
    color: #1e1e1e;
}

.pay .left i {
    font-size: 20px;
}

.pay .right a {
    display: block;
    width: 90px;
    height: 35px;
    background-image: linear-gradient(90deg, 
		#6fc2aa 5%, 
		#54b196 100%);
    border-radius: 3px;
    font-size: 13px;
    color: #fff;
    text-align: center;
    line-height: 35px;
}
/* 底部内容:固定定位 */

 3.1 主轴方向

使用flex-direction改变元素排列方向

  • 思考:Flex布局模型中,弹性盒子默认沿着哪个方向排列?
    • 水平方向
  • 思考:如何实现内容垂直排列?   (在弹性布局中,垂直排列)

  • 主轴默认是水平方向,侧轴默认是垂直方向
  • 修改主轴方向属性:flex-direction 
属性值作用
row行,水平(默认)
column* 列,垂直
row-reverse行,从右向左
column-reverse列,从下向上

 

 

 4.1 弹性盒子换行

使用flex-wrap实现弹性盒子多行排列效果

  • 思考:默认情况下,多个弹性盒子如何显示?

 

 设置了display:flex;所有弹性盒子一行显示,但是盒子的宽度不再是100px,因为是弹性布局,只要父级设置了display:flex;弹性盒子的尺寸都能随意伸缩

  •  弹性盒子换行显示:flex-wrap: wrap; (给父级设置)

 

  •  调整行对齐方式:align-content(父级)
    • 取值与justify-content基本相同

 

 

案例——小兔鲜儿PC端

文字显示省略号

.orders .goods .txt h5 {
    text-overflow: ellipsis;
    /* 不换行 */
    white-space: nowrap;
    overflow: hidden;
}

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>小兔仙个人中心</title>
    <link rel="shortcut icon" href="./favicon.ico">
    <link rel="stylesheet" href="./css/base.css">
    <link rel="stylesheet" href="./css/normalize.css">
    <link rel="stylesheet" href="./css/index.css">
    <link rel="stylesheet" href="./css/center.css">
</head>

<body>
    <!-- 项部导航 -->
    <div class="xtx_topnav">
        <div class="wrapper">
            <!-- 顶部导航 -->
            <ul class="xtx_navs">
                <li>
                    <a href="./login.html">请先登录</a>
                </li>
                <li>
                    <a href="./register.html">免费注册</a>
                </li>
                <li>
                    <a href="javascript:;">我的订单</a>
                </li>
                <li>
                    <a href="javascript:;">会员中心</a>
                </li>
                <li>
                    <a href="javascript:;">帮助中心</a>
                </li>
                <li>
                    <a href="javascript:;">在线客服</a>
                </li>
                <li>
                    <a href="javascript:;">
                        <i class="mobile sprites"></i> 手机版
                    </a>
                </li>
            </ul>
        </div>
    </div>
    <!-- 头部 -->
    <div class="xtx_header clearfix">
        <div class="wrapper">
            <!-- 网站Logo -->
            <h1 class="xtx_logo"><a href="/">小兔鲜儿</a></h1>
            <!-- 主导航 -->
            <div class="xtx_navs">
                <ul class="clearfix">
                    <li>
                        <a href="javascript:;">首页</a>
                    </li>
                    <li>
                        <a href="javascript:;">生鲜</a>
                    </li>
                    <li>
                        <a href="javascript:;">美食</a>
                    </li>
                    <li>
                        <a href="javascript:;">餐厨</a>
                    </li>
                    <li>
                        <a href="javascript:;">电器</a>
                    </li>
                    <li>
                        <a href="javascript:;">居家</a>
                    </li>
                    <li>
                        <a href="javascript:;">洗护</a>
                    </li>
                    <li>
                        <a href="javascript:;">孕婴</a>
                    </li>
                    <li>
                        <a href="javascript:;">服装</a>
                    </li>
                </ul>
            </div>
            <!-- 站内搜索 -->
            <div class="xtx_search clearfix">
                <!-- 购物车 -->
                <a href="javascript:;" class="xtx_search_cart sprites">
                    <i>2</i>
                </a>
                <!-- 搜索框 -->
                <div class="xtx_search_wrapper">
                    <input type="text" placeholder="搜一搜">
                </div>
            </div>
        </div>
    </div>

    <!-- 内容:待完成 -->
    <div class="xtx_body">
        <div class="wrapper">
            <!-- 侧边栏 -->
            <div class="aside">1</div>
            <!-- 侧边栏 -->

            <!-- 主体内容 -->
            <div class="main">
                <!-- 用户账户概览 -->
                <div class="overview">
                    <div>
                        <a href="#">
                            <img src="./images/vip.png" alt="">
                            <p>会员中心</p>
                        </a>
                        <a href="#">
                            <img src="./images/vip.png" alt="">
                            <p>会员中心</p>
                        </a>
                        <a href="#">
                            <img src="./images/address.png" alt="">
                            <p>会员中心</p>
                        </a>
                    </div>
                    <div>
                        <a href="#">
                            <span>6</span>
                            <p>优惠券</p>
                        </a>
                        <a href="#">
                            <span>6</span>
                            <p>优惠券</p>
                        </a>
                        <a href="#">
                            <span>6</span>
                            <p>优惠券</p>
                        </a>
                    </div>
                </div>
                <!-- 用户账户概览 -->

                <!-- 订单 -->
                <div class="orders pannel">
                    <div class="pannel_title">
                        <h4>我的订单</h4>
                        <a href="#">查看全部></a>
                    </div>
                    <div class="content">
                        <ul>
                            <li>
                                <div class="goods">
                                    <div class="pic">
                                        <a href="#"><img src="./uploads/order_goods_1.jpg" alt=""></a>
                                    </div>
                                    <div class="txt">
                                        <h5>拉夫劳伦t恤男正品圆领短袖...</h5>
                                        <p>颜色:白色 尺码:M 数量:1</p>
                                    </div>
                                </div>
                                <div class="status">待付款</div>
                                <div class="pay common">
                                    <p>¥99.00</p>
                                    <p>(含运费:¥10.00元)</p>
                                    <p>在线支付</p>
                                </div>
                                <div class="action common">
                                    <a href="#">立即付款</a>
                                    <a href="#">查看详情</a>
                                    <a href="#">取消订单</a>
                                </div>
                            </li>
                            <li>2</li>

                        </ul>
                    </div>
                </div>
                <!-- 订单 -->
            </div>
            <!-- 主体内容 -->
        </div>
    </div>
    <!-- 内容 -->


    <!-- 公共底部 -->
    <div class="xtx_footer">
        <div class="wrapper">
            <!-- 联系我们 -->
            <div class="contact clearfix">
                <dl>
                    <dt>客户服务</dt>
                    <dd class="chat">在线客服</dd>
                    <dd class="feedback">问题反馈</dd>
                </dl>
                <dl>
                    <dt>关注我们</dt>
                    <dd class="weixin">公众号</dd>
                    <dd class="weibo">微博</dd>
                </dl>
                <dl>
                    <dt>下载APP</dt>
                    <dd class="qrcode">
                        <img src="./uploads/qrcode.jpg">
                    </dd>
                    <dd class="download">
                        <span>扫描二维码</span>
                        <span>立马下载APP</span>
                        <a href="javascript:;">下载页面</a>
                    </dd>
                </dl>
                <dl>
                    <dt>服务热线</dt>
                    <dd class="hotline">
                        400-0000-000
                        <small>周一至周日 8:00-18:00</small>
                    </dd>
                </dl>
            </div>
        </div>
        <!-- 其它 -->
        <div class="extra">
            <div class="wrapper">
                <!-- 口号 -->
                <div class="slogan">
                    <a href="javascript:;" class="price">价格亲民</a>
                    <a href="javascript:;" class="express">物流快捷</a>
                    <a href="javascript:;" class="quality">品质新鲜</a>
                </div>
                <!-- 版权信息 -->
                <div class="copyright">
                    <p>
                        <a href="javascript:;">关于我们</a>
                        <a href="javascript:;">帮助中心</a>
                        <a href="javascript:;">售后服务</a>
                        <a href="javascript:;">配送与验收</a>
                        <a href="javascript:;">商务合作</a>
                        <a href="javascript:;">搜索推荐</a>
                        <a href="javascript:;">友情链接</a>
                    </p>
                    <p>CopyRight &copy; 小兔鲜儿</p>
                </div>
            </div>
        </div>
    </div>
</body>

</html>
.xtx_body {
    padding: 30px 0 85px;
    background-color: #f6f6f6;
}

.xtx_body .wrapper {
    display: flex;
}

/* 侧边栏 */
.aside {
    width: 227px;
    min-height: 500px;
    margin-right: 18px;
    /* ps */
    background-color: pink;
}
/* 侧边栏 */

/* 主体内容 */
.xtx_body .main {
    flex: 1;
    min-height: 500px;
    /* ps */
    /* background-color: skyblue; */
}

/* 账户信息概览 */
 .overview {
    display: flex;
    height: 132px;
    padding: 20px 0;
    margin-bottom: 18px;
    background-color: #fff;
}

.overview div {
    display: flex;
    flex: 1;
    justify-content: space-evenly;
    text-align: center;
}

.overview div img {
    width: 25px;
    margin-bottom: 10px;
}

.overview div a:last-child img {
    width: 18px;
}

.overview div span {
    font-size: 25px;
    color: #e05e30;
}

.overview div p {
    font-size: 16px;
}

.overview div:first-child {
    border-right: 1px solid #f4f4f4;
}
/* 账户信息概览 */

/* 公共样式 */
.pannel {
    padding: 20px 30px;
    margin-bottom: 20px;
    background-color: #fff;
}

.orders .pannel_title {
    display: flex;
    justify-content: space-between;
    height: 45px;
    border-bottom: 1px solid #f4f4f4;
}

.orders .pannel_title h4 {
    font-size: 22px;
    font-weight: 400;
    color: #333;
}

.orders .pannel_title a {
    margin-top: 8px;
    font-size: 16px;
    color: #999;
}

.orders .content {
    margin-top: -1px;
}

.orders .content li {
    display: flex;
    height: 137px;
    margin-bottom: 21px;
    border: 1px solid #f4f4f4;
}

.orders .content li:last-child {
    margin-bottom: 0;
}

.orders .content .goods {
    display: flex;
    flex: 1;
    margin-right: 120px;
    padding: 17px 0 14px 12px;
    align-items: center;
}

.orders .goods .pic {
    width: 107px;
    height: 107px;
    
}

.orders .goods .txt {
    flex: 1;
    /* 溢出的时候显示省略号 */
    /* 因为弹性盒子的尺寸可以被内容撑开,不换行的文字可以撑开这个盒子的尺寸 */
    /* 也可以是这行文字加上省略号的宽度 */
    width: 0;
}

.orders .goods .txt h5 {
    text-overflow: ellipsis;
    /* 不换行 */
    white-space: nowrap;
    overflow: hidden;
}

.orders .content .status {
    width: 120px;
    margin-top: 50px;
    font-size: 14px;
    color: #e05e30;
}

.orders .content .pay {
    width: 200px;
    border-left: 1px solid #e8e8e8;
    border-right: 1px solid #e8e8e8;
}

.orders .content .pay p:first-child {
    font-size: 14px;
    color: #9a2e1f;
}

.orders .content .action {
    width: 180px;
}

.orders .content .action a:first-child {
    width: 100px;
    height: 30px;
    margin-bottom: 8px;
    background-color: #5eb69c;
    font-size: 14px;
    color: #fff;
    line-height: 30px;
    text-align: center;
}

.orders .content .common {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
}
/* 公共样式 */
/* 主体内容 */
举报

相关推荐

0 条评论