CSS列(照片网格)显示从左到右而不是从上到下
问题描述:
我使用列来创建照片网格,它们可以将所有提供的照片放在一起,而不会在它们之间留下任何空白。CSS列(照片网格)显示从左到右而不是从上到下
这里是我使用的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;
}
下面是该问题的样本小提琴:https://jsfiddle.net/es7hLuq4/
如果你将鼠标悬停在每个图像,你会看到,他们说:“照片1 ”,‘照片2’等,但顺序是这样的
1 4 7
2 5 8
3 6 9
但我想它是这样的
1 2 3
4 5 6
7 8 9
这是纯粹的CSS可能吗?如果没有,是否有任何干净的jQuery解决方案可以帮助?我想过关于每个图像元素的循环,并试图检查它在哪个列,但这似乎很混乱(将不得不重新调整大小),我也不知道如何检查一个元素当前在哪一列。
任何想法如何实现相同的自适应网格效果,但列出连续的项目从左到右而不是从上到下?
答
我以矩阵索引中的每个图像解决的问题。第一个完成的版本有点粗糙,并且有时会在相邻图像的纵横比差别很大时重新排序。
我将处理更新后的版本,该版本对图片尺寸进行了说明,并在完成时更新答案和小提琴。
我用这个JS/jQuery的供试品重配置功能:
样品fidde: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);
});
答
这会按照您想要的方式排列项目并保持图像的纵横比。但图像具有固定的高度,因此与原来的图像调整行为稍有不同。 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>
不幸的是在这个例子中有空格类似于当你只是显示图像的右下方他们通常在一条线上。 :( – SISYN