【问题标题】:Layout theory for a thumbnail gallery [closed]缩略图画廊的布局理论[关闭]
【发布时间】:2012-11-11 04:52:18
【问题描述】:

我正在创建一个与此完全相同的缩略图库 (http://tmv.proto.jp/#!/destroyftw)。目前我正在尝试制定脚本的理论。网页的实际脚本在这里 (http://tmv.proto.jp/tmv_v3.js)。由于我对 javascript 比较陌生,这让我有些沮丧。

我已经尝试过使用 masonry 和 isotope 等插件,但它们无法处理大量图像。更不用说无限滚动不适用于我需要的过滤。所以我决定自己动手编写一个代码。

这个想法是用户提交的图像将被调整为具有设定宽度的缩略图(高度当然会被缩放以保持纵横比)。然后这些缩略图将用于创建画廊。我遇到的问题是我发现布局有点棘手。

页面似乎首先被分成列以形成第一个“行”。之后,缩略图被放置在最左边的最短列中(具体来说,我想知道这种特定图像定位技术背后的理论。)。 Ex:数字也可以理解为图片的id。 (id="i_1",id="i_2"etc...)

这也会导致页面加载时和添加新图像时的级联淡入效果(它们只是根据其 id 淡入)。 我曾尝试使用上述脚本页面作为参考,但无济于事。但是,如果有人想自己检查,我认为负责缩略图定位的功能在“ViewManager”下。

重申一下,我不是在找人为我工作。我只需要帮助制定理论,这样我就有地方开始了。

**Note**(In the script): cellSize= 100; cellMargin=1; doubleSize=201 (cellSize*2+cellMargin); totalCellSize=101 (cellSize+cellMargin);

【问题讨论】:

  • task 远远高于初学者 javascript 水平,somewhere to start 非常主观,不知道你的能力或设计参数是什么
  • 理论是什么?请明确点。听起来你明白该怎么做(添加图像将其添加到最小高度的 col)。您是在询问为什么这是使马赛克均匀增长的最佳策略的理论吗?

标签: javascript jquery image layout gallery


【解决方案1】:

看看

var fixedwidth = 50 + 1, //the +1 is for 1px horizontal margin
    gallery = $('#gallery'), // cache a reference to our container
    imagelist = gallery.children(); // cache a reference to our image list


function layoutImages(){
    var columncount = parseInt(gallery.width()/fixedwidth,10),  // find how many columns fit in container
        columns = [];

    for (var i =0;i<columncount;i++){ // initialize columns (0 height for each)
        columns.push(0);
    }

    imagelist.each(function(i,image){
         var min = Math.min.apply(null, columns), // find height of shortest column
             index = columns.indexOf(min), // find column number with the min height
             x = index*fixedwidth; // calculate horizontal position of current image based on column it belongs

        columns[index] += image.height +1; //calculate new height of column (+1 for 1px vertical margin)
        $(image).css({left:x, top:min}).delay(i*200).animate({opacity:1},100); // assign new position to image and show it
    });
}

$(window).resize(layoutImages).trigger('resize');

http://jsfiddle.net/gaby/DL8Vr/6/的演示


假设

  • 每张图片50像素固定宽度(fixedwidth变量参数化
  • 所有图像都在一个公共容器中(在这种情况下,ID 为 gallery

该演示有一些 CSS 动画,并在调整窗口大小时重新定位图像..

演示html

<div id="gallery">
    <img src="http://dummyimage.com/50x42/7c6c4c/000000.gif&amp;text=img0">
    <img src="http://dummyimage.com/50x89/2c6c2c/000000.gif&amp;text=img1">
    ....
    <img src="http://dummyimage.com/50x62/2c5c6c/000000.gif&amp;text=img29">
    <img src="http://dummyimage.com/50x58/2c3c9c/000000.gif&amp;text=img30">
</div>

演示 css

#gallery{
    position:relative;
    width:100%;
}
#gallery img{
    position:absolute;
    -ms-transition:all 1s;
    -o-transition:all 1s;
    -webkit-transition:all 1s;
    -moz-transition:all 1s;
    transition:all 1s;
    opacity:0;
}

【讨论】:

    【解决方案2】:

    该技术与您描述的完全一样:

    fill the first (from the left or right, doesn't matter) shortest column
    

    如果有多个相同长度的列并且所有列都是最短的,那么找到第一个最短的部分是必要的。

    先填最短的部分很明显:否则会导致空白区域随机堆积。

    要了解为什么需要这些列,您必须首先了解&lt;img&gt; 标签在 HTML 中的工作原理:

    &lt;img&gt; 标签

    从早期开始,HTML 就被认为是一种格式化文本的方式。因此,当图像被引入时,它被设计为与文本内联放置,没有任何花哨的布局(css 后来允许你做花哨的布局)。图像的高度始终占据一行文本。比如这个:

    <pre>
      text text text
      text <img> text
      text text text
    </pre>
    

    最终看起来像这样:

    text text text
         .------.
         | img  |
         |      |
    text '______' text
    text text text
    

    请注意,第二行的高度会自动增加以适合图像。

    图库布局问题及解决方案

    所以,一系列不同高度的图片标签是这样的:

    <pre>
        <img> <img> <img>
        <img> <img> <img>
        <img> <img> <img>
    </pre>
    

    可能最终看起来像这样:

     ______
    |      |           ______
    |      |  ______  |      |
    |      | |      | |      |
    '______' '______' '______'
              ______
     ______  |      |  ______
    |      | |      | |      |
    |      | |      | |      |
    '______' '______' '______'
                       ______
     ______           |      |
    |      |  ______  |      |
    |      | |      | |      |
    '______' '______' '______'
    

    ..带有丑陋的空白。

    一个解决方案是使用 CSS 浮动。但有经验的开发人员会认出我一起输入“float”和“css”这两个词,并回忆起试图让多个浮点数相互配合的噩梦。

    另一种解决方案(我经常使用)是固定图像的高度而不是宽度,并让图像正常流动。这通常会导致布局看起来像这样:

     _______   _______   ______
    |       | |       | |      |
    |       | |       | |      |
    '_______' '_______' '______'
     ______   ____   ________
    |      | |    | |        |
    |      | |    | |        |
    '______' '____' '________'
     _____   ______   ___________
    |     | |      | |           |
    |     | |      | |           |
    '_____' '______' '___________'
    

    这要好得多,因为它消除了很多空白。但问题是画廊的右边缘不平整,有些人不喜欢。

    列解决方案

    这使我们找到了您遇到的解决方案。使用&lt;div&gt;s 或&lt;table&gt;s 等HTML 元素将图像分组到列中,并使用上述算法将图像放入列中。你仍然会得到一个不平坦的边缘,但至少它位于画廊的底部,这对某些人来说更可取。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-25
      • 1970-01-01
      • 1970-01-01
      • 2011-09-29
      • 1970-01-01
      相关资源
      最近更新 更多