<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>my slider</title>
    <link rel="icon" type="image/x-icon" href="../pages/images/favicon.ico">

    <!-- stylesheet  -->
    <style type="text/css">
        body {
            margin: 0px;
            padding: 0px;
        }
        .card-container {
            width: 100%;
            overflow: hidden;
            border: 2.5px solid #000000;
            margin: 20px auto;
        }

        .card-slider {
            display: flex;
            border: 1.5px solid #ff0000;
        }
        
        .card {
            flex: 0 0 auto;
            width: 100%;
            max-width: 300px;
            height: 200px;
            margin-right: 20px;
            transition: transform 0.5s ease;
            text-align: center;
        }

        .prev, .next {
            cursor: pointer;
            position: absolute;
            top: 50%;
            margin-top: -285px;
        }

        .next {
            right: 0px;
        }

    </style>

</head>
<body>
    <div class="card-container">
        <div class="card-slider">
            <div class="card" style="background-color: #0ffff0;">Card One</div>
            <div class="card" style="background-color: #cab;">Card Two</div>
            <div class="card" style="background-color: #12abc2;">Card Three</div>
            <div class="card" style="background-color: #9000bc;">Card Four</div>
            <div class="card" style="background-color: #500bc1;">Card Five</div>
            <div class="card" style="background-color: #acb111;">Card Six</div>
        </div>
    </div>
    <button class="prev" onclick="previousSlide()">&#10094;</button>
    <button class="next" onclick="nextSlide()">&#10095;</button>

    <script type="text/javascript">
        let currentCard = 0;
        let cards = document.querySelectorAll(".card");
        let totalCards = cards.length;

        
        function showCard() {
            cards[currentCard].style.transform = `translateX(${-100}%)`; // trying to move this card left
            /* only first click above statement execute correctly and move card left 
            but also other click above statement execute but not as I expect
            on second, third etc click above statement move card right direction instead of left direction
            I got the correct logic for above statement to excecute correct way to move card in left direction
            I modify the above statement from this  cards[currentCard].style.transform = `translateX(${-100}%)`;
            to this cards[currentCard].style.transform = `translateX(${-100 * (currentCard + 1)}%)`;
            but I want explanation why cards[currentCard].style.transform = `translateX(${-100}%)`; statement
            move cards to right direction not for first click but second, third etc clicks. */


                // after moving above card space created between currentCard and currentCard +1

                // this for loop for  remove space between the cards
                for(let i = currentCard + 1; i < totalCards; i++ ) {
                // cards[i].style.transform = `translateX(${-100}%)`;
                // cards[i].style.transform = `translateX(${-100 * (currentCard + 1) }%)`;
                cards[i].style.transform = `translateX(calc(${-100 * (currentCard + 1)}% + ${(currentCard + 1) * -20}px ))`;
                console.log("Value of i: ", i, " currentCard: ", currentCard);
            }
            // after come out from for loop slide currentCard end of the all other cards
            cards[currentCard].style.transform = `translateX(${100 * totalCards}%)`;

            // increment currentCard
            currentCard++;
        }
        
        function nextSlide () {
            showCard();
        }
    </script>

</body>
</html>

我正在try 创建一个卡片滑动器来滑动单个卡片 我的逻辑:

函数show card(){.} 该功能的第一个声明是左滑当前卡-100% 滑动currentCard和currentCard +1之间的当前卡空间后 删除空间,创建一个循环以将卡片一一滑动至100%

从for循环出来后,将当前卡移至最后一张卡的结尾

增量currentCard; 函数nextSlide(){.} 显示当前卡

但showCard()的第一个声明{.}函数和for循环只运行一次. 为什么??我的代码中有什么问题请回答我的问题或帮助我提供更好的解决方案或一步一步解释我的代码.

推荐答案

您的代码有逻辑问题.滑动后转换必须增加,您可以使用currentCard变量来实现这一点.

溶液

for ( let i = currentCard +1; i < totalCards; i++ ) {
   cards[i].style.transform = `translateX(${-100 * (currentCard + 1) }%)`; // Check this line
   console.log("Value of i: ",i, " currentCard: ",currentCard);
} 

现在你应该包括卡片之间的差距(保证金大小),我将使用calc css方法将百分比(%)与px相加,代码如下:

for ( let i = currentCard +1; i < totalCards; i++ ) {
   cards[i].style.transform = `translateX(calc(${-100 * (currentCard + 1)}% + ${(currentCard+1) * -20}px ))`; // Add -20px for the cards margin
   console.log("Value of i: ",i, " currentCard: ",currentCard);
} 

它现在工作得很完美.


Edit:

更多的解释

当您按下next button时,for循环会将每张牌移动-100%,当您再次点击它时,牌将不再移动,因为translateX仍然与第一次点击-100%相同.

因此这里的逻辑是每次点击都会将translateX增加-100%,例如:-100% > -200% > -300% > ...

在您的showCard函数中,每次执行currentCard都会增加1(当然,当单击按钮时,该函数会执行).

现在,我们可以使用这个变量来应用我们的逻辑:

cards[i].style.transform = `translateX(${-100 * (currentCard + 1) }%)`;

currentCard的初始值是0-100 * 0等于0,但我们需要在第一次执行时为-100,所以我们需要向它添加1.-100 * 1 = -100

而且它会起作用,现在为了消除每张卡由margin-right: 20px造成的空白,我们将应用相同的逻辑,但使用-20而不是-100,并使用css calc方法组合这两个操作.

cards[i].style.transform = `translateX(calc(${-100 * (currentCard + 1)}% + ${(currentCard + 1) * -20}px ))`;

translateX的值(使用calc方法)将是(按单击顺序): -100% - 20px > -200% - 40px > -300% - 60px > ...

Javascript相关问答推荐

我可以后增量超过1(最好是内联)吗?

我试图实现用户验证的reduxstore 和操作中出了什么问题?

Cookie中未保存会话数据

如何在Javascript中的控制台上以一行形式打印循环的结果

配置WebAssembly/Emscripten本地生成问题

Ember.js 5.4更新会话存储时如何更新组件变量

如何通过将实例方法的名称传递给具有正确类型的参数的继承方法来调用实例方法?

使用js构造一个html<;ath&>元素并不能使其正确呈现

第三方包不需要NODE_MODULES文件夹就可以工作吗?

Angular 形式,从DOM中删除不会删除指定索引处的内容,但会删除最后一项

<;img>;标记无法呈现图像

如何防止ionic 输入中的特殊字符.?

Next.js中的服务器端组件列表筛选

P5.js中的分形树

构建器模式与参数对象输入

FireBase FiRestore安全规则-嵌套对象的MapDiff

调用特定数组索引时,为什么类型脚本不判断未定义

是否有静态版本的`instanceof`?

在范围数组中查找公共(包含)范围

Played link-Initialize.js永远显示加载符号