【问题标题】:how to customize jQuery image preview code如何自定义jQuery图像预览代码
【发布时间】:2021-09-11 19:41:28
【问题描述】:

我正在使用以下 jquery 脚本在上传前预览多张图片,效果很好,但我无法自定义它以匹配我的规格

 <script>

  $(document).ready(function(){

$(function() {
// Multiple images preview in browser
var imagesPreview = function(input, placeToInsertImagePreview) {

    if (input.files) {
        var filesAmount = input.files.length;

        for (i = 0; i < filesAmount; i++) {
            var reader = new FileReader();

            reader.onload = function(event) {
                $($.parseHTML('<img>')).attr('src', event.target.result).appendTo(placeToInsertImagePreview);
            }

            reader.readAsDataURL(input.files[i]);
        }
    }

};

$('#product_sub_images').on('change', function() {
    imagesPreview(this, 'div.gallery');
  });
 });
});

</script>

我需要做一个

  • 图像的固定宽度和高度,例如 200 像素或在引导程序 4 中显示为拇指
  • 将图片放在一行中,左右边距为 10 像素,如果一行中的所有图片没有足够的空间,它们将换行到下一行

注意: 我在我的代码中使用 bootstrap 4

【问题讨论】:

    标签: javascript html jquery css bootstrap-4


    【解决方案1】:

    不要使用 FileReader 将它们读取为 base64,而是使用 URL.createObjectURL

    jQuery($ => {
      /**
       * Multiple images preview in browser
       * 
       * @param {HTMLInputElement} input
       * @param {string} placeToInsertImagePreview
       */
      function imagesPreview (input, placeToInsertImagePreview) {
        for (const file of input.files) {
          $('<div>', {
            class: 'thumb-c',
            style: `background-image: url(${URL.createObjectURL(file)})`
          }).appendTo(placeToInsertImagePreview)
        }
      }
    
      $('#product_sub_images').on('change', function() {
        imagesPreview(this, 'div.gallery')
      })
    })
    

    【讨论】:

    • 有什么不同??
    • Base64 占用更多内存,而 ObjectURL 是直接指向文件位置的 url。因此它可以直接读取二进制数据,而不必将其解码为base64,然后再解码为二进制并浪费cpu和时间。 ObjectURL 加载速度更快 + 需要更少的代码。而且你不需要任何回调
    • ahaaaa 我明白你的想法非常感谢你
    【解决方案2】:

    这是一个将它们显示为背景图像的示例。这使您可以将它们保持在一致的高度和宽度。它确实会裁剪它们,但如果您想以一致的大小显示它们,这是不可避免的。

    您的代码将是:

    $(function() {
      // Multiple images preview in browser
      var imagesPreview = function(input, placeToInsertImagePreview) {
        if (input.files) {
          var filesAmount = input.files.length;
          for (i = 0; i < filesAmount; i++) {
            var reader = new FileReader();
            reader.onload = function(event) {
              $($.parseHTML('<div>')).addClass('thumb-c').css('background-image', `url(${event.target.result})`).appendTo(placeToInsertImagePreview);
            }
            reader.readAsDataURL(input.files[i]);
          }
        }
      };
    
      $('#product_sub_images').on('change', function() {
        imagesPreview(this, 'div.gallery');
      });
    });
    

    这里有一个可测试的 sn-p 来展示。我将图像设置为 100x100,以便您更好地查看布局,但您可以在 css 中进行更改

    let imgs = [
        "https://via.placeholder.com/350x150",
        "https://via.placeholder.com/350x150",
        "https://via.placeholder.com/350x150",
        "https://via.placeholder.com/350x150"
      ],
      placeToInsertImagePreview = $('.gallery');
    
    imgs.forEach(i => $($.parseHTML('<div>')).addClass('thumb-c').css('background-image', `url(${i})`).appendTo(placeToInsertImagePreview));
    .thumb-c {
      width: 100px;
      height: 100px;
      background-size: cover;
      background-repeat: no-repeat;
      background-position: center;
      border-radius: 4px;
      float: left;
      margin:0 10px 10px 0;
    }
    <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>
    
    <div class='gallery'>
    
    </div>

    【讨论】:

    • 我在我之前的代码中使用了你的 css 代码和 addClass 函数,如下所示,并且完美运行 $($.parseHTML('')).addClass('thumb-c').attr( 'src', event.target.result).appendTo(placeToInsertImagePreview);
    • @MokhtarGhaleb - 是的,但它可能会扭曲任何不是 1x1 比例的图像。不过,很高兴它有所帮助
    猜你喜欢
    • 1970-01-01
    • 2014-08-14
    • 1970-01-01
    • 2020-12-11
    • 2021-04-29
    • 2018-09-26
    • 2019-07-27
    • 1970-01-01
    相关资源
    最近更新 更多