Bootstrap 5 - 在不同断点显示不同响应式图片

3
我正在使用Bootstrap 5。我想使用img标签在移动设备/平板电脑/桌面上显示不同的图片。我尝试了以下代码,但是我无法正确设置包装器div的断点,使用Bootstrap框架的display实用工具。
如果可能的话,我想要三个图像标签,而不是三个不同的占据窗口高度100%的div。
如果您查看代码,我有一种模态来在背景图像的顶部显示,需要适合每个断点的所有可用屏幕空间。我已经尝试了img-fluid w-100 h-100类,但结果并不理想,我无法裁剪背景。我正在使用Vue进行前端开发,但我不是前端开发人员。
谢谢。
<template>
  <div class="container-fluid p-0">
    <div class="row m-0">
<!-- This div with the image needs to be displayed only on mobile sm breakpoint -->
      <div class="col-lg-12 d-md-none d-lg-none d-sm-block p-0">
        <img class="img-fluid w-100" src="@/assets/sm-background.png">   
      </div>
<!-- This div with the image needs to be displayed only on tablet md breakpoint -->
      <div class="col-lg-12 d-none d-sm-none d-lg-none d-md-block p-0">
        <img class="img-fluid w-100" src="@/assets/md-background.png">   
      </div>
<!-- This div with the image needs to be displayed only on desktop lg breakpoint -->
      <div class="col-lg-12 d-none d-sm-none d-md-none d-lg-block p-0">
        <img class="img-fluid w-100" src="@/assets/lg-background.png">   
      </div>

      <div class="col-sm-12 col-md-6 col-lg-6 mx-auto position-absolute" id="checkModal">
        <div class="card">
          <div class="card-body">
            <h4>Age verification required</h4>
            <p>...</p>
            
            <input type="date" class="form-control" v-model="birthDate" >
            
            <input type="passwrd" class="form-control" v-model="passwor" >

            <button class="btn btn-primary" @click.prevent="unlockContent()">Conferma</button>

          </div>
        </div>
      </div>

    </div>
  </div>
</template>

<script>

export default {
  name: 'App',
  data() {
    return {
      birthDate: '',
      password: ''
    }
  },
  mounted() {

  },
  methods: {
    unlockContent() {
      console.log(this.birthDate, this.password);
    }
  }
}
</script>

<style>
/* #app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
} */
#checkModal {
  top: 14%;
  left: 0;
  right: 0;
  z-index: 1;
}
</style>

´``
1个回答

10

注意:第1节回答了原问题(d-*用法),但不建议在图片上使用该方法,因为浏览器可能会预加载隐藏的图片。然而,d-*类仍然可用于按断点显示其他元素。


1. d-*

Bootstrap 类是移动优先的,因此我们不需要定义每个断点。无论我们在较小的断点上定义了什么,都会级联到较大的断点,直到被覆盖。

因此,假设 OP 的设备定义,我们可以使用这些 display 类:

设备 屏幕尺寸
手机 可见于 md 以下 d-md-none
平板电脑 仅可见于 md d-none d-md-block d-lg-none
台式电脑 隐藏于 lg 以下 d-none d-lg-block

<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">

<!-- visible below md -->
<img class="d-md-none img-fluid w-100" alt="mobile alt text" src="https://via.placeholder.com/600x50/8da0cb/000000?text=600x50+for+breakpoint+%3C=+sm">
<!-- visible only on md -->
<img class="d-none d-md-block d-lg-none img-fluid w-100" alt="tablet alt text" src="https://via.placeholder.com/900x75/fc8d62/000000?text=900x75+for+breakpoint+==+md">
<!-- hidden below lg -->
<img class="d-none d-lg-block img-fluid w-100" alt="desktop alt text" src="https://via.placeholder.com/1200x100/66c2a5/000000?text=1200x100+for+breakpoint+%3E=+lg">

隐藏元素的扩展速查表:

SCREEN SIZE            CLASSES
---------------------------------------------------
hidden on all          d-none
hidden only on xs      d-none d-sm-block
hidden only on sm      d-sm-none d-md-block
hidden only on md      d-md-none d-lg-block
hidden only on lg      d-lg-none d-xl-block
hidden only on xl      d-xl-none d-xxl-block
hidden only on xxl     d-xxl-none
hidden below sm        d-none d-sm-block
hidden below md        d-none d-md-block
hidden below lg        d-none d-lg-block
hidden below xl        d-none d-xl-block
hidden below xxl       d-none d-xxl-block
---------------------------------------------------
visible on all         d-block
visible only on xs     d-block d-sm-none
visible only on sm     d-none d-sm-block d-md-none
visible only on md     d-none d-md-block d-lg-none
visible only on lg     d-none d-lg-block d-xl-none
visible only on xl     d-none d-xl-block d-xxl-none
visible only on xxl    d-none d-xxl-block
visible below sm       d-sm-none
visible below md       d-md-none
visible below lg       d-lg-none
visible below xl       d-xl-none
visible below xxl      d-xxl-none

2. <picture>元素(推荐用于图片)

随着时间的推移和浏览器的不同,预加载隐藏图像的浏览器行为一直不一致(链接1),并且跨浏览器也不同。由于加载隐藏图像会影响页面加载时间,因此建议避免使用d-none方法来处理图像

断点图片的最佳实践(又称“艺术方向”):

  1. 使用 <picture> 与多个 <source> 标签,并根据 media 字符串进行条件设置。

  2. 由于 CSS 类在 media 字符串中无效,因此使用 Bootstrap 的断点像素

    BREAKPOINT DIMENSIONS
    sm ≥576px
    md ≥768px
    lg ≥992px
    xl ≥1200px
    xxl ≥1400px

<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">

<picture>
  <!-- show this up to sm -->
  <source media="(max-width: 596px)" srcset="https://via.placeholder.com/600x50/8da0cb/000000?text=600x50+for+breakpoint+%3C=+sm">
  <!-- else show this up to md -->
  <source media="(max-width: 768px)" srcset="https://via.placeholder.com/900x75/fc8d62/000000?text=900x75+for+breakpoint+==+md">
  <!-- else show this -->
  <img class="img-fluid w-100" alt="alt text for all sources" src="https://via.placeholder.com/1200x100/66c2a5/000000?text=1200x100+for+breakpoint+%3E=+lg">
</picture>


1
在这篇MDN文章中讨论了显示响应式图片的推荐方法:响应式图片(具体阅读“艺术方向”主题)。 - user1575941
1
@Vino,我只是有三张不同尺寸的图片,适合这个断点。我不是设计师,所以我在寻找一个快速的CSS技巧来整理这些东西 ;) - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接