【flex布局快速上手】快速理解flex布局用法,通过常见的四个布局案例解释【详细注释,一看就会】

news/2024/5/19 18:43:42 标签: html, 前端, css, flex, vue

前言

很多小伙伴做项目布局的时候还是会用老方法,定位,margin,浮动等,这样虽然也可以完成项目布局,但是还是有点繁琐了,但是看了网上的帖子,flex布局用的其实没有特别熟悉。
我也看了很多帖子,但是基本都是把阮一峰的帖子复制出来发的,或者类似的,只有熟悉的文档功能介绍,但是没有其他案例配合,有时候看的不是很理解。
这里呢,我就通过四个小案例,来主要解释一下我们常用的几个flex属性,熟悉了这一些,基本就够用了,并能够立即上手写。

效果图

像这样,四个小案例,并在代码内附上详细注释解释做法,看完了你就一定会使用了。
在这里插入图片描述

flex_10">flex属性介绍

如果需要配合图片看详细的,可以去阮一峰的flex教程看
链接在这:阮一峰flex教程

【X轴:justify-content】
常用:
justify-content: center; /* 居中排列 /
justify-content: start; /
从左开始排列 /
justify-content: end; /
从右开始排列 /
justify-content: space-between; /
左边和右边的元素靠边,然后中间的自动分配
justify-content: space-around; /均匀排列每个元素,平分

【Y轴:align-items】
常用:
flex-start:交叉轴的起点对齐。
flex-end:交叉轴的终点对齐。
center:交叉轴的中点对齐。
baseline: 项目的第一行文字的基线对齐。
stretch(默认值):如果项目未设置高度或设为auto,将占满整个容器的高度。

【方向:flex-direction】
常用:
row(默认值):主轴为水平方向,起点在左端。
row-reverse:主轴为水平方向,起点在右端。
column:主轴为垂直方向,起点在上沿。
column-reverse:主轴为垂直方向,起点在下沿。

【换行:flex-wrap】
常用:
nowrap:不换行
wrap:换行
wrap-reverse:换行,但是第一行在下面

【方向换行集合:flex-flow】
flex-direction属性和flex-wrap属性的简写形式
格式:默认值为row nowrap。

【多轴:align-content】
前提条件:设置方向和换行才生效。多行就是多个div
属性:
flex-start:与交叉轴的起点对齐。
flex-end:与交叉轴的终点对齐。
center:与交叉轴的中点对齐。
space-between:与交叉轴两端对齐,轴线之间的间隔平均分布。
space-around:每根轴线两侧的间隔都相等。所以,轴线之间的间隔比轴线与边框的间隔大一倍。
stretch(默认值):轴线占满整个交叉轴。

代码部分

<template>
  <div>
    <p>用户名片布局</p>
    <div class="user">
      <div class="userLeft">
        <img
          src="https://img01.yzcdn.cn/vant/cat.jpeg"
          alt=""
          style="width: 50px; height: 50px; margin-right: 10px"
        />
        <span>用户名</span>
      </div>
      <div class="guanzhu">+ 关注</div>
    </div>
    <p>分类列表布局</p>
    <div class="fenlei">
      <div class="list">
        <img
          src="https://img01.yzcdn.cn/vant/cat.jpeg"
          alt=""
          style="width: 50px; height: 50px"
        />
        <div>模拟分类</div>
      </div>
      <div class="list">
        <img
          src="https://img01.yzcdn.cn/vant/cat.jpeg"
          alt=""
          style="width: 50px; height: 50px"
        />
        <div>模拟分类</div>
      </div>
      <div class="list">
        <img
          src="https://img01.yzcdn.cn/vant/cat.jpeg"
          alt=""
          style="width: 50px; height: 50px"
        />
        <div>模拟分类</div>
      </div>
      <div class="list">
        <img
          src="https://img01.yzcdn.cn/vant/cat.jpeg"
          alt=""
          style="width: 50px; height: 50px"
        />
        <div>模拟分类</div>
      </div>
    </div>
    <p>搜索框布局</p>
    <div class="search">
      <input
        type="text"
        style="height: 30px; width: 70%"
        placeholder="搜索框"
      />
      <div style="width: 25px; height: 25px; border: 1px solid #ccc"></div>
      <div style="width: 25px; height: 25px; border: 1px solid #ccc"></div>
    </div>
    <p>信息多一点的用户名片布局</p>
    <div class="userBottom">
      <div class="userBottomLeft">
        <img
          src="https://img01.yzcdn.cn/vant/cat.jpeg"
          alt=""
          style="
            width: 80px;
            height: 80px;
            border-radius: 50%;
          "
        />
      </div>
      <div class="userBottomCenter">
        <div style="font-size: 18px; font-weight: bold">某某某著名工作室</div>
        <div style="font-size: 14px;">研发部 技术总监</div>
        <div style="font-size: 14px;">江苏某某某有限公司</div>
      </div>
      <div class="guanzhu2">+ 关注</div>
    </div>
  </div>
</template>

<script>
export default {};
</script>

<style scoped>
p {
  font-size: 14px;
  background-color: #ccc;
}
/* 用户名片布局 */
/*
 理解:通过给父盒子加display:flex让他变成弹性盒子,然后给父盒子加两个轴的排列方式。
 其中justify-content代表X轴,也就是横向排列方式,space-between代表左右元素贴边,中间如果有元素就自动分配剩余位置
 align-items代表Y轴,也就是竖向排列方法,center就是居中。所以我们只需要用这个属性就可以让盒子内的元素直接垂直居中了。
 这里有很重要的一点要记住,不熟悉flex的人总容易理解错,这个flex盒子内的两个轴属性只作用于子级盒子。不作用于更下面的元素。
 简单说,就是我这里user盒子的flex属性。只作用于userLeft和关注这两个直接子级的盒子,他们里面的图片文字等都是不生效的。
 因为很多不熟悉的人在父盒子写了这个属性以为是里面所有级别的元素都会生效,并不是,只会影响到子级。那么如果你想要子级内的元素也居中或者其他排列方法怎么做呢
 很简单,给你的子级盒子再加一个display:flex,然后设置align-items或者justify-content属性来排列就可以了。参考我userLeft写法
*/
.user {
  display: flex;
  justify-content: space-between;
  align-items: center;
}
.userLeft {
  display: flex;
  align-items: center;
}
.guanzhu {
  width: 70px;
  height: 25px;
  border: 1px solid #ccc;
  text-align: center;
  line-height: 25px;
  font-size: 14px;
  border-radius: 10px;
  background-color: orange;
  color: #fff;
  font-weight: bold;
}

/* 分类列表布局 */
/* 
理解:这里首先我还是给父盒子来了一个横向排列方式,因为是分类列表,所以四个模块应该是平分空间的,而不是两边贴边,中间很大的。
space-around就代表了平分空间的意思。
同时,这时候会发现你的子级排列好了,但是子级内的图片和文字并没有对齐。都是左靠齐的。这样不好看,通过上面的案例大家知道了,父盒子上的flex属性只能作用于直接子级。
所以我们需要在图片和文字的父盒子上再来一个flex属性,这里注意点是,display:flex是默认会横向排列的,但是这里我们需要竖着显示,所以我们要用到flex-direction属性
这个属性的意思就是弹性盒子的布局方向,row代表横着排列,column代表竖着排列。我们竖着排列后通过align-items让竖着的元素居中对齐,就达到了图片和文字都居中的效果。
*/
.fenlei {
  display: flex;
  justify-content: space-around;
}
.list {
  display: flex;
  flex-direction: column;
  align-items: center;
}

/* 搜索布局 */
/* 
功能简介:这种情况是有时候移动端会出现的,顶部有一个搜索框,搜索框的右边还会放两个图片或者图标按钮,点击会出现比如最新消息,联系客服,设置等按钮,所以这时候用这个flex布局也可以轻松的布局出来
理解:这里因为父盒子内的元素都是直接子级,所以直接在父盒子上排列就搞定了,很简单。
这种方法通过space-around让元素平分空间,然后这时候我们再把搜索框宽度调成百分比的,这样就可以让他们成为自适应的效果。
align-items: center;让元素垂直居中。
*/
.search {
  display: flex;
  justify-content: space-around;
  align-items: center;
}

/* 信息多的名片布局 */
/* 
理解:这里首先父盒子用space-around让三个子盒子平分空间,然后中间写很多字的盒子设置flex,因为设置了flex默认横向排列,所以通过flex-direction: column属性我们给他方向改为竖向
然后通过justify-content: space-around属性把三行文字平分空间,就完成了布局。

这里重点解释一下:
可能到这里有些朋友没搞懂,明明前面说了justify-content是X轴的排列,为什么我竖着的应该是Y轴,但是却用justify-content来平分呢。不是align-items才是管Y轴的吗。
这里大家可以理解为,当你方向改变成竖向的后,其实是整个盒子都转了一下,而轴也跟着转了,可以理解为,原本横着是X轴,竖着是Y轴,但是你把盒子转了一下,那横着的其实是Y轴,竖着的才是X轴。
所以能明白为什么我方向是竖着的,但是用的确实X轴的属性了吗。
*/
.userBottom {
  display: flex;
  justify-content: space-around;
}
.userBottomCenter {
  display: flex;
  flex-direction: column;
  justify-content: space-around;
}
.guanzhu2 {
  width: 60px;
  height: 20px;
  border: 1px solid #ccc;
  text-align: center;
  line-height: 20px;
  font-size: 14px;
  border-radius: 10px;
  background-color: orange;
  color: #fff;
  font-weight: bold;
  margin-top: 5px;
}
</style>

flex_248">2022-8-2 更新:flex翻转和对齐方式

利用翻转和对齐方式完成微信聊天样式

效果图
在这里插入图片描述

代码部分

html

    <div class="content_box" :style="{ height: contentHeight }">
      <div class="timer">2022-08-02 11:08:07</div>
      <div class="userbox2">
        <div class="nameInfo2">
          <div style="font-size: 14px">查水表</div>
          <div class="contentText2">123456789123456789123456789123456789</div>
        </div>
        <div class="imgPosition">
          <van-image
            round
            width="50px"
            height="50px"
            src="https://img01.yzcdn.cn/vant/cat.jpeg"
          />
        </div>
      </div>
      <div class="userbox">
        <div class="nameInfo">
          <div style="font-size: 14px">查水表</div>
          <div class="contentText">123456789123456789123456789123456789</div>
        </div>
        <div class="imgPosition">
          <van-image
            round
            width="50px"
            height="50px"
            src="https://img01.yzcdn.cn/vant/cat.jpeg"
          />
        </div>
      </div>
    </div>

CSS

/* 发送的信息样式 */
/* 
右边消息思路解释:首先大盒子userbox内放两个盒子,一个放头像,一个放用户名和发送的内容,我们先用flex让他横向排列。
然后把写文字的大盒子设置flex:1。这个属性的意思就是让这个元素撑满父盒子剩余位置。然后我们再把文字盒子设置flex,并把他对齐方式设置为尾部对齐就完成了基本的结构,然后微调一下就可以了
*/
.userbox {
  width: 100%;
  display: flex;
  margin-bottom: 15px;
}
.nameInfo {
  /* 用flex:1把盒子撑开 */
  flex: 1;
  margin-right: 10px;
  /* 用align-items把元素靠右对齐 */
  display: flex;
  flex-direction: column;
  align-items: flex-end;
}
.contentText {
  background-color: #9eea6a;
  /* 把内容部分改为行内块元素,因为盒子flex:1把盒子撑大了,所以用行内块元素让内容宽度不根据父盒子来 */
  display: inline-block;
  /* 这四句是圆角 */
  border-top-left-radius: 10px;
  border-top-right-radius: 0px;
  border-bottom-right-radius: 10px;
  border-bottom-left-radius: 10px;
  /* 最大宽度限定内容输入到百分61换行 */
  max-width: 61%;
  padding: 5px 10px;
  /* 忽略多余的空白,只保留一个空白 */
  white-space: normal;
  /* 换行显示全部字符 */
  word-break: break-all;
  margin-top: 3px;
  font-size: 14px;
}


/* 接收的信息样式 */
/* 
左边消息思路解释:跟上面一样,就是换一下位置,首先通过把最外层大盒子的排列方式通过flex-direction: row-reverse;属性翻转,也就是头像和文字盒子换位置
然后删除掉尾部对齐方式,因为不写这个默认是左对齐的。我们写的左边就没必要再写了。
*/
.userbox2 {
  width: 100%;
  display: flex;
  flex-direction: row-reverse;
  margin-bottom: 15px;
}
.nameInfo2 {
  /* 用flex:1把盒子撑开 */
  flex: 1;
  margin-left: 10px;
}
.contentText2 {
  background-color: #9eea6a;
  /* 把内容部分改为行内块元素,因为盒子flex:1把盒子撑大了,所以用行内块元素让内容宽度不根据父盒子来 */
  display: inline-block;
  /* 这四句是圆角 */
  border-top-left-radius: 0px;
  border-top-right-radius: 10px;
  border-bottom-right-radius: 10px;
  border-bottom-left-radius: 10px;
  /* 最大宽度限定内容输入到百分61换行 */
  max-width: 61%;
  padding: 5px 10px;
  /* 忽略多余的空白,只保留一个空白 */
  white-space: normal;
  /* 换行显示全部字符 */
  word-break: break-all;
  margin-top: 3px;
  font-size: 14px;
}

http://www.niftyadmin.cn/n/490466.html

相关文章

【vue弹框和div拖拽功能】vue-elementul弹框拖拽功能,移动拖拽功能,普通div拖拽功能【拿来即用,直接复制】

前言 这里是通过vue的指令封装好的 直接创建一个js文件复制进去&#xff0c;引入一下就搞定了&#xff0c;非常简单 html版本引入vue语法的div和弹框拖拽功能 这里是考虑到有时候会在html页面开发的时候也会用到这个拖拽等功能。 就在这里又写了一个版本的。 是html页面引入…

【移动端聊天功能模板】Vue实现H5聊天系统,实现上下固定中间滚动布局,微信授权功能,自动滚动到底部【详细注释,一看就会】

前言 最近刚好在做这方面的功能&#xff0c;就网上看了下&#xff0c;发现很多种写法&#xff0c;但是有些写的很乱&#xff0c; 我也看的很麻烦&#xff0c;干脆就自己写一个简单的静态版本放在这&#xff0c; 以后需要用到的时候可以直接拿着改改就能用。 后面我还会继续更新…

【影院选座功能模板】vue实现选座功能,点击切换图片,获取座位信息

前言 最近突然看到这个功能了&#xff0c;就想着研究一下如何写&#xff0c; 然后在网上看了一些帖子&#xff0c;总结了一下&#xff0c; 这里套用了一个别人的数据结构&#xff0c;这个感觉毕竟好用。 然后写一个简单的模板放在这&#xff0c;以后可能会再这个基础上修改或者…

【input输入框回车生成标签】vue简单实现input输入框内输入后回车创建一个标签功能【详细注释版本】

前言 这个功能很多地方会用到&#xff0c;比如我们的csdn发文章发问题就用到了这个功能。 一个输入框内输入你想要的标签&#xff0c;然后回车就会创建出来一个标签 &#xff0c;这个标签也是在这个输入框的里面的。 我网上看了下&#xff0c;这种功能帖子没看到几个&#xff…

【PC端聊天功能模板】vue-elementul简单实现电脑端客服聊天功能,pc端聊天系统静态页面布局,配套websocket方案和心跳重连机制【详细注释,拿来即用】

前言 这里是给大家写了一个简单的模板来使用&#xff0c;可以直接复制了调调就能用。因为这个聊天也是很容易出现的功能&#xff0c;所以我写一个模板静态页面放在这&#xff0c;以后需要这个功能的时候可以不用布局了&#xff0c;直接复制改改。 我的代码里面有详细的注释&…

【websocket功能】vue简单实现websocket链接模板,建立websocket心跳重连机制【包含node.js后台代码,可以自己测试websocket】

前言 目前很多项目需要用到websocket功能 简单的讲解一下这个功能。 简单来说就是&#xff0c;以往我们发请求只能前台给后台发 但是如果我们遇到比如类似聊天一样的功能&#xff0c;别人发信息给我。 我们就处理起来很麻烦&#xff0c;当然也有办法&#xff0c;就是我们前端设…

【html转pdf】html页面导出为pdf文件,纯html版本,简单实现pdf转换【html2canvas+jspdf】

前言 最近遇到的需求&#xff0c;把html转成pdf文件下载导出。 目前网上看了下&#xff0c;有三种方法&#xff0c;但是其中两种需要后端配合 一种是纯前端实现的&#xff0c;比较简单。所以就使用了这种。 也就是html2canvas jspdf 的这种方法 这种方法实现的思路就是&#…

windows10强制删除文件_可能是最后一次机会,2 种方法免费升级到 Windows 10

根据微软公布的信息&#xff0c;十年前发布的 Windows 7 将于 2020年 1月14 日正式结束「扩展支持」&#xff0c;而与之相对的「主流支持」也在 2015 年 1 月 13 日就已经结束。相比此前 Windows XP 的生命周期&#xff0c;Windows 7 的生命周期并未获得延长&#xff0c;毕竟其…