我目前正在开发一个带有大约 14 个不同国家国旗的国旗滑块。
我想要的动画是有一个容器/卡片,卡片上仅显示 3 个国家,2 秒后滑动:
左侧的国家/地区移出容器 中间的国家移至左侧 右侧的国家/地区向中间移动,并在移动时稍微缩放(因此会弹出更多)。
一个新的国家移至右侧。
我遇到的问题是我不知道如何将中间图像居中到卡片的中间,因为我实现它的方式是有 14 个图像,当我使用justify-content: center;
时菲律宾在卡片上显示在中间,这是正常的,但不是期望的结果。
到目前为止我尝试过的:
Justify-content: center;
在 div 上
这是我的第一篇 Stackoverflow 帖子,我希望我能清楚地解释一切,如果没有,请随时提供有关如何改进我的帖子的反馈。
代码:
const slider = document.querySelector('.flag-slider');
const flags = document.querySelectorAll('.flag');
let currentIndex = 2; // Middle flag
function updateFlags() {
flags.forEach((flag, index) => {
flag.classList.remove('active');
if (index === currentIndex - 1) {
flag.classList.add('active');
}
});
}
function slideFlags() {
// Slide to the left
slider.style.transform = `translateX(-${(currentIndex - 1) * (75 / 3)}%)`;
currentIndex++;
if (currentIndex > flags.length) {
console.log('reset');
currentIndex = 2;
slider.style.transform = `translateX(0%)`;
}
updateFlags();
}
// Initial flag setup
updateFlags();
// Auto-slide every 2 seconds
setInterval(slideFlags, 2000);
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: Arial, sans-serif;
background-color: #f0f0f0;
}
.countries {
display: flex;
flex-direction: column;
justify-content: center;
width: 300px;
padding: 20px;
}
.slider-container {
width: 100%;
margin: 50px auto;
overflow: hidden;
position: relative;
}
.flag-slider {
display: flex;
transition: transform 0.5s ease-in-out;
}
.flag,
.last_flag {
width: 33.33%;
padding: 10px;
display: flex;
justify-content: center;
align-items: center;
transition: transform 0.5s ease-in-out, opacity 0.5s ease-in-out;
}
.flag img {
width: 100%;
object-fit: contain;
}
.flag.active {
transform: scale(1.2);
}
<html class="no-js" lang="">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title></title>
<link rel="stylesheet" href="css/style.css">
<meta name="description" content="">
<meta property="og:title" content="">
<meta property="og:type" content="">
<meta property="og:url" content="">
<meta property="og:image" content="">
<meta property="og:image:alt" content="">
<link rel="icon" href="/favicon.ico" sizes="any">
<link rel="icon" href="/icon.svg" type="image/svg+xml">
<link rel="apple-touch-icon" href="icon.png">
<link rel="manifest" href="site.webmanifest">
<meta name="theme-color" content="#fafafa">
</head>
<body>
<div class="countries">
<div class="slider-container">
<div class="flag-slider">
<img class="flag" src="https://picsum.photos/200" alt="Australia">
<img class="flag" src="https://picsum.photos/200" alt="Austria">
<img class="flag" src="https://picsum.photos/200" alt="Brazil">
<img class="flag" src="https://picsum.photos/200" alt="Canada">
<img class="flag" src="https://picsum.photos/200" alt="France">
<img class="flag" src="https://picsum.photos/200" alt="Germany">
<img class="flag" src="https://picsum.photos/200" alt="India">
<img class="flag" src="https://picsum.photos/200" alt="Mexico">
<img class="flag" src="https://picsum.photos/200" alt="Philippines">
<img class="flag" src="https://picsum.photos/200" alt="South Africa">
<img class="flag" src="https://picsum.photos/200" alt="Egypt">
<img class="flag" src="https://picsum.photos/200" alt="UK">
<img class="flag" src="https://picsum.photos/200" alt="USA">
<img class="flag" src="https://picsum.photos/200" alt="Venezuela">
<img class="flag" src="https://picsum.photos/200" alt="Australia">
<img class="last_flag" src="https://picsum.photos/200" alt="Austria">
</div>
</div>
<span>Different countries</span>
</div>
<script src="js/app.js"></script>
</body>
</html>
我尝试计算它并对其进行硬编码,但它适用于固定宽度,但如果屏幕较小,则不起作用。
transform
属性将元素从原始位置移动。如果您在此处使用更好的值进行计算,您的元素将居中。
// Changed 75 / 3 to 100 / 3
slider.style.transform = `translateX(-${(currentIndex - 1) * (100 / 3)}%)`;
const slider = document.querySelector('.flag-slider');
const flags = document.querySelectorAll('.flag');
let currentIndex = 2; // Middle flag
function updateFlags() {
flags.forEach((flag, index) => {
flag.classList.remove('active');
if (index === currentIndex - 1) {
flag.classList.add('active');
}
});
}
function slideFlags() {
// Slide to the left
slider.style.transform = `translateX(-${(currentIndex - 1) * (100 / 3)}%)`;
currentIndex++;
if (currentIndex > flags.length) {
console.log('reset');
currentIndex = 2;
slider.style.transform = `translateX(0%)`;
}
updateFlags();
}
// Initial flag setup
updateFlags();
// Auto-slide every 2 seconds
setInterval(slideFlags, 2000);
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: Arial, sans-serif;
background-color: #f0f0f0;
}
.countries {
display: flex;
flex-direction: column;
justify-content: center;
width: 300px;
padding: 20px;
}
.slider-container {
width: 100%;
margin: 50px auto;
overflow: hidden;
position: relative;
}
.flag-slider {
display: flex;
transition: transform 0.5s ease-in-out;
}
.flag,
.last_flag {
width: 33.33%;
padding: 10px;
display: flex;
justify-content: center;
align-items: center;
transition: transform 0.5s ease-in-out, opacity 0.5s ease-in-out;
}
.flag img {
width: 100%;
object-fit: contain;
}
.flag.active {
transform: scale(1.2);
}
<div class="countries">
<div class="slider-container">
<div class="flag-slider">
<img class="flag" src="https://picsum.photos/200" alt="Australia">
<img class="flag" src="https://picsum.photos/200" alt="Austria">
<img class="flag" src="https://picsum.photos/200" alt="Brazil">
<img class="flag" src="https://picsum.photos/200" alt="Canada">
<img class="flag" src="https://picsum.photos/200" alt="France">
<img class="flag" src="https://picsum.photos/200" alt="Germany">
<img class="flag" src="https://picsum.photos/200" alt="India">
<img class="flag" src="https://picsum.photos/200" alt="Mexico">
<img class="flag" src="https://picsum.photos/200" alt="Philippines">
<img class="flag" src="https://picsum.photos/200" alt="South Africa">
<img class="flag" src="https://picsum.photos/200" alt="Egypt">
<img class="flag" src="https://picsum.photos/200" alt="UK">
<img class="flag" src="https://picsum.photos/200" alt="USA">
<img class="flag" src="https://picsum.photos/200" alt="Venezuela">
<img class="flag" src="https://picsum.photos/200" alt="Australia">
<img class="last_flag" src="https://picsum.photos/200" alt="Austria">
</div>
</div>
<span>Different countries</span>
</div>