您是否曾经点击网页上的图像,打开图像的更大版本并导航以查看其他照片?
有些人称之为弹出窗口。其他人称之为灯箱。 Bootstrap 称之为模态。 我提到 Bootstrap 是因为我想用它来做同样的事情。因此,从现在开始,我们称之为模态。
为什么使用 Bootstrap? 你可能会问。好吧,有几个原因
- 我已经在我想使用此效果的网站上使用 Bootstrap 了,因此在加载资源方面没有额外的开销。
- 我想要一些我可以完全轻松控制美观的东西。与我遇到的大多数模态插件相比,Bootstrap 是一个干净的画布。
- 我需要的功能相当简单。从头开始编码一切没有太多好处。我认为使用 Bootstrap 框架节省的时间比任何潜在的缺点更有益。
这是我们将要达到的目标
让我们一步步地进行。
步骤 1:创建图像库网格
让我们从图像网格布局的标记开始。我们可以使用 Bootstrap 的 网格系统 来实现这一点。
<div class="row" id="gallery">
<div class="col-12 col-sm-6 col-lg-3">
<img class="w-100" src="/image-1">
</div>
<div class="col-12 col-sm-6 col-lg-3">
<img class="w-100" src="/image-2">
</div>
<div class="col-12 col-sm-6 col-lg-3">
<img class="w-100" src="/image-3">
</div>
<div class="col-12 col-sm-6 col-lg-3">
<img class="w-100" src="/image-4">
</div>
</div>
现在我们需要 数据属性 来使这些图像具有交互性。Bootstrap 查看数据属性以确定哪些元素应该具有交互性以及它们应该做什么。在这种情况下,我们将创建打开模态组件的交互,并允许使用 轮播组件 滚动浏览图像。
关于这些数据属性
- 我们将添加
data-toggle="modal"
和data-target="#exampleModal"
到父元素(#gallery
) 中。这使得点击画廊中的任何内容都会打开模态。我们还应该将 data-target 值 (#exampleModal
) 添加为模态本身的 ID,但是我们会在到达模态标记时进行操作。 - 让我们为每个图像添加
data-target="#carouselExample"
和一个data-slide-to
属性。我们可以将它们添加到图像包装器中,但我们将在本文中使用图像。稍后,我们将需要使用 data-target 值 (#carouselExample
) 作为轮播的 ID,因此请记住这一点,以便我们到达那里。data-slide-to
的值基于图像的顺序。
以下是我们将它们组合在一起时得到的内容
<div class="row" id="gallery" data-toggle="modal" data-target="#exampleModal">
<div class="col-12 col-sm-6 col-lg-3">
<img class="w-100" src="/image-1.jpg" data-target="#carouselExample" data-slide-to="0">
</div>
<div class="col-12 col-sm-6 col-lg-3">
<img class="w-100" src="/image-2.jpg" data-target="#carouselExample" data-slide-to="1">
</div>
<div class="col-12 col-sm-6 col-lg-3">
<img class="w-100" src="/image-3.jpg" data-target="#carouselExample" data-slide-to="2">
</div>
<div class="col-12 col-sm-6 col-lg-3">
<img class="w-100" src="/image-4.jpg" data-target="#carouselExample" data-slide-to="3">
</div>
</div>
有兴趣了解更多关于数据属性的信息吗?查看 CSS-Tricks 的指南。
步骤 2:使模态起作用
这是一个位于模态内部的轮播,两者都是标准的 Bootstrap 组件。我们只是在这里将它们嵌套在一起。几乎是 Bootstrap 文档 中的直接复制粘贴工作。
以下是一些需要注意的重要部分
- 模态 ID 应该与画廊元素的
data-target
相匹配。 - 轮播 ID 应该与画廊中图像的
data-target
相匹配。 - 轮播幻灯片应该与画廊图像匹配,并且必须按相同的顺序排列。
以下是模态的标记,其中包含我们的属性
<!-- Modal markup: https://bootstrap.ac.cn/docs/4.4/components/modal/ -->
<div class="modal fade" id="exampleModal" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<!-- Carousel markup goes here -->
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
我们可以将轮播标记直接放在那里,就像 Voltron 一样!
<!-- Modal markup: https://bootstrap.ac.cn/docs/4.4/components/modal/ -->
<div class="modal fade" id="exampleModal" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<!-- Carousel markup: https://bootstrap.ac.cn/docs/4.4/components/carousel/ -->
<div id="carouselExample" class="carousel slide" data-ride="carousel">
<div class="carousel-inner">
<div class="carousel-item active">
<img class="d-block w-100" src="/image-1.jpg">
</div>
<div class="carousel-item">
<img class="d-block w-100" src="/image-2.jpg">
</div>
<div class="carousel-item">
<img class="d-block w-100" src="/image-3.jpg">
</div>
<div class="carousel-item">
<img class="d-block w-100" src="/image-4.jpg">
</div>
</div>
<a class="carousel-control-prev" href="#carouselExample" role="button" data-slide="prev">
<span class="carousel-control-prev-icon" aria-hidden="true"></span>
<span class="sr-only">Previous</span>
</a>
<a class="carousel-control-next" href="#carouselExample" role="button" data-slide="next">
<span class="carousel-control-next-icon" aria-hidden="true"></span>
<span class="sr-only">Next</span>
</a>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
看起来有很多代码,对吧?再次强调,它基本上是直接来自 Bootstrap 文档的,只是包含了我们的属性和图像。
步骤 3:处理图像大小
这不是必需的,但如果轮播中的图像具有不同的尺寸,我们可以使用 CSS 对它们进行裁剪以保持一致性。请注意,我们在这里使用 Sass。
// Use Bootstrap breakpoints for consistency.
$bootstrap-sm: 576px;
$bootstrap-md: 768px;
$bootstrap-lg: 992px;
$bootstrap-xl: 1200px;
// Crop thumbnail images.
#gallery {
img {
height: 75vw;
object-fit: cover;
@media (min-width: $bootstrap-sm) {
height: 35vw;
}
@media (min-width: $bootstrap-lg) {
height: 18vw;
}
}
}
// Crop images in the coursel
.carousel-item {
img {
height: 60vw;
object-fit: cover;
@media (min-width: $bootstrap-sm) {
height: 350px;
}
}
}
步骤 4:优化图像
您可能已经注意到,标记在画廊中使用与模态中相同的图像文件。没有必要这样做。实际上,最好在画廊中使用更小、性能更好的图像版本。我们将在模态中将图像放大到其完整尺寸版本,因此无需在前端使用最佳质量。
Bootstrap 方法的好处是,我们可以使用与模态中不同的图像在画廊中。它们并不相互排斥,不需要指向同一个文件。
因此,为此,我建议使用更低质量的图像更新画廊标记
<div class="row" id="gallery" data-toggle="modal" data-target="#exampleModal">
<div class="col-12 col-sm-6 col-lg-3">
<img class="w-100" src="/image-1-small.jpg" data-target="#carouselExample" data-slide-to="0">
<!-- and so on... -->
</div>
就是这样!
我正在使用的网站已经 对 Bootstrap 进行了主题化。这意味着一切都已经按照规范进行了样式化。也就是说,即使您没有对 Bootstrap 进行主题化,您仍然可以轻松添加自定义样式!通过这种方法(Bootstrap 与插件),自定义非常简单,因为您可以完全控制标记,并且 Bootstrap 的样式相对稀疏。
以下是最终的演示
这是一个非常不错的教程,但结果在我的 Pixel 2XL 显示屏上似乎坏了。卡片工作正常,但结果标签上的轮播不工作,我只看到图像垂直显示。
嘿,Damian,感谢您阅读。在小屏幕上,初始照片网格是一列。如果您点击其中一张图像,它将打开轮播。在大屏幕上,照片网格根据屏幕大小有两列或四列。以下是一个简短的演示视频,展示了它的工作原理:https://www.loom.com/share/eb637f33edc84b0c9644b93c8b78f221
您在您这边看到不同的情况吗?
您是对的,Diego,是我的错。我不知道为什么我没有点击图像来切换模态 ♂️。做得很好,谢谢您!
不用谢!很高兴它能正常工作。
非常感谢您。
我的轮播显示在页面底部,如何才能隐藏它,直到有人点击图像?
嗨,Joy。您是否在轮播或其容器中添加了模态类和数据属性?
Diego,您能为此制作一个视频教程吗?我无法使其正常工作。我是一个编码新手。
嗨,Alex,我很乐意帮助您。您能解释一下您遇到的问题,或者您需要澄清什么吗?
感谢您,Diego,但我无法使其正常工作。
我所做的
1. 使用图像库网格和模态化妆创建了 HTML 文件
唯一的改变是图片位置的使用(使用本地系统中的图片)
我已经有 bootstrap ref 了
(
)
复制了 scss 文件,并使用 sass 将其转换为 css 文件(没有改变)
js 文件被添加到 body 标签后的 HTML 中
问题
我无法点击图片
我做错了什么?
谢谢
嗨,Deji:
尝试在页面(或新页面)上添加一个简单的模态组件。只需一个打开演示模态的按钮即可。这将有助于你隔离问题。如果这不起作用,你的网站上可能存在 Bootstrap 问题。如果它可以正常工作,你可以逐步添加模态库的各个部分,以查看它何时停止工作。例如,将按钮更改为图像,然后添加多个图像,然后添加轮播等。祝你好运!
嗨,我在 foreach 循环中使用了一个网格,但每次我点击图像打开模态时,它都打开了第一个项目而不是我点击的项目。你知道是什么导致了这个问题吗?
嗨,Andy,听起来你可能缺少一些数据属性。每个网格项目都需要有一个
data-target
和data-slide-to
属性。data-target
值应该是轮播的id
(对所有网格项目都一样),data-slide-to
值应该是对应轮播幻灯片的索引(每个网格项目唯一),从 0 开始。查看步骤 1 中的代码片段以获取示例。希望这有帮助。Diego 干得好,在我的页面上工作得很好,我只想知道是否有一种方法可以默认显示自定义样式,而无需按钮
感谢 George,很高兴它对你有用。你可以根据自己的喜好设计组件。按钮只是为了演示,用来显示默认样式和自定义样式示例之间的差异。
如果你想使用演示中的自定义样式,你可以简单地从 CSS 中的第 53 行和第 67 行删除
.custom
。非常感谢你提供本教程。我有一个问题,每当我点击 1 到 3 张图片时,它都会显示每张图片的正确图片,但超过这个数量就不起作用了。例如,如果我点击 #1,它会显示 #1,但如果我点击 #4,它会显示我最后打开的图片。你能帮我吗?
嗨 zizi,你可能需要检查画廊图片上的
data-slide-to
属性。每个图像都应该将其设置为轮播中的相应幻灯片,从第一个图像的 0 开始。所以对于图像 #1,它将是0
,对于图像 #4,它将是3
。