如何在不换行到下一行的情况下实现具有水平间距的 Tailwind 网格?
How to implement Tailwind grids with horizontal spacing without wrapping to the next line?
我有一个包含以下内容的部分:
<section class="flex flex-wrap -mx-2">
<Card
v-for="(course, index) in courses"
:key="index"
:title="course.title"
:professor="course.professor"
:price="course.price"
:excerpt="course.excerpt"
:image="course.image"
:category="course.category"
/>
</section>
一个 Card
看起来像这样:
<article class="bg-red mt-5 px-2 w-full md:w-1/2 lg:w-1/3 xl:w-1/3 shadow-md rounded bg-white">
<nuxt-link to="/courses/example-course">
<img :src="`/images/${image}`" :alt="title" class="rounded-t w-full">
</nuxt-link>
<div class="p-4">
<header class="flex justify-between">
<section>
<h3 class="text-gray-700">
<nuxt-link to="/courses/example-course" class="hover:text-gray-600" v-text="title"></nuxt-link>
</h3>
<p class="text-gray-600 mt-1" v-text="professor"></p>
</section>
<div v-if="price">
<span class="px-2 py-1 bg-green-200 text-green-500 font-bold rounded">${{ price }}</span>
</div>
</header>
<article class="text-gray-700 mt-2" v-text="excerpt"></article>
</div>
<footer class="border-t border-gray-300 uppercase p-5 flex justify-between">
<span class="text-gray-600 text-xs font-bold self-center" v-text="category"></span>
<a href="#" class="text-gray-600 hover:text-blue-600">
<i v-if="price" class="fa fa-user"></i>
</a>
</footer>
</article>
所有这一切的结果如下所示:
如您所见,卡片相互接触,尽管我遵循 Tailwind's docs say 的网格间距。我曾尝试在 <article>
标签上添加 ml-2
,但这只会导致过早包装元素并遗漏太多 space.
我做错了什么以及如何在卡片之间添加间隙?谢谢!
带边距的 "problem" 是它位于元素框(模型)的外部,例如它会影响卡的总宽度。例如在大屏幕上你希望它们有 33.33% 的宽度,但是如果你在 left/right 上添加边距,卡片的宽度将是 33.33% + margin
这使得 flexbox 容器在两个项目之后换行,否则总宽度将超过 100%。您可以通过 a) 将事物设置为 box-sizing: border-box
(对 margin tough 没有帮助!)和 b)使用 padding
而不是 margin 来创建间隙来解决这个问题,这通常需要某种包装你的内容除了处理间距和大小之外什么都不做,像这样:
<article class="mt-5 px-2 w-full md:w-1/2 lg:w-1/3 xl:w-1/3">
<div class="card bg-red shadow-md rounded bg-white">
<nuxt-link to="/courses/example-course">
<img :src="`/images/${image}`" :alt="title" class="rounded-t w-full">
</nuxt-link>
<div class="p-4">
<header class="flex justify-between">
<section>
<h3 class="text-gray-700">
<nuxt-link to="/courses/example-course" class="hover:text-gray-600" v-text="title"></nuxt-link>
</h3>
<p class="text-gray-600 mt-1" v-text="professor"></p>
</section>
<div v-if="price">
<span class="px-2 py-1 bg-green-200 text-green-500 font-bold rounded">${{ price }}</span>
</div>
</header>
<article class="text-gray-700 mt-2" v-text="excerpt"></article>
</div>
<footer class="border-t border-gray-300 uppercase p-5 flex justify-between">
<span class="text-gray-600 text-xs font-bold self-center" v-text="category"></span>
<a href="#" class="text-gray-600 hover:text-blue-600">
<i v-if="price" class="fa fa-user"></i>
</a>
</footer>
</div>
</article>
我知道把标记弄得乱七八糟有点烦人,但这通常是值得的 =)。
编辑:实际上正如文档所说
Add a negative horizontal margin like -mx-2 to your column container and an equal horizontal padding like px-2 to each column to add gutters.
你的问题是 box-shadow 不会让你造成视觉差距,所以从技术上讲你需要包装,因为你的 box-shadow!
我有一个包含以下内容的部分:
<section class="flex flex-wrap -mx-2">
<Card
v-for="(course, index) in courses"
:key="index"
:title="course.title"
:professor="course.professor"
:price="course.price"
:excerpt="course.excerpt"
:image="course.image"
:category="course.category"
/>
</section>
一个 Card
看起来像这样:
<article class="bg-red mt-5 px-2 w-full md:w-1/2 lg:w-1/3 xl:w-1/3 shadow-md rounded bg-white">
<nuxt-link to="/courses/example-course">
<img :src="`/images/${image}`" :alt="title" class="rounded-t w-full">
</nuxt-link>
<div class="p-4">
<header class="flex justify-between">
<section>
<h3 class="text-gray-700">
<nuxt-link to="/courses/example-course" class="hover:text-gray-600" v-text="title"></nuxt-link>
</h3>
<p class="text-gray-600 mt-1" v-text="professor"></p>
</section>
<div v-if="price">
<span class="px-2 py-1 bg-green-200 text-green-500 font-bold rounded">${{ price }}</span>
</div>
</header>
<article class="text-gray-700 mt-2" v-text="excerpt"></article>
</div>
<footer class="border-t border-gray-300 uppercase p-5 flex justify-between">
<span class="text-gray-600 text-xs font-bold self-center" v-text="category"></span>
<a href="#" class="text-gray-600 hover:text-blue-600">
<i v-if="price" class="fa fa-user"></i>
</a>
</footer>
</article>
所有这一切的结果如下所示:
如您所见,卡片相互接触,尽管我遵循 Tailwind's docs say 的网格间距。我曾尝试在 <article>
标签上添加 ml-2
,但这只会导致过早包装元素并遗漏太多 space.
我做错了什么以及如何在卡片之间添加间隙?谢谢!
带边距的 "problem" 是它位于元素框(模型)的外部,例如它会影响卡的总宽度。例如在大屏幕上你希望它们有 33.33% 的宽度,但是如果你在 left/right 上添加边距,卡片的宽度将是 33.33% + margin
这使得 flexbox 容器在两个项目之后换行,否则总宽度将超过 100%。您可以通过 a) 将事物设置为 box-sizing: border-box
(对 margin tough 没有帮助!)和 b)使用 padding
而不是 margin 来创建间隙来解决这个问题,这通常需要某种包装你的内容除了处理间距和大小之外什么都不做,像这样:
<article class="mt-5 px-2 w-full md:w-1/2 lg:w-1/3 xl:w-1/3">
<div class="card bg-red shadow-md rounded bg-white">
<nuxt-link to="/courses/example-course">
<img :src="`/images/${image}`" :alt="title" class="rounded-t w-full">
</nuxt-link>
<div class="p-4">
<header class="flex justify-between">
<section>
<h3 class="text-gray-700">
<nuxt-link to="/courses/example-course" class="hover:text-gray-600" v-text="title"></nuxt-link>
</h3>
<p class="text-gray-600 mt-1" v-text="professor"></p>
</section>
<div v-if="price">
<span class="px-2 py-1 bg-green-200 text-green-500 font-bold rounded">${{ price }}</span>
</div>
</header>
<article class="text-gray-700 mt-2" v-text="excerpt"></article>
</div>
<footer class="border-t border-gray-300 uppercase p-5 flex justify-between">
<span class="text-gray-600 text-xs font-bold self-center" v-text="category"></span>
<a href="#" class="text-gray-600 hover:text-blue-600">
<i v-if="price" class="fa fa-user"></i>
</a>
</footer>
</div>
</article>
我知道把标记弄得乱七八糟有点烦人,但这通常是值得的 =)。
编辑:实际上正如文档所说
Add a negative horizontal margin like -mx-2 to your column container and an equal horizontal padding like px-2 to each column to add gutters.
你的问题是 box-shadow 不会让你造成视觉差距,所以从技术上讲你需要包装,因为你的 box-shadow!