【问题标题】:Responsive changes in ngx-bootstrap carousalngx-bootstrap 轮播中的响应式更改
【发布时间】:2020-03-19 18:07:16
【问题描述】:

在 ngx-bootstrap 轮播中使网站响应时,我正在学习角度和面临的问题。是否可以在 ngx-bootstrap 轮播中进行响应式更改?

在主视图中,每个视图显示 3 张图像,而我只想在移动视图中显示 1 张图像。 在这里我分享我的代码。

testimonials.component.html 中的代码

<carousel [itemsPerSlide]="itemsPerSlide" [singleSlideOffset]="singleSlideOffset" [interval]="false" [noWrap]="noWrap">
    <slide>
        <img src="../../../assets/images/user1.png">
    </slide>
    <slide>
        <img src="../../../assets/images/user1.png">
    </slide>
    <slide>
        <img src="../../../assets/images/user1.png">
    </slide>
    <slide>
        <img src="../../../assets/images/user1.png">
    </slide>
    <slide>
        <img src="../../../assets/images/user1.png">
    </slide>
    <slide>
        <img src="../../../assets/images/user1.png">
    </slide>
</carousel>


testimonials.component.ts 文件中的代码

import { Component, OnInit } from '@angular/core';

@Component({
    selector: 'app-testimonials',
    templateUrl: './testimonials.component.html',
    styleUrls: ['./testimonials.component.scss']
})
export class TestimonialsComponent implements OnInit {
    itemsPerSlide = 3;
    singleSlideOffset = false;
    noWrap = false;
    slidesChangeMessage = '';
    constructor() { }

    ngOnInit(): void {
    }
}

【问题讨论】:

  • 所以,在移动设备中您只想显示一张图片,这根本就没有轮播?在桌面上,您想要一个轮播滑动 3 张图像,而在移动设备上只有一个?或者我错过了什么?
  • No in carousal 我想在移动视图中显示一张图像。
  • 但是轮播应该一次只显示一个图像,然后滑动到新的图像。您当前的问题是显示多个图像?无论我在哪里可以看到您的问题,您都可以创建一个 codepen/jsfiddle 吗?或者添加截图?谢谢!
  • 我正在使用此链接valor-software.com/ngx-bootstrap/#/carousel 中的“Multilist Start From Index”滑块。在这里您可以看到可以在任何轮播中添加多个图像。这也是 stackBitz 演示链接:stackblitz.com/run
  • 现在知道了,谢谢!会看看;)

标签: html angular bootstrap-4 carousel ngx-bootstrap


【解决方案1】:

在调查了一段时间后,我想出了一个我认为适合您的解决方案。

您需要考虑的是它不会监听屏幕宽度的变化

这意味着,itemsPerSlide 的值是在 ngInit 方法上设置的,并且永远不会再次更新(因为您的问题不需要它)。当您使用 480px 以下的设备加载页面时,它会在滑块上显示一个图像,如果它更大,它会显示 3 个。

您可以更改断点以更改私有属性mobileBreakpoint 上的值。

让我们看看您的示例是什么样子的:

import { Component, OnInit } from '@angular/core';

@Component({
    selector: 'app-testimonials',
    templateUrl: './testimonials.component.html',
    styleUrls: ['./testimonials.component.scss']
})
export class TestimonialsComponent implements OnInit {
    itemsPerSlide = 3;
    singleSlideOffset = false;
    noWrap = false;
    slidesChangeMessage = '';

    private innerWidth: number;
    private mobileBreakpoint = 480;

    constructor() { }

    ngOnInit(): void {
      this.adjustsItemsPerSlide();
    }

  private adjustsItemsPerSlide() {
    this.innerWidth = window.innerWidth;
    if (this.innerWidth < this.mobileBreakpoint) {
      this.itemsPerSlide = 1;
    } else {
      this.itemsPerSlide = 3;
    }
  }
}
  • private innerWidth: number; 保存当前视口宽度。用于决定将使用哪个数量的itemsPerSlide
  • private mobileBreakpoint = 480; 保存断点,此时我们将使用 3 或 1 张幻灯片。
  • private adjustsItemsPerSlide:此方法将读取当前视口宽度并在 this.itemsPerSlide 上应用不同的值。

我还创建了一个 example on stackblitz 来显示所需的效果。

PS:如果你使用的是universal,这将不起作用,你需要直接在组件中注入一个windowsService而不是使用windows对象(这是本机浏览器windows对象,而不是角度服务)。

希望这会有所帮助:)

【讨论】:

  • 嘿!谢谢。这很好用。但是我们可以应用相同的代码来调整窗口大小吗?
  • 嗨回来@HardiShah,我只花了几个小时调试这个问题,在审查了实现之后:github.com/valor-software/ngx-bootstrap/blob/development/src/…我找不到让这个对宽度变化做出反应的方法。我可以在窗口调整大小时添加一个 observable,但没有公共 API 允许我更改 itemsPerSlide 的数量。这需要在他们的仓库中解决,并且必须添加一个功能。考虑到这一点,我无法让它响应窗口调整大小。这对你原来的问题也没有:)你怎么看?够好吗?
  • 我还在他们的仓库中创建了一个问题,看看我们是否可以在那里解决这个问题。 github.com/valor-software/ngx-bootstrap/issues/5723这里最大的问题是他们的大多数api都是私有的,不可访问:)
  • 欢迎您,但是您取消了赏金吗?如果是这样,为什么?我认为这对我不公平,因为我一直在积极解决您的问题以帮助并获得赏金!
  • 不,我没有取消赏金。我猜你获得了赏金。如果有人花一些时间帮助我,我为什么要取消赏金?
猜你喜欢
  • 2021-01-09
  • 1970-01-01
  • 2017-09-18
  • 1970-01-01
  • 2013-09-18
  • 2018-11-20
  • 2013-09-12
  • 1970-01-01
  • 2017-12-23
相关资源
最近更新 更多