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

效果图:

 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. 牛客网——剑指offer(跳台阶以及变态跳台阶_java实现)

    首先说一个剪枝的概念: 剪枝出现在递归和类递归程序里,因为递归操作用图来表示就是一棵树,树有很多分叉,如果不作处理,就有很多重复分叉,会降低效率,如果能把这些分叉先行记录下来,就可以大大提升效率——这 ...

  2. Python之路Day08

    文件操作 open() -- 打开 open通过Python控制操作系统打开文件 f=open('文件路径',mode='r',encoding='utf-8') mode -- 不写就默认是r f ...

  3. BZOJ3932 CQOI2015 任务查询系统 - 主席树,离散化

    记录下自己写错的地方吧 1. 区间可能有重复 2. 没有出现的坐标也要计入version (因为询问里可能会有) #include <bits/stdc++.h> using namesp ...

  4. loj6278 数列分块入门题2

    题意:支持区间加,询问区间中元素排名 维护两个域.一个域维护原序列,一个域维护快内排序序列. 每次修改后更新快内排序序列. 修改时O(sqrt(n)log(sqrt(n))) 询问时O(sqrt(n) ...

  5. jfinal 拦截器中判断是否为pjax请求

    个人博客 地址:http://www.wenhaofan.com/article/20180926013919 public class PjaxInterceptor implements Inte ...

  6. 开发过程中遇到的代理Proxy配置问题

    proxy代理问题 在公司不能访问外网的时候,使用IDEA开发.. 需要配置IDEA Proxy Maven Git IDEA开发工具Proxy配置,使用Spring Boot快读构建工具 Maven ...

  7. 2019-08-10 纪中NOIP模拟B组

    T1 [JZOJ1235] 洪水 题目描述 一天, 一个画家在森林里写生,突然爆发了山洪,他需要尽快返回住所中,那里是安全的. 森林的地图由R行C列组成,空白区域用点“.”表示,洪水的区域用“*”表示 ...

  8. Ubuntu 安装交叉编译器出错问题

    安装教程网上有很多,可参考:Ubuntu14.04(64位)下gcc-linaro-arm-linux-gnueabihf交叉编译环境搭建 但是我的问题一直是路径搭好了,就是找不到文件:反复查找,花了 ...

  9. Windwos查看本地局域网内所有的ip方法

    Windows平台ping测试局域网所有在用IP .打开cmd命令窗口 .输入命令:,,) DO ping -w -n .%i //这个是自己局域网的ip地址前三位 查看自己ip信息的命令是ipcon ...

  10. windows下pycharm输入法跟随设置

    参考网址:http://www.itdaan.com/blog/2018/05/20/90e64dae077f8ad7fa70bc9c3c8ab422.html