如何修改Bootstrap轮播组件以适应移动设备和平板电脑

7

我正在使用一个Bootstrap滑块。

  • 在桌面上,它有三个幻灯片,每个幻灯片有4个瓷砖

enter image description here

  • 在选项卡上,每个选项卡需要有4个幻灯片,每个幻灯片有3个图块。

  • 在移动设备上,需要有12个不同的幻灯片。

我正在考虑最有效和优化的实现方式。

选项1 - 创建3个不同的幻灯片集。一次只显示一个。

选项2 - 使用jquery检测屏幕宽度,并编程添加额外的图块作为幻灯片,隐藏多余的图块。我想这将非常复杂。

如果有更好的实现方法,请帮忙提供建议。


嗨Stacy J,您能展示一下您想要修改的代码吗? - Muhammad Muzamil
1个回答

8

这里是:

.carousel-inner .item.active {
  display: flex; 
}

.carousel-inner .item {
  background-color: #212121;
  color: white;
  padding: 0 15px; 
}
#desktopCarousel .carousel-inner .item > .row {
  min-height: 480px;
}
#tabletCarousel .carousel-inner .item > .row {
  min-height: 360px;
}
.carousel-inner .item > .row {
  flex-grow: 1;
  min-height: 320px;
  display: flex;
  flex-wrap: wrap;
  align-items: stretch; 
}
.carousel-inner .item > .row [class^="col-"] {
  flex-grow: 1;
  display: flex;
  flex-direction: column;
  align-items: stretch;
  justify-content: center;
  text-align: center; 
}
.carousel-inner .item > .row .row {
  flex-grow: 1;
  display: flex;
  flex-wrap: wrap;
  align-items: stretch; 
}
.carousel-inner .item > .row .row [class^="col-"] {
  display: flex;
  flex-direction: column;
  align-items: stretch;
  justify-content: center; 
}
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>

<div id="desktopCarousel" class="carousel slide hidden-xs hidden-sm" data-ride="carousel">
  <ol class="carousel-indicators">
    <li data-target="#desktopCarousel" data-slide-to="0" class="active"></li>
    <li data-target="#desktopCarousel" data-slide-to="1"></li>
    <li data-target="#desktopCarousel" data-slide-to="2"></li>
  </ol>

  <div class="carousel-inner" role="listbox">
    <div class="item active">
      <div class="row">
        <div class="col-sm-6">
          First item
        </div>
        <div class="col-sm-6">
          <div class="row">
            <div class="col-sm-6">
              Second item
            </div>
            <div class="col-sm-6">
              Third item
            </div>
          </div>
          <div class="row">
            <div class="col-sm-12">
              Fourth item
            </div>
          </div>
        </div>
      </div>
    </div>
    <div class="item">
      <div class="row">
        <div class="col-sm-6">
          Fifth item
        </div>
        <div class="col-sm-6">
          <div class="row">
            <div class="col-sm-6">
              Sixth item
            </div>
            <div class="col-sm-6">
              Seventh item
            </div>
          </div>
          <div class="row">
            <div class="col-sm-12">
              Eighth item
            </div>
          </div>
        </div>
      </div>
    </div>
    <div class="item">
      <div class="row">
        <div class="col-sm-6">
          Nineth item
        </div>
        <div class="col-sm-6">
          <div class="row">
            <div class="col-sm-6">
              Tenth item
            </div>
            <div class="col-sm-6">
              Eleventh item
            </div>
          </div>
          <div class="row">
            <div class="col-sm-12">
              Twelfth item
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>

  <a class="left carousel-control" href="#desktopCarousel" role="button" data-slide="prev">
    <span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span>
    <span class="sr-only">Previous</span>
  </a>
  <a class="right carousel-control" href="#desktopCarousel" role="button" data-slide="next">
    <span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span>
    <span class="sr-only">Next</span>
  </a>
</div>

<div id="tabletCarousel" class="carousel slide hidden-xs hidden-md hidden-lg" data-ride="carousel">
  <ol class="carousel-indicators">
    <li data-target="#tabletCarousel" data-slide-to="0" class="active"></li>
    <li data-target="#tabletCarousel" data-slide-to="1"></li>
    <li data-target="#tabletCarousel" data-slide-to="2"></li>
    <li data-target="#tabletCarousel" data-slide-to="3"></li>
  </ol>

  <div class="carousel-inner" role="listbox">
    <div class="item active">
      <div class="row">
        <div class="col-sm-6">
          First item
        </div>
        <div class="col-sm-6">
          <div class="row">
            <div class="col-sm-12">
              Second item
            </div>
            <div class="col-sm-12">
              Third item
            </div>
          </div>
        </div>
      </div>
    </div>
    <div class="item">
      <div class="row">
        <div class="col-sm-6">
          Fourth item
        </div>
        <div class="col-sm-6">
          <div class="row">
            <div class="col-sm-12">
              Fifth item
            </div>
            <div class="col-sm-12">
              Sixth item
            </div>
          </div>
        </div>
      </div>
    </div>
    <div class="item">
     <div class="row">
        <div class="col-sm-6">
          Seventh item
        </div>
        <div class="col-sm-6">
          <div class="row">
            <div class="col-sm-12">
              Eighth item
            </div>
            <div class="col-sm-21">
              Nineth item
            </div>
          </div>
        </div>
      </div>     
    </div>
    <div class="item">
     <div class="row">
        <div class="col-sm-6">
          Tenth item
        </div>
        <div class="col-sm-6">
          <div class="row">
            <div class="col-sm-12">
              Eleventh item
            </div>
            <div class="col-sm-12">
              Twelvth item
            </div>
          </div>
        </div>
      </div>     
    </div>
  </div>

  <a class="left carousel-control" href="#tabletCarousel" role="button" data-slide="prev">
    <span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span>
    <span class="sr-only">Previous</span>
  </a>
  <a class="right carousel-control" href="#tabletCarousel" role="button" data-slide="next">
    <span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span>
    <span class="sr-only">Next</span>
  </a>
</div>

<div id="mobileCarousel" class="carousel slide hidden-sm hidden-md hidden-lg" data-ride="carousel">
  <ol class="carousel-indicators">
    <li data-target="#mobileCarousel" data-slide-to="0" class="active"></li>
    <li data-target="#mobileCarousel" data-slide-to="1"></li>
    <li data-target="#mobileCarousel" data-slide-to="2"></li>
    <li data-target="#mobileCarousel" data-slide-to="3"></li>
    <li data-target="#mobileCarousel" data-slide-to="4"></li>
    <li data-target="#mobileCarousel" data-slide-to="5"></li>
    <li data-target="#mobileCarousel" data-slide-to="6"></li>
    <li data-target="#mobileCarousel" data-slide-to="7"></li>
    <li data-target="#mobileCarousel" data-slide-to="8"></li>
    <li data-target="#mobileCarousel" data-slide-to="9"></li>
    <li data-target="#mobileCarousel" data-slide-to="10"></li>
    <li data-target="#mobileCarousel" data-slide-to="11"></li>
  </ol>

  <div class="carousel-inner" role="listbox">
    <div class="item active">
      <div class="row">
        <div class="col-sm-12">
          First item
        </div>
      </div>
    </div>
    <div class="item">
      <div class="row">
        <div class="col-sm-12">
          Second item
        </div>
      </div>
    </div>
    <div class="item">
      <div class="row">
        <div class="col-sm-12">
          Third item
        </div>
      </div>
    </div>
    <div class="item">
      <div class="row">
        <div class="col-sm-12">
          Fourth item
        </div>
      </div>
    </div>
    <div class="item">
      <div class="row">
        <div class="col-sm-12">
          Fifth item
        </div>
      </div>
    </div>
    <div class="item">
      <div class="row">
        <div class="col-sm-12">
          Sixth item
        </div>
      </div>
    </div>
    <div class="item">
      <div class="row">
        <div class="col-sm-12">
          Seventh item
        </div>
      </div>
    </div>
    <div class="item">
      <div class="row">
        <div class="col-sm-12">
          Eighth item
        </div>
      </div>
    </div>
    <div class="item">
      <div class="row">
        <div class="col-sm-12">
          Nineth item
        </div>
      </div>
    </div>
    <div class="item">
      <div class="row">
        <div class="col-sm-12">
          Tenth item
        </div>
      </div>
    </div>
    <div class="item">
      <div class="row">
        <div class="col-sm-12">
          Eleventh item
        </div>
      </div>
    </div>
    <div class="item">
      <div class="row">
        <div class="col-sm-12">
          Twelveth item
        </div>
      </div>
    </div>
  </div>

  <a class="left carousel-control" href="#mobileCarousel" role="button" data-slide="prev">
    <span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span>
    <span class="sr-only">Previous</span>
  </a>
  <a class="right carousel-control" href="#mobileCarousel" role="button" data-slide="next">
    <span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span>
    <span class="sr-only">Next</span>
  </a>
</div>

请注意,实际上您不需要CSS(它只是为桌面滑块创建布局,在每个项目中使用flexbox使内容居中(带有颜色),但我认为您已经掌握了这些)。CSS未加前缀,并且如果有帮助,您将在fiddle中找到SCSS。
此外,您可能希望为移动/平板电脑/桌面设置不同的min-height。
除此之外,它非常干净……bootstrap。没有自定义JS,没有自定义CSS。只有标记。
编辑:(根据评论)如果您不想让所有滑块始终运行,并且更喜欢基于调整大小侦听器初始化每个滑块,当更改@media间隔时(我建议使用enquire.js进行此操作-0.8k压缩,可在任何浏览器/设备上运行),请在脚本中放置每个轮播的标记,并使用不同的id。
<script id="desktop-markup" type="text/template">
  <div id="desktopCarousel" class="carousel slide" data-ride="carousel">
    <!-- carousel markup here -->
  </div>
</script>
<script id="tablet-markup" type="text/template">
  <div id="tabletCarousel" class="carousel slide" data-ride="carousel">
    <!-- carousel markup here -->
  </div>
</script>
<script id="mobile-markup" type="text/template">
  <div id="mobileCarousel" class="carousel slide" data-ride="carousel">
    <!-- carousel markup here -->
  </div>
</script>

在页面 load 和媒体间隔更改时,根据当前的@media间隔获取模板内容(即$('#mobile-markup').html()),将其放置在指定的DOM容器内并运行.carousel()
$('.carousel-container').html(
  $('#mobile-markup').html()
).find('.carousel').carousel(options); 
// where options is optional. :) 
// see http://getbootstrap.com/javascript/#carousel-options

所以你正在使用三个不同的轮播集。每个集合在同一页上加载,但根据屏幕尺寸一次只显示一个。我理解得对吗..? - Stacy J
1
@StacyJ:你说得对。考虑到我们只使用Bootstrap和jQuery,你实际上没有更轻的方法。在运行时创建/删除幻灯片并移动内容是更糟糕的选择,因为a)它涉及大量DOM操作,b)它需要放置一个“resize”侦听器(这很昂贵)或使用“enquire.js”。DOM可能更轻,但调整大小时的转换可能会变得缓慢,具体取决于幻灯片数量。您还需要在每次更改幻灯片时重新初始化滑块。另一个选择是使用另一个滑块(slick.js适合)。 - tao
我使用了resize监听方法来创建3组滑块,并根据屏幕宽度通过ajax调用它们中的每一个。说实话,调整大小期间的过渡确实会付出代价。我会坚持一段时间并观察整个站点的性能。如果情况变得非常糟糕,我会尝试上述方法。 - Stacy J
@StacyJ,你可以使用脚本模板来代替$.ajax()。请参见答案中的补充说明。在<script>标记内部的此标记仅作为脚本标记,而不会在页面加载时解析为DOM。 - tao
会试一下。 - Stacy J

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