以下例子基于分四栏+栏间有间距的例子分析

效果图:

 html代码: 

<div class="buy-one-buy">
<h3>淘一淘</h3>
<ul>
<li><img src="../img/homePage/rotation-1.jpg" alt="First buy"></li>
<li><img src="../img/homePage/rotation-1.jpg" alt="Second buy"></li>
<li><img src="../img/homePage/rotation-2.jpg" alt="Third buy"></li>
<li><img src="../img/homePage/rotation-3.jpg" alt="Four slide"></li>
</ul>
</div>

1.最简单粗暴的方式就是通过固定值+margin去计算

  • 首先我先固定了最外层的宽度为1200px;(这里为1202px宽度是因为我加了一个红边框方便观察,最后页面显示的时候要记得把border去掉并且宽度改为1200px)

    .buy-one-buy{
    width: 1202px;
    border: 1px solid red;
    margin: 0 auto;
    }
  • 之后我将每个li的宽度固定为288px(四个li即为1152px,剩下还有1200px-1152px=48px作为四栏中的间距(四栏共有三个间距,则48px/3=16px)。因此我给每个li设置margin-right为16px,当然最后一个li中的amrgin-right要设置为0。)   注意:因为li是块元素,我首先先把它转换为行内块元素再进行操作。所以先在ul中清除掉行内块的默认间距(font-size:0)。
    .buy-one-buy ul{
    font-size:;
    }
    .buy-one-buy li{
    display: inline-block;
    width: 288px;
    height: 140px;
    margin-right: 16px;
    }
    .buy-one-buy li:last-child{
    margin-right:;
    }
  • 最后就能实现上图中的分栏效果了

2.使用第一种方法会使得页面维护起来很麻烦,每次宽度都要去计算。所以后来,我使用float+margin+百分比实现一样的效果,之后维护只需要修改相应的百分比即可

  • 首先依旧固定住最外层的宽度

    .buy-one-buy{
    width: 1202px;/*之后要改回去1200*/
    border: 1px solid red;
    margin: 0 auto;
    }
  • 之后在li中使用float让他们位于同一行,给每个li的宽度设置为22%(原本应为父元素的1/4,即25%。但是需要留剩下的百分比给间距)。然后100%-22%*4=12%(即为三个间距的总宽度,每个间距宽度为4%);
    .buy-one-buy li{
    float: left;
    width: 22%;
    margin-right: 4%;
    height: 180px;
    }
    .buy-one-buy li:last-child{
    margin-right: 0%;
    }
    .buy-one-buy img{
    width: 100%;
    height: 100%;
    }
  • 最后也能实现一样的效果(但在实际上也可以将float变成display:inline-block;但是需要消除默认间距。也一样能实现)

3.上诉两种方式如果页面一直固定为四栏的话,是可行的。但是如果维护的时候需要变成三栏五栏之类的就会需要修改一系列的css数据,并且平分的时候还不一定是整数。所以,最后我决定采用flex布局+css3去实现

  • 依旧固定住最外层的宽度

    .buy-one-buy{
    width: 1202px;/*之后要改回去1200*/
    border: 1px solid red;
    margin: 0 auto;
    }
  • 然后在ul中(li列表的父元素)使用flex布局(这里自定义了一个属性n:为你需要分栏的数字,之后的li根据这个属性去动态计算宽度)
    .buy-one-buy ul{
    display: flex;
    justify-content: space-between;/*两端对齐,项目之间的间隔都相等*/
    --n :;/*css自定义属性(--*),用var(--*)使用自定义属性*/
    }
  • 将每个li设置宽度和高度(其中不需要将li转换成行内块元素,因为flex布局默认flex-direction属性的主轴方向为水平方向)(这里使用了css3中的calc函数)
    .buy-one-buy li{
    width: calc(calc((100/var(--n))*1%) - 20px);
    height: 100px;
    }
    .buy-one-buy img{
    width: 100%;
    height: 100%;
    }
  • 最后,就能成功实现上述效果了!而且修改成不同的栏还十分方便!
  • flex布局教程:https://www.runoob.com/w3cnote/flex-grammar.html

注意: css3中定义原生变量var浏览器兼容性不太好,如图:

多种方式实现平均分栏布局(有间距)div平分行宽的更多相关文章

  1. 前端一面/面试常考题1-页面布局:假设高度已知,请写出三栏布局,其中左栏、右栏宽度各为300px,中间自适应。

    题目:假设高度已知,请写出三栏布局,其中左栏.右栏宽度各为300px,中间自适应. [题外话:日常宣读我的目标===想要成为一名优雅的程序媛] 一.分析 1. 题目真的像我们想得这么简单吗? 其实不然 ...

  2. CSS 实现:两栏布局(一边固定,一边自适应)

    ☊[实现要求]:CSS实现左边固定,右边自适应父容器宽度的两栏布局. <body> <div class="left"></div> <d ...

  3. CSS实现三栏布局(5种)

    常见的布局方式: float布局.Position定位.table布局.弹性(flex)布局.网格(grid)布局 那么我们就是用以上5种方式完成三栏布局,不过前提是左右宽度(假如左右宽度为300px ...

  4. css中,在高度已知,写出三栏布局,其中左栏、右栏宽度各位300px,中间自适应

    解决方案主要有五种 首先写入全局样式 <style type="text/css"> html * { margin: ; padding: ; } .layout { ...

  5. 假设高度已知,请写出三栏布局,其中左栏、右栏各为300px,中间自适应的五种方法

    假设高度已知,请写出三栏布局,其中左栏.右栏各为300px,中间自适应的五种方法 HTML CSS 页面布局 题目:假设高度已知,请写出三栏布局,其中左栏.右栏各为300px,中间自适应 <!D ...

  6. css篇-页面布局-三栏布局

    页面布局 题目:假设高度已知,请写出三栏布局,其中左栏.右栏宽度各为300px,中间自适应. 1)浮动 2)绝对定位 3)Flexbox 4)表格布局 5)网格布局(CSS3的Grid布局) 代码: ...

  7. 如何用CSS实现左侧宽度固定,右侧自适应(两栏布局)?左右固定中间自适应(三栏布局)呢?

    在前端日常布局中,会经常遇到左侧宽度固定,右侧自适应或者左右两边固定,中间部分自适应的实用场景.本文例子中将列举出两种常用的两栏布局,左侧固定右侧自适应的常用方法以及代码和五种左右固定中间自适应的常用 ...

  8. css 实现三栏布局的四种方式

    三栏布局就是左中右,左右两边固定,中间自适应. 1. 绝对定位 <div class="left">左边</div> <div class=" ...

  9. CSS布局 - 三栏布局

    CSS布局技术可谓是前端技术中最基础的技术,就是因为基础,所以我认为要更加熟练,深入的去掌握,去梳理. 一. 传统 ---> 浮动实现的三栏布局 采用浮动实现的三栏布局有以下特点及注意事项: · ...

随机推荐

  1. php7 安装redis拓展

    配置之前应该是环境已经搭好了,phpinfo的页面可以加载出来.   使用git clone下载git上的phpredis扩展包 git clone  https://github.com/phpre ...

  2. 【安卓开发】Webview简单使用

    什么是WebView? 答:Android内置webkit内核的高性能浏览器,而WebView则是在这个基础上进行封装后的一个 控件,WebView直译网页视图,我们可以简单的看作一个可以嵌套到界面上 ...

  3. 利用Master库spt_values表 连续数字

    SELECT CONVERT ( ), dateadd(d, number, GETDATE()), ) AS every_time FROM master..spt_values n WHERE n ...

  4. 一步步教你如何在Ubuntu虚拟机中安装QEMU并模拟模拟arm 开发环境(一)uImage u-boot(转)

    初次接触qemu是因为工作的需要,有时候下了班,可能需要在家研究一些东西,因为博主用到arm环境,这时候博主比较小气,不愿花钱买开发板,当然博主在这里给大家的建议是,如果要真正学懂arm构架的相关知识 ...

  5. navicat异常 - 1130-host ... is not allowed to connect to this MySql server

    错误描述 用navicat连接数据库报错:1130-host ... is not allowed to connect to this MySql server如何处理 解决方案 1.连接服务器: ...

  6. 安装python3.7.4时报错:Service Pack 1 is required to continue installation

    python3.7.4安装失败:Service Pack 1 is required to continue installation 解决办法: 点击报错页面中的“log file”,日志最后一行显 ...

  7. vue组件插槽与编译作用域

    <!DOCTYPE html> <html> <head> <title></title> </head> <script ...

  8. C3P0连接技术

    1.导入jar包(两个) c3p0-0.9.5.2.jar和mchange-commons-java-0.2.12.jar导入数据库驱动jar包 2.定义配置文件 配置文件名称:c3p0.proper ...

  9. DES加密算法 转

    1.什么是对称密码算法 网络安全通信中要用到两类密码算法,一类是对称密码算法,另一类是非对称密码算法.对称密码算法有时又叫传统密码算法.秘密密钥算法或单密钥算法,非对称密码算法也叫公开密钥密码算法或双 ...

  10. python3爬虫(4)各种网站视频下载方法

    python3爬虫(4)各种网站视频下载方法原创H-KING 最后发布于2019-01-09 11:06:23 阅读数 13608 收藏展开理论上来讲只要是网上(浏览器)能看到图片,音频,视频,都能够 ...