【问题标题】:Bootstrap carousel refuses to transition smoothly after css adjustmentscss调整后Bootstrap轮播拒绝平滑过渡
【发布时间】:2015-03-07 19:48:46
【问题描述】:

在过去的 3 个小时里,我一直在尝试对 Bootstrap 3 的轮播过渡进行简单的调整。 我试过改变滑动速度,这是唯一似乎有效果的东西:

.carousel-inner .item {
  -webkit-transition-duration: 2s;
  -moz-transition-duration: 2s;
  -o-transition-duration: 2s;
  transition-duration: 2s;
}

但它很快隐藏了“离开”的内容,我不知道要修改什么属性来解决这个问题。

我也尝试过使用

将其更改为淡入淡出过渡
.carousel-fade .item {
  opacity: 0;
  -webkit-transition: opacity 2s ease-in-out;
  -moz-transition: opacity 2s ease-in-out;
  -ms-transition: opacity 2s ease-in-out;
  -o-transition: opacity 2s ease-in-out;
  transition: opacity 2s ease-in-out;
  left: 0 !important;
}

.carousel-fade .active {
  opacity: 1 !important;
}

.carousel-fade .left {
  opacity: 0 !important;
  -webkit-transition: opacity 0.5s ease-in-out !important;
  -moz-transition: opacity 0.5s ease-in-out !important;
  -ms-transition: opacity 0.5s ease-in-out !important;
  -o-transition: opacity 0.5s ease-in-out !important;
  transition: opacity 0.5s ease-in-out !important;
}

.carousel-fade .carousel-control {
  opacity: 1 !important;
}

我遇到的几乎所有其他 sn-p 都会这样做,但每个人总是首先删除离开的内容,显示一个毫无特色的背景,然后再淡入下一个。我错过了什么?我只需要一些简单的 CSS 来覆盖现有的过渡细节,但我不知道该往哪里看。

【问题讨论】:

标签: javascript css twitter-bootstrap


【解决方案1】:

我认为 bootstrap 的 carousel 插件的不同方面会产生您提到的效果。

  1. 活动项目有display: block,而非活动项目有display: none

    这可以通过给所有项目display: block 来解决,然后使用top: 0left: 0position 设置为absolute,导致项目重叠。设置opacity: 0; 使它们默认不可见。

    减:

    .carousel-inner > .item {
      opacity: 0;
      top: 0;
      left: 0;
      width: 100%;
      display: block;
      position: absolute;
    }
    

    position: absolute 的一个问题是容器没有得到height。可以通过将第一项的position 设置为relative 来解决上述问题(它已经添加了正确的位置)。在Less代码中如下:

    .carousel-inner > .item {
      :first-of-type {
        position:relative;
      } 
    }
    
  2. Bootstrap 使用translate3ds 来改变项目在空间中的位置。您将不需要这些转换,因此请重置它们。利用 Less,代码如下:

    .carousel-inner > .item {
      transform: translate3d(0,0,0) !important;
    }
    
  3. CSS 过渡是通过使用 jQuery 添加和删除 CSS 类来触发的。这些类更改之间的时间已在轮播插件代码 (Carousel.TRANSITION_DURATION = 600) 中硬编码。因此,在 600 毫秒后,一项变为活动状态(具有 .active 类)。如果您的 css transition-duration 大于 0.6 秒,这就是意外行为的原因。

CSS类变化如下:

活动项目具有类.active -> .active.left -> 无 下一项没有类 -> .next.left -> .active

所以.active.left.next.left 很重要(或者向后滑动时.prev.right.active.right)。

因为所有的图片都已经被堆叠了,你可以使用z-index属性让堆叠中的图片可见,因为我们可以同时改变opacity。您可以使用以下 Less 代码在下一张幻灯片中淡入淡出:

.carousel-inner {
  > .next.left {
    transition: opacity 0.6s ease-in-out;
    opacity: 1;
    z-index:2;
  }
  > .active.left {
    z-index:1;
  }
}

要确保控件也可见,请使用:

.carousel-control {
  z-index:4;
}

综上所述,查看this demo 中的结果,它使用以下Less 代码:

.carousel-inner {
 > .item {
  opacity: 0;
  top: 0;
  left: 0;
  width: 100%;
  display: block;
  position: absolute;
  z-index:0;
  transition: none;
  transform: translate3d(0,0,0) !important;
  &:first-of-type {
    position:relative;
  } 
  }
 > .active {
  opacity: 1;
  z-index:3;
}

 > .next.left,
 > .prev.right {
  transition: opacity 0.6s ease-in-out;
  opacity: 1;
  left: 0;
  z-index:2;
  }                                                                                                             
 > .active.left,
 > .active.right {
  z-index:1;
  }
}
.carousel-control {
z-index:4;
}

上面的代码可以用Less autoprefixer plugin插件编译成CSS,命令如下:

lessc --autoprefix="Android 2.3,Android >= 4,Chrome >= 20,Firefox >= 24,Explorer >= 8,iOS >= 6,Opera >= 12,Safari >= 6' code.less

哪个输出:

.carousel-inner > .item {
  opacity: 0;
  top: 0;
  left: 0;
  width: 100%;
  display: block;
  position: absolute;
  z-index: 0;
  -webkit-transition: none;
       -o-transition: none;
          transition: none;
  -webkit-transform: translate3d(0, 0, 0) !important;
          transform: translate3d(0, 0, 0) !important;
}
.carousel-inner > .item:first-of-type {
  position: relative;
}
.carousel-inner > .active {
  opacity: 1;
  z-index: 3;
}
.carousel-inner > .next.left,
.carousel-inner > .prev.right {
  -webkit-transition: opacity 0.6s ease-in-out;
       -o-transition: opacity 0.6s ease-in-out;
          transition: opacity 0.6s ease-in-out;
  opacity: 1;
  left: 0;
  z-index: 2;
}
.carousel-inner > .active.left,
.carousel-inner > .active.right {
  z-index: 1;
}
.carousel-control {
  z-index: 4;
}

【讨论】:

  • 绝妙的解决方案!但是......我怎样才能提高淡入淡出速度?增加过渡时间它失去了平滑过渡
  • 此外,此解决方案的另一个问题:使用控件 prev/next 它不会更改幻灯片。怎么解决?
  • 您应该更改插件中的 Carousel.TRANSITION_DURATION 和 transition-duration。在演示 prev / next 作品中??
【解决方案2】:

我一直在为此苦苦挣扎,这让我发疯了——在 Bootstrap 的介绍页面上,如果你在组件下查看,它会将 Carousel 列为需要 JS 的组件之一。我必须在所有其他样式表之前添加他们的 CSS 样式表,然后在结束 body 标记之前添加他们的 Bootstrap / JS 插件包。终于解决了这个问题。我已按顺序将它们链接在下面,从简介页面开始。

https://getbootstrap.com/docs/5.1/getting-started/introduction/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-07
    • 2017-05-28
    • 1970-01-01
    相关资源
    最近更新 更多