javascript - 浮动轮播元素环绕而不是全部保留在同一行并且在滚动时不显示
问题描述
我有近 20<div>
张图片在滑块中,但只有 6 张出现:
$(window).load(function() {
var view = $("#tslshow");
var move = "196px";
var sliderLimit = -450
$("#rightArrow").click(function() {
var currentPosition = parseInt(view.css("left"));
if (currentPosition >= sliderLimit) view.stop(false, true).animate({
left: "-=" + move
}, {
duration: 200
})
});
$("#leftArrow").click(function() {
var currentPosition = parseInt(view.css("left"));
if (currentPosition < 0) view.stop(false, true).animate({
left: "+=" + move
}, {
duration: 200
})
});
});
.bstimeslider {
background: transparent;
height: 126px;
position: relative;
width: 1100px;
}
.bktibx {
background: rgba(17,17,17,.7);
color: #ffffff;
display: block;
height: 126px;
float: left;
font-size: 16px;
margin:0 10px 0 0;
width: 186px;
}
.bktibx-top {
background: rgba(17,17,17,.7);
color: #ffffff;
display: block;
float: left;
font-size: 16px;
margin: 0 40px 0 0;
padding: 10px;
width: 166px;
}
.bktibx img {
height: 88px;
padding-top: 0px;
width: 186px;
}
#tslshow {
left: 0;
position: absolute;
width: 1200px;
}
#leftArrow {
background: #ff0000;
height: 45px;
left: 0px;
position: absolute;
top: 41px;
width: 40px;
}
#rightArrow {
background: #ff0000;
height: 45px;
position: absolute;
right: 0px;
top: 41px;
width: 40px;
}
#viewContainer {
background: transparent;
height: 100%;
margin: 0px 40px 0px 40px;
overflow: hidden;
position: absolute;
width: 1020px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<div class="bstimeslider">
<div id="rightArrow"></div>
<div id="viewContainer">
<div id="tslshow">
<div class="bktibx">
<div class="bktibx-top">
transparent
</div>
<img src="https://www.bing.com/th?id=OPN.RTNews_iokoUEg279vnqHFa5nIABQ&w=186&h=88&c=7&rs=2&qlt=80&cdv=1&pid=News"/>
</div>
<div class="bktibx">
<div class="bktibx-top">
transparent
</div>
<img src="https://www.bing.com/th?id=OPN.RTNews_iokoUEg279vnqHFa5nIABQ&w=186&h=88&c=7&rs=2&qlt=80&cdv=1&pid=News"/>
</div>
<div class="bktibx">
<div class="bktibx-top">
transparent
</div>
<img src="https://www.bing.com/th?id=OPN.RTNews_iokoUEg279vnqHFa5nIABQ&w=186&h=88&c=7&rs=2&qlt=80&cdv=1&pid=News"/>
</div>
<div class="bktibx">
<div class="bktibx-top">
transparent
</div>
<img src="https://www.bing.com/th?id=OPN.RTNews_iokoUEg279vnqHFa5nIABQ&w=186&h=88&c=7&rs=2&qlt=80&cdv=1&pid=News"/>
</div>
<div class="bktibx">
<div class="bktibx-top">
transparent
</div>
<img src="https://www.bing.com/th?id=OPN.RTNews_iokoUEg279vnqHFa5nIABQ&w=186&h=88&c=7&rs=2&qlt=80&cdv=1&pid=News"/>
</div>
<div class="bktibx">
<div class="bktibx-top">
transparent
</div>
<img src="https://www.bing.com/th?id=OPN.RTNews_iokoUEg279vnqHFa5nIABQ&w=186&h=88&c=7&rs=2&qlt=80&cdv=1&pid=News"/>
</div>
<div class="bktibx">
<div class="bktibx-top">
transparent
</div>
<img src="https://www.bing.com/th?id=OPN.RTNews_iokoUEg279vnqHFa5nIABQ&w=186&h=88&c=7&rs=2&qlt=80&cdv=1&pid=News"/>
</div>
<div class="bktibx">
<div class="bktibx-top">
transparent
</div>
<img src="https://www.bing.com/th?id=OPN.RTNews_iokoUEg279vnqHFa5nIABQ&w=186&h=88&c=7&rs=2&qlt=80&cdv=1&pid=News"/>
</div>
<div class="bktibx">
<div class="bktibx-top">
transparent
</div>
<img src="https://www.bing.com/th?id=OPN.RTNews_iokoUEg279vnqHFa5nIABQ&w=186&h=88&c=7&rs=2&qlt=80&cdv=1&pid=News"/>
</div>
<div class="bktibx">
<div class="bktibx-top">
transparent
</div>
<img src="https://www.bing.com/th?id=OPN.RTNews_iokoUEg279vnqHFa5nIABQ&w=186&h=88&c=7&rs=2&qlt=80&cdv=1&pid=News"/>
</div>
<div class="bktibx">
<div class="bktibx-top">
transparent
</div>
<img src="https://www.bing.com/th?id=OPN.RTNews_iokoUEg279vnqHFa5nIABQ&w=186&h=88&c=7&rs=2&qlt=80&cdv=1&pid=News"/>
</div>
<div class="bktibx">
<div class="bktibx-top">
transparent
</div>
<img src="https://www.bing.com/th?id=OPN.RTNews_iokoUEg279vnqHFa5nIABQ&w=186&h=88&c=7&rs=2&qlt=80&cdv=1&pid=News"/>
</div>
<div class="bktibx">
<div class="bktibx-top">
transparent
</div>
<img src="https://www.bing.com/th?id=OPN.RTNews_iokoUEg279vnqHFa5nIABQ&w=186&h=88&c=7&rs=2&qlt=80&cdv=1&pid=News"/>
</div>
<div class="bktibx">
<div class="bktibx-top">
transparent
</div>
<img src="https://www.bing.com/th?id=OPN.RTNews_iokoUEg279vnqHFa5nIABQ&w=186&h=88&c=7&rs=2&qlt=80&cdv=1&pid=News"/>
</div>
<div class="bktibx">
<div class="bktibx-top">
transparent
</div>
<img src="https://www.bing.com/th?id=OPN.RTNews_iokoUEg279vnqHFa5nIABQ&w=186&h=88&c=7&rs=2&qlt=80&cdv=1&pid=News"/>
</div>
</div>
</div>
<div id="leftArrow"></div>
</div>
解决方案
您的元素正在包装,因为#tslshow
不够宽,您可以查看是否与检查员核对。
您有 3 个选项来修复它:
使用
white-space: nowrap
anddisplay: inline-block
(您可以在下面的代码段中看到一些额外的调整):.bktibx { display: inline-block; /* Instead of float: left */ } #tslshow { white-space: nowrap; font-size: 0; }
使用弹性盒:
.bktibx { /* Just remove float: left; */ } #tslshow { display: flex; }
使用
max-width: unset
和min-width: max-content
(实验):#tslshow { position: absolute; left: 0; max-width: unset; min-width: max-content; }
使用第一个和第二个选项,您还可以删除position: absolute
from#tslshow
并使用transform: translate(-Npx)
andtransition: translate ease-in 250ms
滚动它并为其设置动画。
在第三个中,您仍然可以使用left
,但使用动画transition: left ease-in 250ms
而不是使用 jQuery。
选项 1 - 空格:nowrap:
const scrollable = document.getElementById('tslshow');
const children = 20;
// Just to avoid having that big ching of HTML:
scrollable.innerHTML = `
<div class="bktibx">
<div class="bktibx-top">Title</div>
<img src="https://www.bing.com/th?id=OPN.RTNews_iokoUEg279vnqHFa5nIABQ&w=186&h=88&c=7&rs=2&qlt=80&cdv=1&pid=News"/>
</div>
`.repeat(children);
const move = 196;
const min = - (move * scrollable.children.length) + 10 + scrollable.offsetWidth;
let current = 0;
document.getElementById('rightArrow').onclick = () => {
current = Math.max(min, current - move);
scrollable.style.transform = `translate(${ current }px)`;
};
document.getElementById('leftArrow').onclick = () => {
current = Math.min(0, current + move);
scrollable.style.transform = `translate(${ current }px)`;
};
.bstimeslider {
background: transparent;
height: 126px;
position: relative;
width: 100%;
}
.bktibx {
background: rgba(17,17,17,.7);
color: #ffffff;
display: block;
height: 126px;
font-size: 16px;
margin:0 10px 0 0;
width: 186px;
/* I have changed this (instead of float: left)... */
display: inline-block;
}
.bktibx-top {
background: rgba(17,17,17,.7);
color: #ffffff;
display: block;
font-size: 16px;
margin: 0 40px 0 0;
padding: 10px;
width: 166px;
/* ...removed the float: left here... */
}
.bktibx img {
height: 88px;
padding-top: 0px;
width: 186px;
}
#tslshow {
/* ...changed this completelly... */
white-space: nowrap;
font-size: 0;
transition: transform ease-in 250ms;
}
#leftArrow {
background: #ff0000;
height: 45px;
left: 0px;
position: absolute;
top: 41px;
width: 40px;
}
#rightArrow {
background: #ff0000;
height: 45px;
position: absolute;
right: 0px;
top: 41px;
width: 40px;
}
#viewContainer {
background: transparent;
height: 100%;
overflow: hidden;
/* ...and changed this. */
position: absolute;
top: 0;
left: 40px;
right: 40px;
}
<div class="bstimeslider">
<div id="rightArrow"></div>
<div id="viewContainer">
<div id="tslshow"></div>
</div>
<div id="leftArrow"></div>
</div>
✨ 选项 2 - Flexbox:
const scrollable = document.getElementById('tslshow');
const children = 20;
// Just to avoid having that big ching of HTML:
scrollable.innerHTML = `
<div class="bktibx">
<div class="bktibx-top">Title</div>
<img src="https://www.bing.com/th?id=OPN.RTNews_iokoUEg279vnqHFa5nIABQ&w=186&h=88&c=7&rs=2&qlt=80&cdv=1&pid=News"/>
</div>
`.repeat(children);
const move = 196;
const min = - (move * scrollable.children.length) + 10 + scrollable.offsetWidth;
let current = 0;
document.getElementById('rightArrow').onclick = () => {
current = Math.max(min, current - move);
scrollable.style.transform = `translate(${ current }px)`;
};
document.getElementById('leftArrow').onclick = () => {
current = Math.min(0, current + move);
scrollable.style.transform = `translate(${ current }px)`;
};
.bstimeslider {
background: transparent;
height: 126px;
position: relative;
width: 100%;
}
.bktibx {
background: rgba(17,17,17,.7);
color: #ffffff;
display: block;
height: 126px;
font-size: 16px;
margin:0 10px 0 0;
width: 186px;
/* I have removed float: left here... */
}
.bktibx-top {
background: rgba(17,17,17,.7);
color: #ffffff;
display: block;
float: left;
font-size: 16px;
margin: 0 40px 0 0;
padding: 10px;
width: 166px;
}
.bktibx img {
height: 88px;
padding-top: 0px;
width: 186px;
}
#tslshow {
/* ...changed this completelly... */
display: flex;
transition: transform ease-in 250ms;
}
#leftArrow {
background: #ff0000;
height: 45px;
left: 0px;
position: absolute;
top: 41px;
width: 40px;
}
#rightArrow {
background: #ff0000;
height: 45px;
position: absolute;
right: 0px;
top: 41px;
width: 40px;
}
#viewContainer {
background: transparent;
height: 100%;
overflow: hidden;
/* ...changed this. */
position: absolute;
top: 0;
left: 40px;
right: 40px;
}
<div class="bstimeslider">
<div id="rightArrow"></div>
<div id="viewContainer">
<div id="tslshow"></div>
</div>
<div id="leftArrow"></div>
</div>
选项 3 - 实验性最大宽度:最大内容
const scrollable = document.getElementById('tslshow');
const children = 20;
// Just to avoid having that big ching of HTML:
scrollable.innerHTML = `
<div class="bktibx">
<div class="bktibx-top">Title</div>
<img src="https://www.bing.com/th?id=OPN.RTNews_iokoUEg279vnqHFa5nIABQ&w=186&h=88&c=7&rs=2&qlt=80&cdv=1&pid=News"/>
</div>
`.repeat(children);
const move = 196;
const min = - (move * scrollable.children.length) + 10 + scrollable.parentElement.offsetWidth;
let current = 0;
document.getElementById('rightArrow').onclick = () => {
current = Math.max(min, current - move);
scrollable.style.left = `${ current }px`;
};
document.getElementById('leftArrow').onclick = () => {
current = Math.min(0, current + move);
scrollable.style.left = `${ current }px`;
};
.bstimeslider {
background: transparent;
height: 126px;
position: relative;
width: 100%;
}
.bktibx {
background: rgba(17,17,17,.7);
color: #ffffff;
display: block;
height: 126px;
float: left;
font-size: 16px;
margin:0 10px 0 0;
width: 186px;
}
.bktibx-top {
background: rgba(17,17,17,.7);
color: #ffffff;
display: block;
float: left;
font-size: 16px;
margin: 0 40px 0 0;
padding: 10px;
width: 166px;
}
.bktibx img {
height: 88px;
padding-top: 0px;
width: 186px;
}
#tslshow {
left: 0;
position: absolute;
/* I have change this... */
max-width: unset;
min-width: max-content;
transition: left ease-in 250ms;
}
#leftArrow {
background: #ff0000;
height: 45px;
left: 0px;
position: absolute;
top: 41px;
width: 40px;
}
#rightArrow {
background: #ff0000;
height: 45px;
position: absolute;
right: 0px;
top: 41px;
width: 40px;
}
#viewContainer {
background: transparent;
height: 100%;
overflow: hidden;
/* ...and this */
position: absolute;
top: 0;
left: 40px;
right: 40px;
}
<div class="bstimeslider">
<div id="rightArrow"></div>
<div id="viewContainer">
<div id="tslshow"></div>
</div>
<div id="leftArrow"></div>
</div>
推荐阅读
- machine-learning - 提取属性 Open Vino 时发生意外异常
- jquery - Laravel - 编辑模式表单下拉列表不显示数据
- apache-beam - 延迟数据处理 | 阿帕奇梁
- java - Hashtable 比 HashMap 快?
- php - Xdebug 总是等待 idekey 与 PhpStorm 和 WAMP 服务器的传入连接
- python-3.x - 在传递的变量中渲染 Jinja 标记
- python - 使用列表乘法方法初始化几个空列表将它们链接在一起?
- c# - 有没有办法测试 Singleton 是否被多次实例化
- ruby-on-rails - file_fixture_upload 在 rspec rails 6 中始终将 File 对象作为字符串传递
- angular - RESOLVE Angular 属性“照片”在类型“Spot []”上不存在