在最后一张幻灯片之后单击屏幕右侧的第 1 个/在第 2 个幻灯片之后的第 1 个中单击屏幕左侧

Posted

技术标签:

【中文标题】在最后一张幻灯片之后单击屏幕右侧的第 1 个/在第 2 个幻灯片之后的第 1 个中单击屏幕左侧【英文标题】:click on right of screen come 1st after last slide/click on left of screen in come 1st after 2nd slide 【发布时间】:2020-01-26 11:25:13 【问题描述】:

当我点击屏幕右侧的当前幻灯片(第一张)时,从右向左滑动并显示第二张幻灯片和第三张、第四张、第五张幻灯片,但是在下次点击(第五次)时,不显示第一张幻灯片并且有黑屏。另外,当我单击屏幕左侧的当前幻灯片(第一张)时,从左向右滑动并显示第 5 张幻灯片和第 4、3、2 张幻灯片,但在下次单击(第 5 次)时,不显示第 1 张幻灯片是空白屏幕。幻灯片编号在点击屏幕左侧和右侧时效果很好。我在下面给出了html结构和jquery。任何人都可以改进它来解决这个问题。提前致谢。

HTML

<div class="home-slide">
    <div class="slide-wrapper">
        <div class="slide">slide 1</div>
        <div class="slide">slide 2</div>
        <div class="slide">slide 3</div>
        <div class="slide">slide 4</div>
        <div class="slide">slide 5</div>
    </div>
</div>
<div class="slide-number">
    <div class="active">1</div>
    <div>2</div>
    <div>3</div>
    <div>4</div>
    <div>5</div>
</div>

CSS

.slide-wrapper 
  display: flex;
  width: 100%;
  height: 100%;
  color: #fff;

.slide 
    position: absolute;
    width: 100%;
    height: 100%;
    min-height: 100%;
    padding: 100px 40px;
    clip: rect(0 1366px 660px 0);
    -webkit-transition: linear .5s;
    transition: linear .5s;
    cursor: pointer;
    border-right: 1px solid #000;

.slide:nth-child(1) 
    background-color: #F2358D;
    /*--magenta shade--*/
    z-index: 5;

.slide:nth-child(2) 
    background-color: #04D9B2;
    /*--cyne shade--*/
    z-index: 4;

.slide:nth-child(3) 
    background-color: #F2C53D;
    /*--yellow shade--*/
    z-index: 3;

.slide:nth-child(4) 
    background-color: #6a8aff;
    /*--blue shade--*/
    z-index: 2;

.slide:nth-child(5) 
    background-color: #3FFF42;
    /*--green shade--*/
    z-index: 1;

.slide-clip-left 
    clip: rect(0 1365px 660px 1365px);

.slide-clip-right
    clip: rect(0 0 1365px 0);


.slide-number 
    display: flex;
    max-width: 100%;
    position: absolute;
    bottom: 0;
    left: 45%;
    transform-x: 50%;
    text-align: center;
    z-index: 999;


.slide-number div 
    padding: 20px 10px;
    opacity: .5;

.slide-number div.active 
    opacity: 1;

jquery

var $numbers = $('.slide-number').children();
var $slides = $('.slide');
var numSlides = $slides.length;
var currentSlideL = 0;
var currentSlideR = 0;

$('.slide').click(function(e) 
    var pWidth = $(this).innerWidth(); //use .outerWidth() if you want borders
    var pOffset = $(this).offset(); 
    var x = e.pageX - pOffset.left;

    if(pWidth/2 > x)
        currentSlideL = (currentSlideL - 1) % numSlides;
        var $targetL = $slides.eq(currentSlideL);
        setTimeout(() => 
            $(this).addClass('slide-clip-left').animate('z-index': 1 );
            $numbers.eq(currentSlideL).addClass('active').siblings().removeClass('active');
        , 500);
        $target.removeClass('slide-clip-left').delay(200).animate('z-index': 5 );
    
    else if(pWidth/2 < x) 
        currentSlideR = (currentSlideR + 1) % numSlides;
        var $targetR = $slides.eq(currentSlideR);
        setTimeout(() => 
            $(this).addClass('slide-clip-right').animate('z-index': 1 );
            $numbers.eq(currentSlideR).addClass('active').siblings().removeClass('active');
        , 500);
        $target.removeClass('slide-clip-right').delay(200).animate('z-index': 5 );
    
);

当我点击屏幕右侧时,我希望滑块能正常工作,应该显示第一张幻灯片,当点击屏幕左侧时,第二张幻灯片后会显示第一张幻灯片。

【问题讨论】:

发布你的 CSS ,并且在你的代码中 $target 没有定义 @Sim1-81,感谢您的回复。我将 $target 分别设置为 $targetL 和 $targetR 并且它可以工作。但是另一个问题是,当我在屏幕的任何一侧单击继续时,没关系,但在我单击另一侧时,幻灯片不显示并且屏幕变黑。你能帮我出什么问题吗?请在我更新时检查 css。 在解决方案下方,但对您的代码进行了一些操作,希望对您有所帮助 【参考方案1】:

好的,我得到了解决方案,但我改变了方法。 这里是新代码。我还为滑块添加了一些响应能力。现在我检查左边距而不是 z-index 来为滑块容器设置动画,而不仅仅是 1 张幻灯片,所以我不必知道当前幻灯片是哪一张来找到下一张,我只关心是否边距小于 0 并且大于 .slide 宽度和 .slider-wrapper 宽度之间的差异。这样,当您单击左侧时,我会在左侧边距中减去当前的.slide 宽度,并在单击右侧时添加它。看看resize_slider() 函数。最后一件事但不是为了相关性,将.stop() 放在.animate() 之前可以防止动画重叠。 附:您可以使用相同的方法通过 CSS 变换制作动画

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>


        <style>
            body margin: 0; padding:0
            .home-slide
                overflow: hidden;
                width: 100%;
            
            .slide-wrapper 
                display: flex;
                flex-direction: row;
                overflow: hidden;
                width: 100%;
                height: 80vh;
                color: #fff;
               
            
            .slide 
                position: relative;
                height: 100%;
                min-height: 100%;
                padding: 100px 40px;
                
                -webkit-transition: linear .5s;
                transition: linear .5s;
                cursor: pointer;
                border: none;
                box-sizing: border-box;
                font-size: 20px
            

            .slide:nth-child(1) 
                background-color: #F2358D;
                /*--magenta shade--*/

            
            .slide:nth-child(2) 
                background-color: #04D9B2;
                /*--cyne shade--*/

            
            .slide:nth-child(3) 
                background-color: #F2C53D;
                /*--yellow shade--*/

            
            .slide:nth-child(4) 
                background-color: #6a8aff;
                /*--blue shade--*/

            
            .slide:nth-child(5) 
                background-color: #3FFF42;
                /*--green shade--*/

            

            .slide-number 
                display: flex;
                max-width: 100%;
                position: absolute;
                bottom: 0;
                left: 45%;
                transform-x: 50%;
                text-align: center;
                z-index: 999;
            

            .slide-number div 
                padding: 20px 10px;
                opacity: .5;
            
            .slide-number div.active 
                opacity: 1;
            

        </style>
    </head>
    <body>
        <div class="home-slide">
            <div class="slide-wrapper">
                <div class="slide">slide 1</div>
                <div class="slide">slide 2</div>
                <div class="slide">slide 3</div>
                <div class="slide">slide 4</div>
                <div class="slide">slide 5</div>
            </div>
        </div>
        <div class="slide-number">
            <div class="active">1</div>
            <div>2</div>
            <div>3</div>
            <div>4</div>
            <div>5</div>
        </div>
        
        <script>
            var $numbers,$slides,numSlides,isSliding,currSlide = 1;

            console.log('numSlides', numSlides)
            $(document).ready(function () 
                resizeSlides();

                $('.slide').click(function (e) 
                    var pWidth = $(this).outerWidth(); //use .outerWidth() if you want borders
                    var pOffset = $(this).offset();
                    var x = e.pageX - pOffset.left;
                    console.log($('.slide-wrapper').css('marginLeft'))
                    var posX = Math.floor(parseInt($('.slide-wrapper').css('marginLeft').replace('px')));
                    var sliderW = Math.floor($('.slide-wrapper').width())
                    var direction;
                    
                    if (pWidth / 2 > x) 
                        direction = 'left';

                     else if (pWidth / 2 < x) 
                        direction = 'right';
                    
                    
                    console.log('(pWidth - sliderW)',(pWidth - sliderW));
                    
                    console.log('posX', posX);
                    console.log('typeof posX', typeof posX);
                    console.log('pWidth', pWidth);
                    console.log('sliderW', sliderW);
                    console.log('(pWidth - sliderW)',(pWidth - sliderW));

                    if (!isSliding) 
                        isSliding = true;
                        if (direction == 'left' && posX < 0) 
                            $('.slide-wrapper').stop().animate('marginLeft': '+=' + pWidth + 'px', 500, function () 
                                currSlide--;
                                $('.slide-number .active').removeClass('active')
                                $('.slide-number div:nth-child(' + (currSlide) + ')').addClass('active');
                                
isSliding = false;
                            );
                         else if (direction == 'right' && (pWidth - sliderW) < posX) 
                            $('.slide-wrapper').stop().animate('marginLeft': '-=' + pWidth + 'px', 500, function () 
                                currSlide++;
                                $('.slide-number .active').removeClass('active')
                                $('.slide-number div:nth-child(' + (currSlide) + ')').addClass('active');
                                 
isSliding = false;
                            );
                        
                        setTimeout(function () 
                            isSliding = false;
                        , 500)
                    
                );

            )



            $(window).resize(function () 
                resizeSlides();
            );
            function  resizeSlides() 
                $numbers = $('.slide-number').children();
                $slides = $('.slide');
                numSlides = $slides.length;
                isSliding = false;
                currSlide = 1;
                var sliderW = Math.floor($('.home-slide').width());

                var numSlides = $('.slide-number').children().length;
                $('.slide').each(function () 
                    $(this).outerWidth(sliderW); 
                );
                $('.slide-wrapper').width(sliderW * numSlides);
            
        </script>
    </body>
</html>

【讨论】:

非常感谢您的编码和努力。这是很好的方法。但我正在尝试使用 css 剪辑效果来制作不同的滑块动画,并且不想改变方式。很抱歉。 好的,如果你不想改变方法,我可以给你一点提示,你的代码很有效,但我认为,你应该只为 currentSlide 使用一个变量,你不'不需要currSlideL和currSLideR,只需要currSlide,并检查它是否总是大于0并且小于slides.length在每张幻灯片改变之前根据左键单击或右键单击增加或减少

以上是关于在最后一张幻灯片之后单击屏幕右侧的第 1 个/在第 2 个幻灯片之后的第 1 个中单击屏幕左侧的主要内容,如果未能解决你的问题,请参考以下文章

react-slick 最后一张幻灯片在加载时首先显示

如何将幻灯片与滑动器滑块对齐?

JavaScript开关中的幻灯片动画不一致

光滑的轮播 JS 库在第一张幻灯片上堆叠所有内容

删除第一张和最后一张幻灯片SwiperJS的效果

BxSlider 将最后一张幻灯片显示为第一张幻灯片