简体   繁体   English

CSS列(照片网格)从左到右而不是从上到下显示

[英]CSS Columns (Photo Grid) display left to right instead of top to bottom

I'm using columns to create a photo grid that fits all the supplied photos together without any whitespace between them. 我正在使用列来创建照片网格,以将所有提供的照片放在一起,并且它们之间没有任何空格。

Here is the CSS I'm using: 这是我正在使用的CSS:

.autofit-photo-grid {
  /* Prevent vertical gaps */
  line-height: 0;
  -webkit-column-count: 3;
  -webkit-column-gap: 0;
  -moz-column-count: 3;
  -moz-column-gap: 0;
  column-count: 3;
  column-gap: 0;
}

.autofit-photo-grid img {
  /* Just in case there are inline attributes */
  width: 100% !important;
  height: auto !important;
  border: 1px solid #777;
  opacity: 0.85;
}

Here is a sample fiddle showing the issue: https://jsfiddle.net/es7hLuq4/ 这是显示问题的样本小提琴: https : //jsfiddle.net/es7hLuq4/

If you hover over each image, you will see that they say "photo 1", "photo 2", etc. but the order goes like this 如果将鼠标悬停在每个图像上,您会看到它们说“照片1”,“照片2”等,但是顺序如下

1    4    7
2    5    8
3    6    9

But I would like it go like this 但是我希望这样

1    2    3
4    5    6
7    8    9

Is this possible with pure CSS? 纯CSS可以做到吗? If not, are there any clean jQuery solutions that could help? 如果没有,是否有任何干净的jQuery解决方案可以帮助您? I thought about looping through each image element and attempting to check which column it's in, but that seemed messy (would have to repeat on resize) and I also do not know how to check which column an element is currently in. 我曾考虑过遍历每个图像元素并尝试检查它在哪一列中,但这似乎很麻烦(必须在调整大小时重复),而且我也不知道如何检查元素当前在哪一列中。

Any ideas how to achieve the same auto-fit grid effect but list consecutive items left to right rather than top to bottom? 有什么想法可以实现相同的自动调整网格效果,但要从左到右而不是从上到下列出连续项?

I have solved the issue by using matrix indexes for each image. 我已经通过为每个图像使用矩阵索引解决了这个问题。 The first completed version is a bit rough, and will sometimes get the reordering a little off when adjacent images have drastically different aspect ratios. 第一个完成的版本有些粗糙,当相邻图像的纵横比截然不同时,有时会使重新排序有些偏离。

I will be working on an updated version that accounts for image dimensions and will update the answer and fiddle when it is complete. 我将致力于解决图像尺寸问题的更新版本,并在完成后更新答案和提琴。

I've used this JS/jQuery for the sample rearrangement function: 我已经将此JS / jQuery用于示例重排功能:

Sample fidde: https://jsfiddle.net/069f72ep/ 示例示例: https ://jsfiddle.net/069f72ep/

// define currentColumnCount outside the function scope so it can be compared when window is resized
var currentColumnCount;

var attributeToIndex; // switch to src for actual, title for debug/human-readable

function rearrangePhotos(performRearrange) {
  // if not performing rearragement, index titles instead of src for debug/human
  attributeToIndex = (!performRearrange) ? 'title' : 'src';

  // get current number of columns being displayed
  currentColumnCount = $('.autofit-photo-grid').css('column-count');

  // create arrays to store values in
  var originalPhotoMatrix, reversePhotoMatrix, columnPerimeters;
  originalPhotoMatrix = new Array();
  reversePhotoMatrix = new Array();
  columnPerimeters = new Array();

  // loop through all the images to compare their left & top perimeters to determine their cell position
  $('.autofit-photo-grid img').each(function() {
    // if the left perimeter is not found in the array, its a new column
    if (columnPerimeters.indexOf($(this).offset().left) == -1)
      columnPerimeters[columnPerimeters.length] = $(this).offset().left; // create new columnPerimeter record

  }); // end loop

  // sort the columns to be in consecutive order
  columnPerimeters = columnPerimeters.sort(function(a, b) {
    return a - b
  });

  // now that we have the perimeters of each column, let's figure out which cell each photo belongs to
  var colCounter = 1;
  var rowCounter = 1;
  // loop through all the raw image objects again
  $('.autofit-photo-grid img').each(function() {
    // get the current position of the image again to determine which column it's in
    var currentOffset = $(this).offset().left;
    // get the column based on the position of the current image
    var currentCol = columnPerimeters.indexOf(currentOffset) + 1;

    // if we encounter a new column, reset and increment our col/row counters accordingly
    if (currentCol != colCounter) {
      colCounter++;
      rowCounter = 1;
    }

        // assign the matrix index to a data attr on the img
    $(this).attr('data-matrix-key', rowCounter + ',' + colCounter);
    // assign original and reverse matrix values
    originalPhotoMatrix[rowCounter + ',' + colCounter] = $(this).attr(attributeToIndex);
    reversePhotoMatrix[colCounter + ',' + rowCounter] = $(this).attr(attributeToIndex);

    // increment the row counter before restarting the loop
    rowCounter++;
  }); // end loop



  // sort the original matrix by key so that it's in the proper order before generating key list for 
  // final version of reversePhotoMatrix
  originalPhotoMatrix = ksort(originalPhotoMatrix);

  // assign matrix id by looping through existing matrix keys/indexes
  var availableKeys = new Array(); // create array to store keys/indexes in
  for (var key in originalPhotoMatrix) { // loop through the keys and contents of the original matrix
    availableKeys[availableKeys.length] = key; // add this key to the list of available keys
  } // end loop


  // generate the new photo matrix based on the next available key from the old matrix
  var c = 0; // intialize counter
  reversePhotoMatrix = new Array(); // clear array to prevent any unused/leftover/nonexistent values from lingering
  // loop through the images....AGAIN
  $('.autofit-photo-grid img').each(function() {
    // determine the next available matrix key/index based on the current counter value
    var nextAvailableKey = availableKeys[c];
    // reassign new key/index and value to reverse photo matrix
    reversePhotoMatrix[nextAvailableKey] = $(this).attr(attributeToIndex);

    c++; // increment the counter before restarting the loop
  }); // end loop



  // finally, loop through all the original matrix items and grab the corresponding item from the reverse matrix
  console.log("\n\nRearrange ready\n\n"); // just a console comment
  // loop through all keys and values in the original matrix
  for (var key in originalPhotoMatrix) {
    if (!performRearrange) // if performRearrange=false, only display console output
      console.log('Swap ' + originalPhotoMatrix[key] + ' with ' + reversePhotoMatrix[key]);
    if (performRearrange) // if performRearrange=true, perform the actual rearrangement
      $('.autofit-photo-grid img[data-matrix-key="' + key + '"]').attr(attributeToIndex, reversePhotoMatrix[key]);
  } // end loop


} // end rearrangePhotos function



// This is just to attach the click event to the text/link at the top
$('.rearrange-link').click(function() {
  // on the first click, call rearrangePhotos(performRearrange=false)
  rearrangePhotos(false);
  // Now change the link text to instruct the next click
  $(this).text('Now rearrange them');
  // Now attempt to rearrange the actual photo sources with rearrangePhotos(performRearrange=true)
  $(this).click(function() {
    rearrangePhotos(true);
  });
});

// Run the rearrangePhotos() function everytime the window size is adjusted
$(window).resize(function() {
    if ( currentColumnCount != $('.autofit-photo-grid').css('column-count') )
    rearrangePhotos(false);
});

This will order the items in the way you want and maintain the images' aspect ratio. 这将按照您想要的方式对项目进行排序,并保持图像的纵横比。 But the images have fixed height, so it has a slightly different image-resizing behavior than what you originally have. 但是图像的高度是固定的,因此图像调整大小的行为与您原来的图像略有不同。 https://jsfiddle.net/s1bppsjo/2/ https://jsfiddle.net/s1bppsjo/2/

.autofit-photo-grid {
    display: flex;
    flex-wrap: wrap;
}

.autofit-photo-grid img {
    height: 200px;
    border: 1px solid #777;
    opacity: 0.85;
}

.autofit-photo-grid img:hover {
    box-shadow: 0 0 12px #333;
    opacity: 1;
}
<div class="autofit-photo-grid">
    <img src="http://imgsv.imaging.nikon.com/lineup/lens/zoom/normalzoom/af-s_dx_18-300mmf_35-56g_ed_vr/img/sample/sample4_l.jpg" alt="" title="Photo 1" />
    <img src="http://www.bestmotherofthegroomspeeches.com/wp-content/themes/thesis/rotator/sample-1.jpg" alt="" title="Photo 2" />
    <img src="https://www.ricoh.com/r_dc/r/r8/img/sample_10.jpg" alt="" title="Photo 3" />
    <img src="http://imgsv.imaging.nikon.com/lineup/dslr/d600/img/sample01/img_05_l.jpg" alt="" title="Photo 4" />
    <img src="http://imgsv.imaging.nikon.com/lineup/lens/zoom/normalzoom/af-s_nikkor28-300mmf_35-56gd_ed_vr/img/sample/sample2_l.jpg" alt="" title="Photo 5" />
    <img src="http://imgsv.imaging.nikon.com/lineup/lens/singlefocal/normal/af-s_50mmf_18g/img/sample/sample1_l.jpg" alt="" title="Photo 6" />
    <img src="http://www.forkingandcountry.com/sites/g/files/g2000004371/f/sample1.jpg" alt="" title="Photo 7" />
    <img src="http://www.olympusimage.com.sg/content/000010885.jpg" alt="" title="Photo 8" />
    <img src="http://indianapublicmedia.org/arts/files/2012/04/sample-gates-9-940x626.jpg" alt="" title="Photo 9" />
    <img src="https://www.ricoh.com/r_dc/r/r8/img/sample_08.jpg" alt="" title="Photo 10" />
</div>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何为横幅而不是向右,向左,向上和向下的列添加自定义列? - How can I add custom columns for banner instead of column right, left, top and bottom? JS + CSS如何从右上到左下显示数组中的图像 - JS+CSS How to display images from an array from top right to bottom left 使用固定div使幻灯片在底部和顶部之间切换,而不是向左或向右切换 - Make slide toggle bottom and top instead left or right with fixed div jQuery UI Position设置为“ right”和“ bottom”,而不是“ left”和“ top” - jQuery UI Position to set “right” and “bottom” instead of “left” and “top” jquery marquee从上到下而不是从右到左制作卷轴 - jquery marquee make scroller from top to bottom instead of right to left Bootstrap轮播从上到下而不是从左到右动画 - Bootstrap carousel animate top to bottom instead of left to right CSS动画宽度从右到左,高度从下到上 - CSS Animation width from right to left and height from bottom to top 右上角和左下角的半边框与CSS - half borders at top right corner and bottom left corner with css CSS 过渡不适用于顶部、底部、左侧、右侧 - CSS Transition doesn't work with top, bottom, left, right 使用CSS将div定位在鼠标左/右或上/下 - Positioning div left/right or top/bottom of a mouse click with CSS
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM