如何限制幻灯片的大小 (JS)

How to limit a slideshow in size (JS)

我是一名正在尝试学习前端开发的初学者。我经常查看其他代码并尝试对其进行调整。我发现了这个很棒的幻灯片,我想尝试一下:

https://codepen.io/supah/pen/zZaPeE

我通过在线工具将 scss 格式化为 css,导入了所有必要的脚本,幻灯片效果很好!

但它是全屏的。 如何限制它的大小? 假设我希望此幻灯片显示在我的主页上,在导航下方,大小为 600w x 400h。

我试过了:

似乎没有任何效果。唯一发生的事情是幻灯片中的图像缩小并出现在屏幕的左上角。导航、"area of functionality" 等保持不变(全宽、全高)。

当更改 window 大小时,幻灯片放映的缩放比例非常好并且适合所有条件,无论是二次 window、宽 window 等。肯定有办法到 "trap" 一定尺寸?

(很抱歉包含所有代码 - 我真的不知道理解问题的最低限度是多少)

这里是同样的代码,格式从scss到css等等,我在本地是运行:

https://jsfiddle.net/by37cuwz/1/

代码:

HTML
<!--

This code (HTML, CSS, JS) was created by Fabio Ottaviani. View the original here: https://codepen.io/supah/pen/zZaPeE

-->
<html>
<head>
    <link rel="stylesheet" type="text/css" href="slideshow.css">
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.6.0/slick.min.css">
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.6.0/slick-theme.min.css">
  <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto+Condensed:100">
</head>

<body>
  <!--

  Follow me on
  Dribbble: https://dribbble.com/supahfunk
  Twitter: https://twitter.com/supahfunk
  Codepen: https://codepen.io/supah/

  -->
  <div class="split-slideshow">
    <div class="slideshow">
      <div class="slider">
        <div class="item">
          <img src="https://raw.githubusercontent.com/supahfunk/supah-codepen/master/canyon-2.jpg" />
        </div>
        <div class="item">
          <img src="https://raw.githubusercontent.com/supahfunk/supah-codepen/master/canyon-3.jpg" />
        </div>
        <div class="item">
          <img src="https://raw.githubusercontent.com/supahfunk/supah-codepen/master/canyon-4.jpg" />
        </div>
        <div class="item">
          <img src="https://raw.githubusercontent.com/supahfunk/supah-codepen/master/canyon-1.jpg" />
        </div>
      </div>
    </div>
    <div class="slideshow-text">
      <div class="item">Canyon</div>
      <div class="item">Desert</div>
      <div class="item">Erosion</div>
      <div class="item">Shape</div>
    </div>
  </div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-mousewheel/3.1.12/jquery.mousewheel.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.6.0/slick.min.js"></script>
  <script type="text/javascript" src="script.js"></script>
</body>
</html>

CSS
body, html {
     height: 100%;
     background: #110101;
     font-family: 'Roboto', sans-serif;
     overflow: hidden;
}
 .slideshow {
     position: absolute;
     z-index: 1;
     top: 0;
     left: 0;
     width: 100vw;
     height: 100vh;
     overflow: hidden;
}
 .slideshow .slider {
     width: 100vw;
     height: 100vw;
     z-index: 2;
}
 .slideshow .slider * {
     outline: none;
}
 .slideshow .slider .item {
     height: 100vh;
     width: 100vw;
     position: relative;
     overflow: hidden;
     border: none;
}
 .slideshow .slider .item .text {
     display: none;
}
 .slideshow .slider .item img {
     min-width: 101%;
     min-height: 101%;
     position: absolute;
     top: 50%;
     left: 50%;
     transform: translate(-50%, -50%);
}
 .slideshow .slick-dots {
     position: fixed;
     z-index: 100;
     width: 40px;
     height: auto;
     bottom: auto;
     top: 50%;
     right: 0;
     transform: translateY(-50%);
     left: auto;
     color: #fff;
     display: block;
}
 .slideshow .slick-dots li {
     display: block;
     width: 100%;
     height: auto;
}
 .slideshow .slick-dots li button {
     position: relative;
     width: 20px;
     height: 15px;
     text-align: center;
}
 .slideshow .slick-dots li button:before {
     content: '';
     background: #fff;
     color: #fff;
     height: 2px;
     width: 20px;
     border-radius: 0;
     position: absolute;
     top: 50%;
     right: 0;
     left: auto;
     transform: translateY(-50%);
     transition: all 0.3s ease-in-out;
     opacity: 0.6;
}
 .slideshow .slick-dots li.slick-active button:before {
     width: 40px;
     opacity: 1;
}
 .slideshow.slideshow-right {
     left: 0;
     z-index: 1;
     width: 50vw;
     pointer-events: none;
}
 .slideshow.slideshow-right .slider {
     left: 0;
     position: absolute;
}
 .slideshow-text {
     position: absolute;
     top: 50%;
     left: 50%;
   margin-top: 50vh;
     transform: translate(-50%, -50%);
     z-index: 100;
     font-size: 80px;
     width: 100vw;
     text-align: center;
     color: #fff;
     font-family: 'Roboto Condensed', sans-serif;
     font-weight: 100;
     pointer-events: none;
     text-transform: uppercase;
     letter-spacing: 20px;
     line-height: 0.8;
}
 @media (max-width: 767px) {
     .slideshow-text {
         font-size: 40px;
    }
}
 .the-most {
     position: fixed;
     z-index: 1;
     bottom: 0;
     left: 0;
     width: 50vw;
     max-width: 200px;
     padding: 10px;
}
 .the-most img {
     max-width: 100%;
}
JS
var $slider = $('.slideshow .slider'),
  maxItems = $('.item', $slider).length,
  dragging = true,
  tracking,
  rightTracking;

$sliderRight = $('.slideshow').clone().addClass('slideshow-right').appendTo($('.split-slideshow'));

rightItems = $('.item', $sliderRight).toArray();
reverseItems = rightItems.reverse();
$('.slider', $sliderRight).html('');
for (i = 0; i < maxItems; i++) {
  $(reverseItems[i]).appendTo($('.slider', $sliderRight));
}

$slider.addClass('slideshow-left');
$('.slideshow-left').slick({
  vertical: true,
  verticalSwiping: true,
  arrows: false,
  infinite: true,
  dots: true,
  speed: 1000,
  cssEase: 'cubic-bezier(0.7, 0, 0.3, 1)'
}).on('beforeChange', function(event, slick, currentSlide, nextSlide) {

  if (currentSlide > nextSlide && nextSlide == 0 && currentSlide == maxItems - 1) {
    $('.slideshow-right .slider').slick('slickGoTo', -1);
    $('.slideshow-text').slick('slickGoTo', maxItems);
  } else if (currentSlide < nextSlide && currentSlide == 0 && nextSlide == maxItems - 1) {
    $('.slideshow-right .slider').slick('slickGoTo', maxItems);
    $('.slideshow-text').slick('slickGoTo', -1);
  } else {
    $('.slideshow-right .slider').slick('slickGoTo', maxItems - 1 - nextSlide);
    $('.slideshow-text').slick('slickGoTo', nextSlide);
  }
}).on("mousewheel", function(event) {
  event.preventDefault();
  if (event.deltaX > 0 || event.deltaY < 0) {
    $(this).slick('slickNext');
  } else if (event.deltaX < 0 || event.deltaY > 0) {
    $(this).slick('slickPrev');
  };
}).on('mousedown touchstart', function(){
  dragging = true;
  tracking = $('.slick-track', $slider).css('transform');
  tracking = parseInt(tracking.split(',')[5]);
  rightTracking = $('.slideshow-right .slick-track').css('transform');
  rightTracking = parseInt(rightTracking.split(',')[5]);
}).on('mousemove touchmove', function(){
  if (dragging) {
    newTracking = $('.slideshow-left .slick-track').css('transform');
    newTracking = parseInt(newTracking.split(',')[5]);
    diffTracking = newTracking - tracking;
    $('.slideshow-right .slick-track').css({'transform': 'matrix(1, 0, 0, 1, 0, ' + (rightTracking - diffTracking) + ')'});
  }
}).on('mouseleave touchend mouseup', function(){
  dragging = false;
});

$('.slideshow-right .slider').slick({
  swipe: false,
  vertical: true,
  arrows: false,
  infinite: true,
  speed: 950,
  cssEase: 'cubic-bezier(0.7, 0, 0.3, 1)',
  initialSlide: maxItems - 1
});
$('.slideshow-text').slick({
  swipe: false,
  vertical: true,
  arrows: false,
  infinite: true,
  speed: 900,
  cssEase: 'cubic-bezier(0.7, 0, 0.3, 1)'
});

我分叉了 fiddle 并编辑了代码以实现我认为您想要的。

关键是将 max-widths 和 max-height 添加到 "split-slideshow" 元素。然后将 children 的所有继承宽度和高度设置为百分比,而不是 vh 和 vw。我还必须更改其他一些小样式以确保它们全部对齐。

这是 JS Fiddle 以及下面的代码。如果您还有其他问题,请告诉我。

https://jsfiddle.net/mo15wht8/2/

var $slider = $('.slideshow .slider'),
  maxItems = $('.item', $slider).length,
  dragging = true,
  tracking,
  rightTracking;

$sliderRight = $('.slideshow').clone().addClass('slideshow-right').appendTo($('.split-slideshow'));

rightItems = $('.item', $sliderRight).toArray();
reverseItems = rightItems.reverse();
$('.slider', $sliderRight).html('');
for (i = 0; i < maxItems; i++) {
  $(reverseItems[i]).appendTo($('.slider', $sliderRight));
}

$slider.addClass('slideshow-left');
$('.slideshow-left').slick({
  vertical: true,
  verticalSwiping: true,
  arrows: false,
  infinite: true,
  dots: true,
  speed: 1000,
  cssEase: 'cubic-bezier(0.7, 0, 0.3, 1)'
}).on('beforeChange', function(event, slick, currentSlide, nextSlide) {

  if (currentSlide > nextSlide && nextSlide == 0 && currentSlide == maxItems - 1) {
    $('.slideshow-right .slider').slick('slickGoTo', -1);
    $('.slideshow-text').slick('slickGoTo', maxItems);
  } else if (currentSlide < nextSlide && currentSlide == 0 && nextSlide == maxItems - 1) {
    $('.slideshow-right .slider').slick('slickGoTo', maxItems);
    $('.slideshow-text').slick('slickGoTo', -1);
  } else {
    $('.slideshow-right .slider').slick('slickGoTo', maxItems - 1 - nextSlide);
    console.log(nextSlide);
    $('.slideshow-text').slick('slickGoTo', nextSlide);
  }
}).on("mousewheel", function(event) {
  event.preventDefault();
  if (event.deltaX > 0 || event.deltaY < 0) {
    $(this).slick('slickNext');
  } else if (event.deltaX < 0 || event.deltaY > 0) {
    $(this).slick('slickPrev');
  };
}).on('mousedown touchstart', function(){
  dragging = true;
  tracking = $('.slick-track', $slider).css('transform');
  tracking = parseInt(tracking.split(',')[5]);
  rightTracking = $('.slideshow-right .slick-track').css('transform');
  rightTracking = parseInt(rightTracking.split(',')[5]);
}).on('mousemove touchmove', function(){
  if (dragging) {
    newTracking = $('.slideshow-left .slick-track').css('transform');
    newTracking = parseInt(newTracking.split(',')[5]);
    diffTracking = newTracking - tracking;
    $('.slideshow-right .slick-track').css({'transform': 'matrix(1, 0, 0, 1, 0, ' + (rightTracking - diffTracking) + ')'});
  }
}).on('mouseleave touchend mouseup', function(){
  dragging = false;
});

$('.slideshow-right .slider').slick({
  swipe: false,
  vertical: true,
  arrows: false,
  infinite: true,
  speed: 950,
  cssEase: 'cubic-bezier(0.7, 0, 0.3, 1)',
  initialSlide: maxItems - 1
});
$('.slideshow-text').slick({
  swipe: false,
  vertical: true,
  arrows: false,
  infinite: true,
  speed: 900,
  cssEase: 'cubic-bezier(0.7, 0, 0.3, .9)'
});
body, html {
  height: 100%;
  background: #110101;
  font-family: 'Roboto', sans-serif;
  overflow: hidden;
}
.split-slideshow{
  width: 100vw;
  height: 100vh;
  max-width: 800px;
  max-height: 600px;
  position: relative;
  overflow: hidden;
}
 .slideshow {
  position: absolute;
  z-index: 1;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  overflow: hidden;
}
 .slideshow .slider {
  width: 100%;
  height: 100%;
  z-index: 2;
}
 .slideshow .slider * {
  outline: none;
}
 .slideshow .slider .item {
  height: 100vh;
  width: 100vw;
  position: relative;
  overflow: hidden;
  border: none;
}
 .slideshow .slider .item .text {
  display: none;
}
 .slideshow .slider .item img {
  min-width: 101%;
  min-height: 101%;
  position: absolute;
  top: 0;
  left: 0;
  transform: translate(-25%, -25%);
}
 .slideshow .slick-dots {
  position: absolute;
  z-index: 100;
  width: 40px;
  height: auto;
  bottom: auto;
  top: 50%;
  right: 0;
  transform: translateY(-50%);
  left: auto;
  color: #fff;
  display: block;
}
 .slideshow .slick-dots li {
  display: block;
  width: 100%;
  height: auto;
}
 .slideshow .slick-dots li button {
  position: relative;
  width: 20px;
  height: 15px;
  text-align: center;
}
 .slideshow .slick-dots li button:before {
  content: '';
  background: #fff;
  color: #fff;
  height: 2px;
  width: 20px;
  border-radius: 0;
  position: absolute;
  top: 50%;
  right: 0;
  left: auto;
  transform: translateY(-50%);
  transition: all 0.3s ease-in-out;
  opacity: 0.6;
}
 .slideshow .slick-dots li.slick-active button:before {
  width: 40px;
  opacity: 1;
}
 .slideshow.slideshow-right {
  left: 0;
  z-index: 1;
  width: 50%;
  pointer-events: none;
}
 .slideshow.slideshow-right .slider {
  left: 0;
  position: absolute;
}
 .slideshow-text {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  z-index: 100;
  font-size: 80px;
  width: 100%;
  text-align: center;
  color: #fff;
  font-family: 'Roboto Condensed', sans-serif;
  font-weight: 100;
  pointer-events: none;
  text-transform: uppercase;
  letter-spacing: 20px;
  line-height: 0.9;
}
 @media (max-width: 767px) {
  .slideshow-text {
   font-size: 40px;
 }
}
 .the-most {
  position: fixed;
  z-index: 1;
  bottom: 0;
  left: 0;
  width: 50vw;
  padding: 10px;
}
 .the-most img {
  max-width: 100%;
}
<!--

This code (HTML, CSS, JS) was created by Fabio Ottaviani. View the original here: https://codepen.io/supah/pen/zZaPeE

-->
<html>
<head>
 <link rel="stylesheet" type="text/css" href="slideshow.css">
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.6.0/slick.min.css">
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.6.0/slick-theme.min.css">
  <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto+Condensed:100">
</head>

<body>
  <!--

  Follow me on
  Dribbble: https://dribbble.com/supahfunk
  Twitter: https://twitter.com/supahfunk
  Codepen: https://codepen.io/supah/

  -->
  <div class="split-slideshow">
    <div class="slideshow">
      <div class="slider">
        <div class="item">
          <img src="https://raw.githubusercontent.com/supahfunk/supah-codepen/master/canyon-2.jpg" />
        </div>
        <div class="item">
          <img src="https://raw.githubusercontent.com/supahfunk/supah-codepen/master/canyon-3.jpg" />
        </div>
        <div class="item">
          <img src="https://raw.githubusercontent.com/supahfunk/supah-codepen/master/canyon-4.jpg" />
        </div>
        <div class="item">
          <img src="https://raw.githubusercontent.com/supahfunk/supah-codepen/master/canyon-1.jpg" />
        </div>
      </div>
    </div>
    <div class="slideshow-text">
      <div class="item">Canyon</div>
      <div class="item">Desert</div>
      <div class="item">Erosion</div>
      <div class="item">Shape</div>
    </div>
  </div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-mousewheel/3.1.12/jquery.mousewheel.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.6.0/slick.min.js"></script>
  <script type="text/javascript" src="script.js"></script>
</body>
</html>