如何在 Meteor js 中创建带幻灯片的产品视图

How to create a product view with slideshow in Meteor js

我正在尝试创建一个带有大型产品图像的 Meteor js 产品页面,其中显示的图像会根据从一组 5 个幻灯片(或幻灯片)图像中选择的图像而变化。基本上类似于亚马逊产品页面。 我正在使用 iron:router。 我创建了一个带有幻灯片的产品图片页面。唯一的问题是调整幻灯片图像的大小,使它们成为更小的缩略图,并让图像并排显示,并且仅在产品图像下方显示(而不是跨越整个页面)。

我的幻灯片基于 Slider Syncing 示例 slick slideshow on atmosphere js - https://atmospherejs.com/udondan/slick。 如果这是根本原因,我的 JS 知识只会是基本的。

代码如下

import {
  Template
} from 'meteor/templating';
import {
  ReactiveVar
} from 'meteor/reactive-var';

import './main.html';

Template.carousel.rendered = function() {
  $('.slider-for').slick({
    infinite: false,
    slidesToShow: 1,
    slidesToScroll: 1,
    asNavFor: '.slider-nav',
    arrows: false,
    fade: true
  });
  $('.slider-nav').slick({
    slidesToShow: 3,
    slidesToScroll: 1,
    asNavFor: '.slider-for',
    dots: true,
    arrows: true,
    centerMode: true,
    focusOnSelect: true
  });
}
#carousel {
  border: 3px solid black;
  width: 200px;
  position: relative;
  top: 100px;
  left: 100px;
}

#carousel div {
  width: 200px;
  height: 300px;
}

.slick-prev:before,
.slick-next:before {
  color: orange;
}


/* dimensions of thumbnail grid */

.thumbnail {
  width: 200px;
  height: 200px;
  padding: 1px;
  border: 3px solid #021a40;
  background-color: #f0f;
}


/* dimensions of image within thumbnail grid */

.thumbnail-img {
  position: relative;
  float: left;
  width: 200px;
  height: 200px;
  background-position: 50% 50%;
  background-repeat: no-repeat;
  background-size: 0% 0%;
}


/* dimensions of image within film strip */

.slider-img {
  max-width: 120px;
  max-height: 120px;
  position: relative;
  float: left;
  width: 120px;
  height: 120px;
  background-position: 50% 50%;
  background-repeat: no-repeat;
  background-size: 0% 0%;
}
<head>
  <title>slick-sideshow</title>

  <link rel="stylesheet" type="text/css" href="slick/slick.css" />
  <link rel="stylesheet" type="text/css" href="slick/slick-theme.css" />
</head>

<body>
  <h1>Welcome to slick slideshow!</h1>
  <h2>Slider Syncing</h2>
  <hr/> {{> carousel}}
</body>

<template name="carousel">
     <div class="container js-container" >
        <div class="row">
      <div class="slider slider-for" id="carousel">
       <div class="thumbnail-img"><img src="slick_test1.jpg" width="200px" /></div>
       <div class="thumbnail-img"><img src="slick_test2.jpg" width="200px" /></div>
       <div class="thumbnail-img"><img src="slick_test3.jpg" width="200px" /></div>
       <div class="thumbnail-img"><img src="slick_test4.jpg" width="200px" /></div>
       <div class="thumbnail-img"><img src="slick_test5.jpg" width="200px" /></div>
      </div> <!-- / slider-for -->
       </div> <!-- row -->
     </div> <!-- / container -->
    
      <div class="container js-container">
          <div class="slider slider-nav">
            <div class="col-xs-12 col-md-3">
                <img class="slider-img" src="slick_test1.jpg" />
              </div>
              <div class="col-xs-12 col-md-3">
                <img class="slider-img" src="slick_test2.jpg" />
              </div>
              <div class="col-xs-12 col-md-3">
                  <img class="slider-img" src="slick_test3.jpg" />
             </div>
              <div class="col-xs-12 col-md-3">
                  <img class="slider-img" src="slick_test4.jpg" />
              </div>
              <div class="col-xs-12 col-md-3">
                  <img class="slider-img" src="slick_test5.jpg" />
             </div>
          </div>  <!-- / slider-nav -->
     </div> <!-- / container -->
    </template>

我最终得到这个 -

但我想得到这样的东西Amazon product image example

所以目标是显示带有缩略图的大产品图片 显示在产品图像下方(并跨越)的替代产品视图的数量 - amz 将它们显示在侧面。缩略图是可选择的,从而使所选视图显示为主产品图像。它们应该可以通过单击它们来选择(理想)and/or 单击箭头或点,如我的示例所示。

在我的示例中,主要问题是:

我猜你的问题主要是关于 CSS。 为图像提供适当的宽度和高度可能会解决您的问题。

您可以使用 Chrome 的开发人员控制台进行一些简单的 css 更改,如果有任何 javascript 错误,您还应该检查控制台错误。

您可以像下面的例子那样实现...

产品图片太小且未定位在边框中 要定位图像,您可以增加容器的尺寸..

#carousel {
    border: 3px solid black;
    width: 400px;
    height:   300px;

缩略图与产品图片重叠,它们之间的 space 太大

实际上重叠的缩略图是因为库创建的 slick-track 元素的高度比其父元素高。所以只需通过设置自定义高度来防止这种情况。

.slider-for .slick-track{
     height:294px;
     }

缩略图不可点击

当您在 slide-for 和 slide-nav 容器中设置不同的项目时,缩略图不可点击,要解决这个问题,只需在两者上放置相同的项目

$('.slider-for').slick({
      infinite: false, 
      slidesToShow: 1,
      slidesToScroll: 1,
    asNavFor: '.slider-nav',
      arrows: false,
      fade: true
    });
    $('.slider-nav').slick({
      slidesToShow: 3,
      slidesToScroll: 1,
    asNavFor: '.slider-for',
      dots: true,
      arrows: true, 
      centerMode: true,
      focusOnSelect: true
    });
.container{
  
 
}
#carousel {
    border: 3px solid black;
    width: 400px;
    height:   300px;
    position: relative;
    /* top: 100px; */
    /* left: 100px; */
    margin: auto;
    margin-bottom: 10px;
}



.slick-prev:before, .slick-next:before {
    color:  orange !important;
}


/* dimensions of thumbnail grid */
.thumbnail {
    width:  200px;
  height: 200px;
    padding:    1px;
    border: 3px solid #021a40;
    background-color:   #f0f;
} 

/* dimensions of image within thumbnail grid */
.thumbnail-img {
   position: relative;
   float: left;
   width: 200px;
   height: 200px;
   background-position: 50% 50%;
   background-repeat: no-repeat;
   background-size: 0% 0%;
}

/* dimensions of image within film strip */
.slider-img {
  max-width: 120px;
  max-height: 120px;
  position: relative;
  float: left;
  width: 120px;
  height: 120px;
  background-position: 50% 50%;
  background-repeat: no-repeat;
  background-size: 0% 0%;
}
.slider-nav{
  width:350px;
  margin:auto;
}
.slider-nav img {
  max-width:100%;
  max-height:70px;
  margin:auto;
}
.slick-initialized .slick-slide {
 text-align:center;
 
}
.slick-slide img{
    display: block;
    max-width: 100%;
    max-height: 100%;
    margin: auto;
    }
 .slider-for .slick-track{
 height:294px;
 }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.7.1/slick.min.css" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.7.1/slick-theme.css" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.7.1/slick.js"></script>

    <div class="container js-container" >
    <div class="row">
        <div class="slider slider-for" id="carousel">
            <div >
                       <img src="http://lorempixel.com/500/500"  />
          </div>
          <div >
                       <img src="http://lorempixel.com/output/fashion-q-c-500-500-10.jpg"  />
          </div>
          <div >
                    <img src="http://lorempixel.com/output/food-q-c-500-500-6.jpg"  />
            </div>
          <div >
                   <img src="http://lorempixel.com/output/sports-q-c-500-500-10.jpg"  />
          </div>
          <div >
                    <img src="http://lorempixel.com/output/animals-q-c-500-500-2.jpg"  />
            </div>
        </div> <!-- / slider-for -->
    </div> <!-- row -->
    </div> <!-- / container -->

  <div class="container js-container">
      <div class="slider slider-nav">
          <div >
                       <img src="http://lorempixel.com/500/500"  />
          </div>
          <div >
                       <img src="http://lorempixel.com/output/fashion-q-c-500-500-10.jpg"  />
          </div>
          <div >
                    <img src="http://lorempixel.com/output/food-q-c-500-500-6.jpg"  />
            </div>
          <div >
                   <img src="http://lorempixel.com/output/sports-q-c-500-500-10.jpg"  />
          </div>
          <div >
                    <img src="http://lorempixel.com/output/animals-q-c-500-500-2.jpg"  />
            </div>
            </div>  <!-- / slider-nav -->
    </div> <!-- / container -->