javascript - 基本 JavaScript 幻灯片说明
问题描述
我正在使用 JQuery 创建自定义幻灯片布局,并且正在编写将
- 计算屏幕宽度
- 减去图像的宽度
- 将左边距设置为屏幕和图像宽度差的 1/3
图像似乎排成一行,但在 3 张图像中的最后一张被砍掉了。我正在尝试使这种动态化,以便它可以为任意数量的图像进行间隔布局。我对这一切都错了吗?此外,内联块元素之间的空间是否设置它?
var sl = $('.slideIt')
var acc = 0
for (var i = 0; i < $('.slideIt img').length; i++) {
acc += $('.slideIt').eq(i).width();
}
var distanceRatio = ($(window).innerWidth() - acc) / sl.children().length;
$('.slideIt').css('marginLeft', '' + distanceRatio + 'px')
.imageSlideHolder {
margin: 0 auto;
width: 100%;
overflow: hidden;
position: relative;
}
.slideIt {
display: inline-block;
position: relative;
width: 33%;
}
.slideIt img {
position: relative;
width: 100%;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<h1>Image Slideshow</h1>
<div class='imageSlideHolder'>
<div class='slideIt'>
<img src='im1.jpg' />
</div>
<div class='slideIt'>
<img src='im2.jpg' />
</div>
<div class='slideIt'>
<img src='im3.jpg' />
</div>
</div>
解决方案
您不必计算任何东西的宽度。通过使用 CSS,您可以使用 Flexbox 将项目排成一行。将所有幻灯片包裹在另一个元素中,在本例中,我们称之为元素imageSlideRails
,它将所有幻灯片一起移动,而不是单独移动它们。
我建议使用 CSStransform
属性而不是边距来使滑块移动。这将提高性能并防止不必要的行为,例如元素相互推开。
您滑动的量可以是与幻灯片上的值相同的flex-basis
值。假设幻灯片是33.3%
. 如果将导轨移动到-33.3%
,则第一张幻灯片将移出视野,而下一张幻灯片将进入视野。这样计算将始终精确。
查看下面的代码段。
var index = 1;
var slideWidth = 33.3;
var slidesLength = $('.slideIt').length;
var $rails = $('.imageSlideRails');
setInterval(function() {
$rails.css('transform', `translate3d(${index * -slideWidth}%, 0, 0)`);
if (index === slidesLength - 1) {
index = 0;
} else {
index++;
}
}, 2000);
.imageSlideHolder {
margin: 0 auto;
width: 100%;
overflow: hidden;
position: relative;
}
.imageSlideRails {
display: flex;
flex-flow: row nowrap;
transition: transform 1s ease-in-out;
}
.slideIt {
box-sizing: border-box;
position: relative;
width: 33.3%;
flex-grow: 0;
flex-shrink: 0;
flex-basis: 33.3%;
padding: 15px;
overflow: hidden;
}
.slideIt img {
position: relative;
width: 100%;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<h1>Image Slideshow</h1>
<div class='imageSlideHolder'>
<div class="imageSlideRails">
<div class='slideIt'>
<img src='https://www.fillmurray.com/640/360' />
</div>
<div class='slideIt'>
<img src='https://www.fillmurray.com/640/360' />
</div>
<div class='slideIt'>
<img src='https://www.fillmurray.com/640/360' />
</div>
<div class='slideIt'>
<img src='https://www.fillmurray.com/640/360' />
</div>
<div class='slideIt'>
<img src='https://www.fillmurray.com/640/360' />
</div>
</div>
</div>
推荐阅读
- android-studio - 新的“Empty Acitivity”模板应用程序上未显示材料设计
- permissions - 给予管理员同意后如何修复“AADSTS90094:此应用程序需要对另一个应用程序的应用程序权限”错误
- windows - 如何在 Windows 启动时运行 git bash 脚本
- cypress - 通过嵌套的 ng-reflect-model 值获取元素
- java - Jackson 将 POJO 序列化为 JS 对象
- java - Java7 WeakHashMap isEmpty() 似乎是错误的
- c++ - 如何在 C++ 中创建定时器 无法计算出 CALLBACK 的定时器 ID 值
- c# - 如何更改组合框项目文本翻译?
- javascript - 福米克 | 如何使用多个验证模式并为表单呈现拆分视图
- sql - 从多个日期范围中提取每周的天数