应无所住,而生其心
排名
1
文章
860
粉丝
112
评论
163
net core webapi post传递参数
庸人 : 确实坑哈,我也是下班好了好几次,发现后台传递对象是可以的,但...
百度编辑器自定义模板
庸人 : 我建议换个编辑器,因为现在百度富文本已经停止维护了,用tinymec...
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

flex实现一行显示n个数量的布局,不同屏幕宽度下显示不同的数量,自适应一行显示的个数

4605人阅读 2021/8/15 18:02 总访问:5182809 评论:0 收藏:0 手机
分类: 前端

要实现的效果如下:

其实原理也非常简单,父元素主要是

主要就是设置一个flex布局,然后flex-wrap设置为需要换行

  1. .app-container {
  2. display: flex;
  3. flex-wrap: wrap;
  4. }

子元素主要就是设置一个宽度

子元素主要就是设置一个宽度,比如要一行显示5个就是20%,一行显示8个就是100/8=12.5%,以此类推就行了。至于其他margin-top,高度这些就是辅助样式而已。

  1. .shcoolItem {
  2. width: 20%;
  3. margin-top: 10px;
  4. margin-bottom: 20px;
  5. height: 100px;
  6. background: #ffabcd;
  7. }

html结构这种:

  1. <div class="app-container">
  2. <div class="shcoolItem"></div>
  3. <div class="shcoolItem"></div>
  4. <div class="shcoolItem"></div>
  5. </div>

但是目前这种方式虽然每个子元素可以均分宽度了,一行显示完就换行,但是每块之间就没有一点间距

如果颜色设置成一样我们都看不出来,看到的就是一块,所以我们可以把每块设置一个不一样的颜色来测试

  1. <div class="app-container">
  2. <div class="shcoolItem "></div>
  3. <div class="shcoolItem shcoolItemColor2"></div>
  4. <div class="shcoolItem shcoolItemColor3"></div>
  5. <div class="shcoolItem "></div>
  6. <div class="shcoolItem shcoolItemColor2"></div>
  7. <div class="shcoolItem shcoolItemColor3"></div>
  8. </div>
  9. <style >
  10. .app-container {
  11. display: flex;
  12. flex-wrap: wrap;
  13. }
  14. .shcoolItem {
  15. width: 20%;
  16. height: 100px;
  17. background: #ffabcd;
  18. }
  19. .shcoolItemColor2{
  20. background: #abcdff;
  21. }
  22. .shcoolItemColor3{
  23. background: #00cc66;
  24. }
  25. </style>

效果如下,可以看到是没有间距的:

如何设置间距宽度呢

如果直接设置margin这种间距就会影响每行的显示了,因为我们使用了固定的宽度了,比如固定了宽度20%,设置了margin的话,每个子元素在占20%每行就显示不了5个了,我们就不好去控制它了,那么我们就不改子元素,我们直接去给子元素里边在加子元素,我们把样式设置到子元素里边的元素就行了撒。

html结构变成了这样:
子级里边在加了子级

  1. <div class="container">
  2. <div class="app-container">
  3. <div class="shcoolItem">
  4. <div class="shcoolItemWaper"></div>
  5. </div>
  6. <div class="shcoolItem">
  7. <div class="shcoolItemWaper"></div>
  8. </div>
  9. <div class="shcoolItem">
  10. <div class="shcoolItemWaper"></div>
  11. </div>
  12. </div>
  13. </div>

我们在子元素里边的子级去设置一个margin-left,就会有间距了

  1. .shcoolItemWaper {
  2. /* 要设置这种间距要设置到flex子元素的里边的元素,不能直接设置到flex子元素里边,
  3. 因为如果子元素算上了间距,就不能控制均分了 */
  4. margin-left: 20px;
  5. background: #ffabcd;
  6. height: 100px;
  7. }

效果如下:

可以看到我们左边好想并没有对齐,因为我们给每个子元素都设置了margin-left,所以就没有对齐,要对齐也非常简单在容器那边设置一个-20px就行了

  1. .app-container {
  2. display: flex;
  3. flex-wrap: wrap;
  4. margin-left: -20px;
  5. }


这里我们利用flex子元素里边的子元素来控制了间距,其实每个flex的子元素的宽度还是20%,每个flex子元素还是紧紧的挨到一起的,我们只是利用了flex的子元素里边元素的margin值来实现的,这样就不会影响每个flex元素的宽度,这样就比较好控制每行显示的个数了

如果一行不是显示固定的个数,宽度不写死,针对不同的屏幕下在去写宽度就行了

利用@media去在不同分辨率下设置宽度就行了

整体的代码如下(这里可以直接复制出来看效果)

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>Document</title>
  7. </head>
  8. <body>
  9. <div class="container">
  10. <div class="app-container">
  11. <div class="shcoolItem">
  12. <div class="shcoolItemWaper"></div>
  13. </div>
  14. <div class="shcoolItem">
  15. <div class="shcoolItemWaper"></div>
  16. </div>
  17. <div class="shcoolItem">
  18. <div class="shcoolItemWaper"></div>
  19. </div>
  20. <div class="shcoolItem">
  21. <div class="shcoolItemWaper"></div>
  22. </div>
  23. <div class="shcoolItem">
  24. <div class="shcoolItemWaper"></div>
  25. </div>
  26. <div class="shcoolItem">
  27. <div class="shcoolItemWaper"></div>
  28. </div>
  29. <div class="shcoolItem">
  30. <div class="shcoolItemWaper"></div>
  31. </div>
  32. <div class="shcoolItem">
  33. <div class="shcoolItemWaper"></div>
  34. </div>
  35. <div class="shcoolItem">
  36. <div class="shcoolItemWaper"></div>
  37. </div>
  38. </div>
  39. </div>
  40. </body>
  41. </html>
  42. <style>
  43. body {
  44. padding: 0;
  45. margin: 0;
  46. }
  47. .container {
  48. width: 700px;
  49. margin: 20px auto;
  50. border: 2px solid #acbdff;
  51. }
  52. .app-container {
  53. display: flex;
  54. flex-wrap: wrap;
  55. margin-left: -20px;
  56. }
  57. .shcoolItem {
  58. /* 如果一行不是显示固定的个数,这里宽度不写死,针对不同的屏幕下在去写宽度就行了 */
  59. /* width: 20%; */
  60. margin-top: 10px;
  61. margin-bottom: 20px;
  62. height: 100px;
  63. }
  64. .shcoolItemWaper {
  65. /* 要设置这种间距要设置到flex子元素的里边的元素,不能直接设置到flex子元素里边,
  66. 因为如果子元素算上了间距,就不能控制均分了 */
  67. margin-left: 20px;
  68. background: #ffabcd;
  69. height: 100px;
  70. }
  71. /* 小屏下一行显示5个 */
  72. @media screen and (min-width:100px) {
  73. .shcoolItem {
  74. width: 20%;
  75. }
  76. }
  77. /* 中屏一行显示6个 写到下面会覆盖掉上面的样式 */
  78. @media screen and (min-width:1430px) {
  79. .shcoolItem {
  80. width: 16.66%;
  81. }
  82. }
  83. /* 大屏一行显示7个。写到下面会覆盖掉上面的样式 */
  84. @media screen and (min-width:1799px) {
  85. .shcoolItem {
  86. width: 14.2857%;
  87. }
  88. }
  89. /* 超大屏一行显示8个。写到下面会覆盖掉上面的样式 */
  90. @media screen and (min-width:1899px) {
  91. .shcoolItem {
  92. width: 12.5%;
  93. }
  94. }
  95. </style>

小屏下一行显示5个:

随便改一下宽度,默认一下大一点的分辨率一行显示6个的效果:

最开始贴的效果图,vue中的写法

最开始贴的效果图是在vue中的实现的,其实样式写法也是一样的,只是里边flex子元素里边的元素信息多一点,包含图片,描述等,贴一下大致代码

  1. <template>
  2. <lab-nav class="course-resources">
  3. <div class="course-box">
  4. <div v-for="(item, index) in courseData" :key="index" class="course-box-item" @click="goCourseDetails(item)">
  5. <div class="course-box-item-waper">
  6. <div class="img-waper">
  7. <img :src="'/oss/api/ImageViewer/' + item.pic + '.jpg?percent=0.6&quality=80&od=true'">
  8. </div>
  9. <div class="title courseName">{{ item.courseName }}</div>
  10. <div class="process-bar">
  11. <el-progress :stroke-width="10" :percentage="Number((item.process * 100).toFixed(2))" />
  12. </div>
  13. </div>
  14. </div>
  15. </div>
  16. </lab-nav>
  17. </template>
  18. <script>
  19. import LabNav from './components/Nav/nav.vue'
  20. import subsys_lab from '../../services/subsys_lab.js'
  21. export default {
  22. components: {
  23. LabNav
  24. },
  25. data() {
  26. return {
  27. loadCourseParam: {
  28. PageIndex: 1,
  29. PageSize: 10000,
  30. KeyWord: '',
  31. mjdid: this.$route.params.type
  32. },
  33. courseData: []
  34. }
  35. },
  36. watch: {
  37. '$route': 'loadCourseData'
  38. },
  39. mounted() {
  40. this.loadCourseData()
  41. },
  42. methods: {
  43. }
  44. }
  45. </script>
  46. <style scoped="scoped" lang="scss">
  47. .course-resources {
  48. .course-box {
  49. display: flex;
  50. flex-wrap: wrap;
  51. margin-left: -20px;
  52. .course-box-item {
  53. // 宽度不写死,针对不同的屏幕下在去写宽度
  54. //width: 20%;
  55. min-width: 160px;
  56. .course-box-item-waper:hover {
  57. box-shadow: 0px 0px 8px 0px #d3d3d3;
  58. cursor: pointer;
  59. // 图片手指上去放大
  60. img {
  61. object-fit: cover;
  62. -webkit-transition: all .2s;
  63. transition: all .2s;
  64. -webkit-transform: scale(1.4);
  65. transform: scale(1.4);
  66. }
  67. }
  68. .course-box-item-waper {
  69. background-color: #fff;
  70. padding-bottom: 10px;
  71. margin-left: 20px;
  72. margin-bottom: 20px;
  73. .img-waper {
  74. overflow: hidden;
  75. }
  76. img {
  77. width: 100%;
  78. height: 160px;
  79. height: auto;
  80. }
  81. .title {
  82. font-size: 13px;
  83. font-family: Microsoft YaHei;
  84. font-weight: 400;
  85. color: #393939;
  86. padding: 5px;
  87. }
  88. .process-bar {
  89. padding: 5px;
  90. }
  91. }
  92. }
  93. // 小屏下一行显示5个
  94. @media screen and (min-width:100px) {
  95. .course-box-item {
  96. width: 20%;
  97. }
  98. }
  99. // 中屏一行显示6个 写到下面会覆盖掉上面的样式
  100. @media screen and (min-width:1430px) {
  101. .course-box-item {
  102. width: 16.66%;
  103. }
  104. }
  105. // 大屏一行显示7个。写到下面会覆盖掉上面的样式
  106. @media screen and (min-width:1799px) {
  107. .course-box-item {
  108. width: 14.2857%;
  109. }
  110. }
  111. // 超大屏一行显示8个。写到下面会覆盖掉上面的样式
  112. @media screen and (min-width:1899px) {
  113. .course-box-item {
  114. width: 12.5%;
  115. }
  116. }
  117. }
  118. // 下面的文字宽度超过了出现省略号
  119. .courseName {
  120. overflow: hidden;
  121. text-overflow: ellipsis;
  122. white-space: nowrap;
  123. }
  124. }
  125. </style>

备注,一行固定显示几个等更简单的写法

上面的实现方法只是一种实现方法而已,在很多情况下其实可以有更简单的实现,比如如果一行固定显示4个这种,布局就直接写两级就行了,不用子元素里边在去增加元素来控制。贴一下其他flex布局的应用技巧。

如果只有一行的显示的话参考这个,写法比较简洁

flex 实现等宽布局且间隔相等的小技巧
https://www.tnblog.net/aojiancc/article/details/7975

如果一行固定显示4个这种,布局就直接写两级就行了

参考这个里边的:flex 实现每行4个,自适应排列
https://tnblog.net/aojiancc2/article/details/7904

flex布局一行显示多个。flex布局固定显示n个,自适应布局

https://www.tnblog.net/aojiancc6/article/details/8094


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价

css弹性盒子<font color='#ff5555'>flex</font>布局

css弹性盒子由于版本不同浏览器问题造成了一些不同的写法display:flexbox;在google浏览器中如果使用下面的写法就不行displa...

<font color='#ff5555'>flex</font>布局常见问题

flex布局中内容div自适应高度&lt;divclass=&quot;content&quot;&gt; &lt;divclass=&quot;text-center&quot;style=&quot;...

<font color='#ff5555'>flex</font>好看的相册

先让大家看看效果图吧:需要引入外来插件:https://cdnjs.cloudflare.com/ajax/libs/magnific-popup.js/1.1.0/jquery.magni...

一点<font color='#ff5555'>flex</font>布局的运用

水平分割:html:&lt;divclass=&quot;flex-container&quot;&gt; &lt;divclass=&quot;flex-item&quot;&gt;flexitem1&lt;/div...

css div水平居 。文字垂直居中 。<font color='#ff5555'>flex</font>的方式实现div的垂直与水平居中。布局模板

DIV等元素水平居中定宽度+margin:top auto可以让一个块级别元素在外层居中例如这样:效果:可以看到这个div已经居中了但是...

uni-app 基础view<font color='#ff5555'>flex</font>布局使用

代码如下: &lt;template&gt; &lt;view &gt; &lt;view style=&quot;display: flex;flex-direction:row-reve...

<font color='#ff5555'>flex</font>布局多行自适应间隔

//父盒子,设置为: .templateItem { width: 100%; text-align: center; display: flex; align-content: fl...

css实现左边div固定宽度右边div自适应撑满剩下的宽度。左边定宽左边固定右边自适应。<font color='#ff5555'>flex</font> 占剩下的宽度

这是一道面试题,你有多少种办法呢?这里我们假设左边名为 left,宽度为 200 px,右边名为 right。即默认 .left { widt...

<font color='#ff5555'>flex</font>子元素靠右。<font color='#ff5555'>flex</font>让某个子元素靠右或靠左显示

以下以块元素的Flex布局为示例:只需要两句代码,轻松搞定! 代码1:在父元素里面加入以下代码:(父盒子加了display: fle...

<font color='#ff5555'>flex</font>平分宽度。<font color='#ff5555'>flex</font>宽度自适应均分宽度

html: &lt;div class=&quot;parent&quot;&gt; &lt;div class=&quot;item&quot;&gt; 测试1 &lt;/div&g...

vue布局模板前端布局模板<font color='#ff5555'>flex</font>布局应用

设计图效果: 代码: &lt;!-- 学习活跃度 --&gt; &lt;template&gt; &lt;div class=&quot;learnActivityContainer&q...

<font color='#ff5555'>flex</font>布局一行显示多个。<font color='#ff5555'>flex</font>布局固定显示n自适应布局

在前端开发的时候,对页面布局的时候,经常遇到固定的一行显示多个,这个经常遇到,所以我想做个记录,等到下次遇到的时候...

<font color='#ff5555'>flex</font> <font color='#ff5555'>flex</font>-gorw不等分的问题

flex flex-gorw不等分的问题今天在练习flex 栅格布局的时候, 明明设置了项目元素都是flex-gorw:1;但是发现有个地方 ,因为...