在 Swiper 滑块中显示“溢出:隐藏”之外的元素

新手上路,请多包涵

问题

我有一个 swiper 滑块: http ://codepen.io/kerowan/pen/xqYrwJ(例如通过给 .product-info-wrapper 一个大约 100px 的固定高度来重现问题)

在幻灯片中,有一个图像和一个信息框,最初看起来像这样:

在此处输入图像描述

当我单击“Kurzinfo”时,该框需要展开并最终看起来像这样( .swiper-containerNEW 徽章之后结束,因此它必须 流过 swiper-container ):

在此处输入图像描述

问题是 .swiper-container 有一个 overflow: hidden; 属性,以隐藏继续到右侧的幻灯片。

我尝试了什么?

  1. 我尝试将 overflow: hidden; 上的 .swiper-container 更改为 overflow-x: hidden; 试图隐藏右边的东西,但显示向下溢出的东西.这导致 .swiper-container 只是添加了一个滚动条,它允许您向下滚动以查看应该溢出的内容。

  2. 我尝试将 position: absolute; 上的 .product-info-wrapper (包裹盒子和徽章)更改为 position: fixed; position: fixed; ,因为我读取的属性被忽略了 --- 。然而,这似乎并不能解决问题。

我还没有尝试过任何其他方法,只是因为我不知道任何其他解决方法。

片断

我在这里粘贴了代码片段,但它不起作用,因为我使用了 SCSS,不幸的是没有时间将其重写为纯 CSS。但是,如果上面的链接失效,可以复制到 codepen。

 $(document).ready(function() {
  var productsInFocus = new Swiper ('.products-in-focus', {
    nextButton: '.product-focus-next',
    prevButton: '.product-focus-prev',
    slidesPerView: 4,
    loop: false,
    spaceBetween: 20
  });
});
 .content-wrapper {
  max-width: 1100px;
  margin: 0 auto;
}

.product-wrapper {
  position: relative;
  margin-bottom: 1rem * 5;
  margin-top: 1rem * 5;
  .swiper-slide {
    display: flex;
    justify-content: center;
    align-items: flex-start;
    position: relative;
    min-height: 230px;
    .product-badge-wrapper {
      position: absolute;
      bottom: 0;
      right: 0;
      .product-badge {
        position: relative;
        width: 100px;
        overflow: hidden;
        &.red {
          &:before,
          &:after {
            border-color: #CF043C;
            background-color: transparent;
          }
          &:after {
            background-color: transparent;
            border-left-color: transparent;
          }
          .product-badge-content {
            &:before {
              border-color: darken(#CF043C, 10%);
              border-left-color: transparent;
              border-right-color: transparent;
            }
          }
        }
        &.dark-gray {
          &:before,
          &:after {
            border-color: lighten(#000, 37.4%);
            background-color: transparent;
          }
          &:after {
            background-color: transparent;
            border-left-color: transparent;
          }
          .product-badge-content {
            &:before {
              border-color: lighten(#000, 13.5%);
              border-left-color: transparent;
              border-right-color: transparent;
            }
          }
        }
        &:before,
        &:after {
          content: "";
          position: absolute;
          left: 0;
          background-color: transparent;
          border-color: lighten(#000, 73%);
        }
        &:before {
          top: 20px;
          right: 0;
          bottom: 0;
        }
        &:after {
          bottom: auto;
          left: -1px;
          top: -10px;
          border-style: solid;
          border-width: 0 0 75px 75px;
          background-color: transparent;
          border-left-color: transparent;
          width: 100px;
        }
        .product-badge-content {
          height: 43px;
          padding-right: 5px;
          padding-left: 22px;
          display: flex;
          justify-content: flex-end;
          align-items: center;
          text-align: right;
          text-transform: uppercase;
          font-weight: 700;
          position: relative;
          z-index: 10;
          color: #fff;
          &.text-small {
            font-size: .7rem;
            font-weight: 400 !important;
          }
          &:before {
            content: "";
            position: absolute;
            left: 11px;
            bottom: 0;
            display: block;
            border-style: solid;
            border-color: lighten(#000, 37.4%);
            border-left-color: transparent;
            border-right-color: transparent;
            border-width: 10px 10px 0 10px;
          }
        }
      }
    }
    .product-info-wrapper {
      position: absolute;
      bottom: 0;
      max-width: 100%;
      width: 100%;
      padding-bottom: 10px;
      .product-info {
        position: relative;
        padding: 1rem * .5;
        padding-right: 1rem * 2;
        overflow: hidden;
        &-link {
          display: block;
          a {
            color: lighten(#000, 37.4%);
            transition: color 400ms ease-in-out;
            &:hover {
              color: #CF043C;
              text-decoration: none;
            }
          }
        }
        &-price {
          color: #CF043C;
          &-del {
            color: lighten(#000, 37.4%);
            text-decoration: line-through;
            font-size: .9rem;
          }
        }
        &:before,
        &:after {
          position: absolute;
          content: "";
          left: 0;
          z-index: -1;
          background-color: lighten(#000, 93.5%);
          border-color: lighten(#000, 93.5%);
        }
        &:before {
          top: 0;
          right: 0;
          bottom: 35px;
        }
        &:after {
          top: auto;
          right: -5px;
          bottom: 0;
          border-style: solid;
          border-width: 35px 35px 0 0;
          background-color: transparent;
          border-right-color: transparent;
        }
      }
    }
  }
  .product-focus-prev,
  .product-focus-next {
    position: absolute;
    color: lighten(#000, 37.4%);
    background-image: none;
    display: flex;
    justify-content: center;
    align-items: center;
    font-size: 2rem;
    top: 50%;
    transform: translateY(-50%);
    cursor: pointer;
  }
  .product-focus-prev {
    left: -1rem * 10;
  }
  .product-focus-next {
    right: -1rem * 10;
  }
}
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script src="https://use.fontawesome.com/b13050afbe.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Swiper/3.4.1/js/swiper.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Swiper/3.4.1/js/swiper.jquery.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/Swiper/3.4.1/css/swiper.min.css" rel="stylesheet"/>
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0-alpha.6/css/bootstrap.min.css" rel="stylesheet"/>
<div class="container-fluid">
  <div class="content-wrapper narrow products-in-focus">
    <div class="product-wrapper">
      <div class="swiper-container products-in-focus">
        <div class="swiper-wrapper">
          <div class="swiper-slide">
            <img src="http://www.placehold.it/80x130">
            <div class="product-info-wrapper">
              <div class="product-info">
                <div class="row no-gutters">
                  <div class="col-7">
                    <strong class="text-uppercase">Amino Force</strong>
                    <span class="product-info-link"><a href="#">Kurzinfo</a></span>
                  </div>
                  <div class="col-5 text-right">

                    <div class="product-info-price">CHF 34.00</div>
                  </div>
                </div>
              </div>
              <div class="product-badge-wrapper">
                <div class="product-badge dark-gray">
                  <div class="product-badge-content text-center">
                    %&nbsp;&nbsp;
                  </div>
                </div>
              </div>
            </div>
          </div>
          <div class="swiper-slide">
            <img src="http://www.placehold.it/80x130">
            <div class="product-info-wrapper">
              <div class="product-info">
                <div class="row no-gutters">
                  <div class="col-8">
                    <strong class="text-uppercase">Basic Minerals</strong>
                    <span class="product-info-link"><a href="#">Kurzinfo</a></span>
                  </div>
                  <div class="col-4 text-right">
                    <span class="product-info-price">CHF 34.00</span>
                  </div>
                </div>
              </div>
              <div class="product-badge-wrapper">
                <div class="product-badge red">
                  <div class="product-badge-content">
                    new
                  </div>
                </div>
              </div>
            </div>
          </div>
          <div class="swiper-slide">
            <img src="http://www.placehold.it/80x130">
            <div class="product-info-wrapper">
              <div class="product-info">
                <div class="row no-gutters">
                  <div class="col-8">
                    <strong class="text-uppercase">Amino Force</strong>
                    <span class="product-info-link"><a href="#">Kurzinfo</a></span>
                  </div>
                  <div class="col-4 text-right">
                    <span class="product-info-price">CHF 34.00</span>
                  </div>
                </div>
              </div>
            </div>
          </div>
          <div class="swiper-slide">
            <img src="http://www.placehold.it/80x130">
            <div class="product-info-wrapper">
              <div class="product-info">
                <div class="row no-gutters">
                  <div class="col-8">
                    <strong class="text-uppercase">Whey Isolat CFM</strong>
                    <span class="product-info-link"><a href="#">Kurzinfo</a></span>
                  </div>
                  <div class="col-4 text-right">
                    <span class="product-info-price">CHF 34.00</span>
                  </div>
                </div>
              </div>
              <div class="product-badge-wrapper">
                <div class="product-badge">
                  <div class="product-badge-content text-small">
                    nicht<br>auf lager
                  </div>
                </div>
              </div>
            </div>
          </div>
          <div class="swiper-slide">
            <img src="http://www.placehold.it/80x130">
            <div class="product-info-wrapper">
              <div class="product-info">
                <div class="row no-gutters">
                  <div class="col-8">
                    <strong class="text-uppercase">Amino Force</strong>
                    <span class="product-info-link"><a href="#">Kurzinfo</a></span>
                  </div>
                  <div class="col-4 text-right">
                    <span class="product-info-price">CHF 34.00</span>
                  </div>
                </div>
              </div>
              <div class="product-badge-wrapper">
                <div class="product-badge red">
                  <div class="product-badge-content">
                    new
                  </div>
                </div>
              </div>
            </div>
          </div>
          <div class="swiper-slide">
            <img src="http://www.placehold.it/80x130">
            <div class="product-info-wrapper">
              <div class="product-info">
                <div class="row no-gutters">
                  <div class="col-8">
                    <strong class="text-uppercase">Basic Minerals</strong>
                    <span class="product-info-link"><a href="#">Kurzinfo</a></span>
                  </div>
                  <div class="col-4 text-right">
                    <span class="product-info-price">CHF 34.00</span>
                  </div>
                </div>
              </div>
            </div>
          </div>
          <div class="swiper-slide">
            <img src="http://www.placehold.it/80x130">
            <div class="product-info-wrapper">
              <div class="product-info">
                <div class="row no-gutters">
                  <div class="col-8">
                    <strong class="text-uppercase">Amino Force</strong>
                    <span class="product-info-link"><a href="#">Kurzinfo</a></span>
                  </div>
                  <div class="col-4 text-right">
                    <span class="product-info-price">CHF 34.00</span>
                  </div>
                </div>
              </div>
            </div>
          </div>
          <div class="swiper-slide">
            <img src="http://www.placehold.it/80x130">
            <div class="product-info-wrapper">
              <div class="product-info">
                <div class="row no-gutters">
                  <div class="col-8">
                    <strong class="text-uppercase">Whey Isolat CFM</strong>
                    <span class="product-info-link"><a href="#">Kurzinfo</a></span>
                  </div>
                  <div class="col-4 text-right">
                    <span class="product-info-price">CHF 34.00</span>
                  </div>
                </div>
              </div>
              <div class="product-badge-wrapper">
                <div class="product-badge">
                  <div class="product-badge-content text-small">
                    nicht<br>auf lager
                  </div>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
      <div class="product-focus-prev"><i class="fa fa-chevron-left"></i></div>
      <div class="product-focus-next"><i class="fa fa-chevron-right"></i></div>
    </div>
  </div>
</div>

我希望我的问题足够清楚。如果您需要更多详细信息,请告诉我!

原文由 Patrick Manser 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.2k
2 个回答

我找到了一个解决方案,但我觉得这有点像 hack。对于它的价值,这里是:

 .swiper-container {
  overflow: visible;
}
$slide: ".swiper-slide";
.swiper-slide {
  opacity: 0;
  visibility: hidden;
  transition: opacity 200ms ease-in-out, visibility 200ms ease-in-out;
  &-active {
    opacity: 1;
    visibility: visible;

    @for $i from 1 through 3 {
      & + #{$slide} {
        opacity: 1;
        visibility: visible;
      }
      $slide: "#{$slide} + .swiper-slide";
    }
  }
}

So, what I do here is setting .swiper-container from overflow: hidden; to overflow: visible and then I tell every .swiper-slide to have opacity: 0; 除了 &-active 一个。然后我使用 &-active 幻灯片作为起点并迭代 sass for 循环 3 次以添加 opacity: 1; 为下一个 3 .swiper-slide 此 sass 代码生成以下纯 css 代码( .swiper-container 此处未包含)

 .swiper-slide {
  opacity: 0;
  visibility: hidden;
  transition: opacity 200ms ease-in-out, visibility 200ms ease-in-out;
}
.swiper-slide-active {
  opacity: 1;
  visibility: visible;
}
.swiper-slide-active + .swiper-slide {
  opacity: 1;
  visibility: visible;
}
.swiper-slide-active + .swiper-slide + .swiper-slide {
  opacity: 1;
  visibility: visible;
}
.swiper-slide-active + .swiper-slide + .swiper-slide + .swiper-slide {
  opacity: 1;
  visibility: visible;
}

这整个东西只是为了从 --- 中删除 overflow: hidden; .swiper-container 同时仍然只显示我需要查看的幻灯片并隐藏其他幻灯片。现在我可以调整信息框的高度和我正在寻找的效果了。

原文由 Patrick Manser 发布,翻译遵循 CC BY-SA 3.0 许可协议

你可以加:

 .swiper-slide {
  padding-bottom: 30px;
}

其中 30px 是您的徽章应该超出边界的值。

http://codepen.io/Deka87/pen/xqYXOq

原文由 sdvnksv 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题