隐藏块而不是删除

Posted

技术标签:

【中文标题】隐藏块而不是删除【英文标题】:Hide blocks instead of deleting 【发布时间】:2022-01-07 01:54:13 【问题描述】:

我有一个小滑块,可以将预览图像切换到主图像。现在可以正常使用了

blade.php

<div class="custom-carousel">
    @if(!empty($article_block_images)) @foreach($article_block_images as $article_block_image)
    <div class="custom-carousel__title">
        @if($loop->first)
        <span> $article_block_image->title </span> @endif
    </div>
    @endforeach @endif @if(!empty($article_block_images)) @foreach($article_block_images as $article_block_image)
    <div class="main-image">
        @if($loop->first)
        <picture>
            <source srcset=" $article_block_image->mobile_image " media="(max-width: 576px)"  title=" $article_block_image->image_title " data-title=" $article_block_image->title ">
            <source srcset=" $article_block_image->main_image "  title=" $article_block_image->image_title " data-title=" $article_block_image->title ">
            <img src=" $article_block_image->main_image "  title=" $article_block_image->image_title " data-title=" $article_block_image->title ">
        </picture>
        @endif
    </div>
    @endforeach @endif
    <div class="img-to-select">
        @if(!empty($article_block_images)) @foreach($article_block_images as $article_block_image)
        <div @if($loop->first) class="img-to-select__item selected" @else class="img-to-select__item" @endif>
            <img src=" $article_block_image->preview_image "  title=" $article_block_image->image_title " data-title=" $article_block_image->title " data-main-src=" $article_block_image->main_image " data-mobile-src=" $article_block_image->mobile_image ">
        </div>
        @endforeach @endif
    </div>
</div>

js

$('.img-to-select__item').click(function () 
  $('.img-to-select__item').removeClass('selected');
  $(this).addClass('selected');
  let mainSrc = $(this).children('img').data('main-src')
  let mobileSrc = $(this).children('img').data('mobile-src')
  let title = $(this).children('img').attr('title')
  let alt = $(this).children('img').attr('alt')
  $('.main-image > picture').html(`
    <source srcset="$mobileSrc" media="(max-width: 576px)"  title="$title">
    <source srcset="$mainSrc"  title="$title">
    <img src="$mainSrc"  title="$title">
  `);
  $('.custom-carousel__title > span').html($(this).children('img').attr('data-title'));
);

但现在的问题是,当我切换图像时,所有的块都被删除了,然后它们似乎又被加载回来了,因此页面上的所有内容都在抽搐,无法按我们的意愿工作

是否有可能做一些事情,以便立即加载这些块,并在切换不必要的块时隐藏,并显示必要的块?

如果我添加 style="display: none" 那么我需要如何重新编写脚本,以便所有内容都被隐藏和显示,而不是删除和重新打开

如果我使用.hide().show() 而不是.html() 是否有效?

像这样

.hide(`
    <source srcset="$mobileSrc" media="(max-width: 576px)"  title="$title">
    <source srcset="$mainSrc"  title="$title">
    <img src="$mainSrc"  title="$title">
  `)

当使用.hide().show()时,这里的检查条件应该是什么

【问题讨论】:

老实说,我没有看到一个简单的改变可以实现这一点。这段代码似乎非常锁定在每次点击时替换 HTML 的方法。您需要从顶部再看一遍。 @apokryfos 那么有哪些选择呢?这样每次点击都不会重新加载所有内容? 当你渲染你的页面时,加载所有的图片,但是那些不应该被选中的应该有一个style="display: none",那么你可以在当前可见的图片上使用.hide(),在当前可见的图片上使用.show()你想在之后展示。我认为加载时间会更长,因为所有内容都会在开始时加载,但用户可能不会注意到,因为 HTML 将在图像之前加载,并且应该首先加载可见图像 @apokryfos 也就是说,我基本上需要删除@if($loop-&gt;first),但是我应该怎么做才能自动显示第一张图片 是的,您可以使用&lt;div class="main-image" style="display: $loop-&gt;first ? 'block' : 'none' "&gt;,但是您需要找到正确的图像以显示在您的 JS 中 【参考方案1】:

改变你的观点:

<div class="custom-carousel">
    @if(!empty($article_block_images)) @foreach($article_block_images as $article_block_image)
    <div class="custom-carousel__title">
        @if($loop->first)
        <span> $article_block_image->title </span> @endif
    </div>
    @endforeach @endif @if(!empty($article_block_images)) @foreach($article_block_images as $article_block_image)
    <div class="main-image" style="display:  $loop->first?'block':'none'">
        <picture>
            <source srcset=" $article_block_image->mobile_image " media="(max-width: 576px)"  title=" $article_block_image->image_title " data-title=" $article_block_image->title ">
            <source srcset=" $article_block_image->main_image "  title=" $article_block_image->image_title " data-title=" $article_block_image->title ">
            <img src=" $article_block_image->main_image "  title=" $article_block_image->image_title " data-title=" $article_block_image->title ">
        </picture>
    </div>
    @endforeach @endif
    <div class="img-to-select">
        @if(!empty($article_block_images)) @foreach($article_block_images as $article_block_image)
        <div @if($loop->first) class="img-to-select__item selected" @else class="img-to-select__item" @endif>
            <img src=" $article_block_image->preview_image "  title=" $article_block_image->image_title " data-title=" $article_block_image->title " data-main-src=" $article_block_image->main_image " data-mobile-src=" $article_block_image->mobile_image ">
        </div>
        @endforeach @endif
    </div>
</div>

然后在你的 JS 中你可以这样做:

$('.img-to-select__item').click(function () 
  $('.img-to-select__item').removeClass('selected');
  $(this).addClass('selected');
  let index = $(this).index(); // I think
  $('.main-image').hide();
  $('.main-image').eq(index).show();
  $('.custom-carousel__title > span').html($(this).children('img').attr('data-title'));
);

想法是代替替换元素的HTML来找到合适的元素并显示它

【讨论】:

似乎一切正常,切换图片时也没有闪退和下载,非常感谢帮助)

以上是关于隐藏块而不是删除的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin Forms Firebase DeleteAsync 逻辑 - 为啥删除第一项而不是第二项?

隐藏 ListViewItem 而不是删除它?

隐藏ListViewItem而不是删除它?

使用 CSS 隐藏行而不是使用 DataTables 删除节点

视图加载后是不是可以在工具栏上添加、删除或隐藏按钮?

在 MS 团队机器人中使用提交操作时是不是可以删除/隐藏响应