淘先锋技术网

首页 1 2 3 4 5 6 7

我试图在一行中嵌入3个项目。每个项目都必须有一点空间。问题是当我增加保证金时 第三项将包装。我已经尝试添加负边距 但这不起作用。

我用我的问题做了一个例子,例子是使用tailwindcss:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <link href="https://unpkg.com/tailwindcss@^1.0/dist/tailwind.min.css" rel="stylesheet">

  <title>JS Bin</title>
</head>
<body>
<div class="flex flex-wrap -m-2">
  <div class="bg-red-500 w-1/3 p-4 m-2">
    test
  </div>  
  
   <div class="bg-red-500 w-1/3 p-4 m-2">
    test
  </div> 
  
   <div class="bg-red-500 w-1/3 p-4 m-2">
    test
  </div> 
</div>
</body>
</html>

你的问题是,你的div是其父宽度的1/3,但当你在那里添加边距时,总宽度超过100%。与作为元素宽度一部分的填充不同,边距是元素宽度的补充。

所以这里有两种可能的解决方案。第一种方法是将宽度设置为父宽度的1/ 3减去所需的边距。由于您在示例中使用了m-2,根据Tailwind的数据,m-2似乎为0.5雷姆,因此我们将该数字加倍,以考虑每个盒子左右两侧的边距,最终得到如下结果:

.flex-wrap > div {
  width: calc(33.333333% - 1rem);
}

<link href="https://unpkg.com/tailwindcss@^1.0/dist/tailwind.min.css" rel="stylesheet">
<div class="flex flex-wrap">
  <div class="bg-red-500 p-4 m-2">
    test
  </div>
  <div class="bg-red-500 p-4 m-2">
    test
  </div>
  <div class="bg-red-500 p-4 m-2">
    test
  </div>
  <div class="bg-red-500 p-4 m-2">
    test
  </div>
  <div class="bg-red-500 p-4 m-2">
    test
  </div>
  <div class="bg-red-500 p-4 m-2">
    test
  </div>
</div>

你需要对你的css做一些小小的修改。 由于父宽度是100%,每个子宽度是33.33%,所以包括边距在内,它不能容纳在一行中。页边距在元素的顶部,因此总宽度大于100%,最后一个元素移动到新行。

因此,我们将在这里使用calc。我们需要有足够的宽度来容纳余量。因此,如果width = calc(33.33% - 20px),这意味着,每个div有20px的空间,可以用来在每边提供10px的边距。为了保持一致性,请确保给定的边距是从33.33%中减去的值的50%。

更新了代码(添加了一个样式标签并相应地修改了css):

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <link href="https://unpkg.com/tailwindcss@^1.0/dist/tailwind.min.css" rel="stylesheet">

  <title>JS Bin</title>
  <style>
    .test {
      width: calc(33.33% - 20px);
      margin: 10px;
    }
  </style>
</head>
<body>
<div class="flex flex-wrap">
  <div class="bg-red-500 test p-4">
    test
  </div>  
  
   <div class="bg-red-500 test p-4">
    test
  </div> 
  
   <div class="bg-red-500 test p-4">
    test
  </div> 
  <div class="bg-red-500 test p-4">
    test
  </div>  
  
   <div class="bg-red-500 test p-4">
    test
  </div> 
  
   <div class="bg-red-500 test p-4">
    test
  </div>
</div>
</body>
</html>

如果你和我一样,不喜欢使用33.33333333% -1rem的想法,可以使用内置的flexbox属性。

只需设置规则flex:1 0 0;如下面的代码片段所示。

最后一个0告诉flexbox忽略每个项目的首字母with,然后1告诉它增长,直到所有项目达到flexbox容器的全部宽度。(第一个0告诉它不要缩小到比它包含的文本更小。)

<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <link href="https://unpkg.com/tailwindcss@^1.0/dist/tailwind.min.css" rel="stylesheet">

  <title>JS Bin</title>
  <style>
    .custom-flexbox-1 > div {
      flex: 1 0 0;
    }
    html {
      overflow: hidden;
    }
  </style>
</head>

<body>
  <div class="flex flex-wrap -m-2 custom-flexbox-1">
    <div class="bg-red-500 w-1/3 p-4 m-2">
      test
    </div>

    <div class="bg-red-500 w-1/3 p-4 m-2">
      test
    </div>

    <div class="bg-red-500 w-1/3 p-4 m-2">
      test
    </div>
  </div>
</body>

</html>

这肯定会与您的链接标签一致:

<div class="flex flex-wrap " style="justify-content: space-evenly;">
    <div class="bg-red-500 p-4 m-2 " style="width: 30%;">
      test
    </div>

    <div class="bg-red-500 p-4 m-2" style="width: 30%;">
      test
    </div>

    <div class="bg-red-500 p-4 m-2" style="width: 30%;">
      test
    </div>
  </div>

检查:https://js fiddle . net/sugandhnikhil/o62p 7 jez/

一种选择是使用透明边框代替空白和背景剪辑,以避免在边框下绘制背景。

.bg-red-500 {
  border: 0.5em transparent solid;
  background-clip: padding-box;/* do not draw me where borders stand */
}

<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <link href="https://unpkg.com/tailwindcss@^1.0/dist/tailwind.min.css" rel="stylesheet">

  <title>JS Bin</title>
</head>

<body>
  <div class="flex flex-wrap m-2">
    <div class="bg-red-500 w-1/3 p-4 ">
      test
    </div>

    <div class="bg-red-500 w-1/3 p-4 ">
      test
    </div>

    <div class="bg-red-500 w-1/3 p-4 ">
      test
    </div>
  </div>
</body>

</html>

我不知道tailwind,但有了vanilla CSS,我可以不用hack calc,只需通过flex:1;对于每个子代,右边距为:not(:最后一个子代)

当然,我也可以很容易地用CSS grid来完成(在项目之间均匀分布)。如果您事先知道只有3列,那么对于grid来说甚至会更容易:

.container {
  height: 100px;
  background: red;
  display: flex;
}
.child {
  background: blue;
  flex: 1;
}
.child:not(:last-child) {
  margin-right: 10px;
}

/* Grid way */
.container-grid {
  height: 100px;
  background: red;
  display: grid;
  grid-auto-flow: column;
  grid-auto-columns: 1fr;
  grid-column-gap: 10px;
}
.child-grid {
  background: blue;
}

/* Even be easier if you know ahead that there're only 3 items */
.container-grid-3 {
  background: red;
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-gap: 10px;
}
.child-grid-3 {
  height: 100px;
  background: blue;
}

<div class="container">
  <div class="child"></div>
  <div class="child"></div>
  <div class="child"></div>
  <div class="child"></div>
</div>

<hr>

<div class="container-grid">
  <div class="child-grid"></div>
  <div class="child-grid"></div>
  <div class="child-grid"></div>
  <div class="child-grid"></div>
</div>

<hr>

<div class="container-grid-3">
  <div class="child-grid-3"></div>
  <div class="child-grid-3"></div>
  <div class="child-grid-3"></div>
  <div class="child-grid-3"></div>
</div>

我认为这更容易实现通过显示网格这与顺风差距

<div class="grid gap-3 grid-cols-2">
    <div>01</div>
    <div>02</div>
</div>

在许多情况下,您可以通过使用依赖断点的flex-wrap / flex-nowrap并只设置& quot差距& quot需要的时候。

比如说。在大屏幕上,你不希望换行,希望元素之间有间隙

你可以用不同的方式组合它,获得你想要的行为。