css实现非等宽图片列表的布局详解

各大seo/seo.html" target="_blank">搜索引擎的图片频道的搜索结果页,搜索出来的结果都是较零碎的图片,图片质量、尺寸都是参差不齐的,并限定了每一行的总宽度。这种非等宽的图片列表,在Google+、flickr也都有用到。

最近刚好对360搜索的图片搜索结果页进行了一次重构和改版,对于这种图片布局也花心思研究了一番,接下来说说我的一些处理思路。

非等宽的单个图片要排列到一个固定了宽度的容器中,那么这个等宽的容器就是最大的限制和障碍,开始怀念那种常见等宽瀑布流的布局(没有限制真好)。

先理下基本的需求:

  • 1、图片的宽度是不固定的;
  • 2、图片的高度是固定的;
  • 3、每行图片的总宽度是固定的,所以每行能容纳的图片的数量是无法确定的;
  • 4、确保图片质量不变,不能有拉伸变形导致图片失真的情况出现;
  • 5、图片之间的间距是固定的;

任意选取一组图片数据,计算图片宽度的总和,当宽度刚好大于或者等于一行的固定宽度,那么这就是一组待处理尺寸的原图,处理前的情况应该是这样的。

以一行图片为单位,用一个 ul 列表来存放这一行图片,将 li 浮动。一组原图的宽度的总和通常都是大于一行的宽度,刚好相等的情况很少见,如果宽度过大,使用浮动的布局必然会让最后一张图掉下去。基本的 HTML 结构是下面这样的。

 代码如下 复制代码

<STYLE type=text/css>
.img_list{ /*该行的固定宽度*/ overflow:hidden }
.img_list li{ float:left; }
</STYLE>

<UL class=img_list>
  <LI><A href="#"><IMG alt="" src="demo.jpg"></A></LI>
  <LI><A href="#"><IMG alt="" src="demo.jpg"></A></LI>
  <LI><A href="#"><IMG alt="" src="demo.jpg"></A></LI>
  <LI><A href="#"><IMG alt="" src="demo.jpg"></A></LI>
  <LI><A href="#"><IMG alt="" src="demo.jpg"></A></LI>
</UL>

为了尽量简化方法,这里先无视间距。

裁切宽度

那么每一组图片只要将多出来那部分的宽度(extraWidth)想办法解决掉就行了。为了保证图片不失真,可以使用裁切的方式,li 设置一个固定的宽度,并且设置 overflow:hidden,图片本身还是设置原图的尺寸,同时给图片设置负 marginLeft,确保图片是居中的。将多出来的那部分宽度通过对每张图片进行相同宽度的裁切,这样可以确保每张图片裁切得比较均匀。

裁切的简单公式: 图片裁切的宽度(marginLeft) = 多出的宽度(extraWidth) / 图片的数量(imgLength) / 2

下面是对单个图片的裁切。

 代码如下 复制代码

<LI style="WIDTH: 100px; HEIGHT: 100px; OVERFLOW: hidden">
  <A href="#">
    <IMG style="WIDTH: 104px; HEIGHT: 100px; MARGIN-LEFT: -2px" alt="" src="demo.jpg">
  </A>
</LI>

裁切图片虽然能确保图片不失真,并保证每一行图片的行高是一样的,但会损失掉图片一部分左右边缘的内容,裁切掉的宽度的大小依据一行图片的数量多少来变化的,对于一行图片数较多的情况下(竖图较多),这种方法还是不错的。

除了裁切还有其他的办法吗?

等比缩放

裁切是为了减小图片所占的宽度,并确保图片不失真,缩放同样也可以实现前面说到的两点,缩放的处理要比裁切会麻烦些。

将前面计算出的extraWidth,通过对图片进行等比例缩放的方式,将缩放的宽度平均分配到每张图片上,这是对图片宽度的处理。

缩放宽度的简单公式:图片缩放后的宽度(zoomWidth) = 图片原始宽度(imgWidth) – 多出的宽度(extraWidth) / 图片的数量(imgLength)

既然是等比例缩放,对图片的宽度进行了缩放后,图片的高度也要按照相等的比例进行缩放。可以用第一张图片的高度作为基准高度。

基准高度的简单公式:基准高度(baseHeight) = 图片原始高度(imgHeight) – 多出的宽度(extraWidth) / 图片的数量(imgLength)

根据图片原始的宽度和缩放后的宽度的计算得出的缩放比例,就可以计算出每张图片应该等比例缩放的高度。这个缩放的高度和之前得到的基准高度会有一定的出入,如果缩放后的高度大于基准高度可以通过负 marginTop 的方法对图片的高度进行裁切,如果缩放后的高度小于基准的高度,可以再对图片进行等比例放大,然后再对宽度进行一定的裁切。通过这些处理,就可以保证每一行是等高的。

等比缩放对图片的裁切会很小,基本不会损失掉原图边缘的内容,但是会让每一行的行高都不一样,无法固定行高。Google+ 和 flickr 就是采用的等比缩放的方法,这种方法对于大尺寸以及横图居多的情况很合适。

不管是裁切还是缩放,一行图片在计算后都会有一定的误差值,需要对误差值进一步再做处理,这个不难,就不多说了。

如果你也有好的处理办法,欢迎与我讨论。

时间: 2024-10-28 13:10:11

css实现非等宽图片列表的布局详解的相关文章

Android图片缓存之Bitmap详解(一)_Android

前言: 最近准备研究一下图片缓存框架,基于这个想法觉得还是先了解有关图片缓存的基础知识,今天重点学习一下Bitmap.BitmapFactory这两个类.  Bitmap:Bitmap是Android系统中的图像处理的最重要类之一.用它可以获取图像文件信息,进行图像剪切.旋转.缩放等操作,并可以指定格式保存图像文件. 重要函数  •public void recycle() // 回收位图占用的内存空间,把位图标记为Dead  •public final boolean isRecycled()

Android中屏幕密度和图片大小的关系详解

Android中屏幕密度和图片大小的关系详解 前言 Android中支持许多资源,包括图片(Bitmap),对应于bitmap的文件夹是drawable,除了drawable,还有drawable-ldpi.drawable-mdpi.drawable-hdpi.drawable-xhdpi.drawable-xxhdpi等,同一张图片放到上面不同的文件夹中是有区别的,比如一张100 * 100像素大小的图片,分别放在上述各个文件夹中,然后将其设置为ImageView(假设宽高都是wrap_co

CSS中HTML元素定位Position参数可选值详解

position 属性规定元素的定位类型.这个属性定义建立元素布局所用的定位机制.任何元素都可以定位,不过绝对或固定元素会生成一个块级框,而不论该元素本身是什么类型.相对定位元素会相对于它在正常流中的默认位置偏移. 默认值: static 语法: position : static | absolute | fixed | relative 继承性: no 版本: CSS2 JavaScript 语法: object.style.position="absolute" static 元

Android异步下载图片并且缓存图片到本地DEMO详解

在Android开发中我们经常有这样的需求,从服务器上下载xml或者JSON类型的数据,其中包括一些图片资源,本demo模拟了这个需求,从网络上加载XML资源,其中包括图片,我们要做的解析XML里面的数据,并且把图片缓存到本地一个cache目录里面,并且用一个自定义的Adapter去填充到LIstView,demo运行效果见下图: 通过这个demo,要学会有一下几点 1.怎么解析一个XML 2.demo中用到的缓存图片到本地一个临时目录的思想是怎样的? 3.AsyncTask类的使用,因为要去异

Python中的关键字参数与非关键字参数(可变参数)详解

学过php或者其他语言的同学都知道,php里面的参数不是个数不是可变的(只是很多时候是可以省略的,因为在函数定义的时候为参数设置了默认值).但是在python里却不是这样,python里面运行可变参数的出现,参数中出现(*arg,**arg2)的形式. 今天我们来详解一下这种用法: 例如: def foo1(arg1,arg2,key1=1,key2=2,*arg,**keywords): print "arg1 parameters is ",arg1 print "arg

WordPress中用于获取及自定义头像图片的PHP脚本详解_php技巧

get_avatar()(获取头像)get_avatar() 函数用来获取置顶邮箱或者用户的头像代码,在评论列表中非常常用. 这个函数提供一个 get_avatar 过滤器,用来过滤头像的 Html 代码(img 标签). 如果在后台 "设置" 的 "讨论" 里关闭 "显示头像选项" 则返回 False. 用法 get_avatar( $id_or_email, $size, $default, $alt ); 参数 $id_or_email (

网页特效:图片随机显示实例详解

随机|特效|网页|网页特效|显示|详解 图片随机显示是一个应用非常广泛的技巧.比如随机banner的显示,当你进入一个网站时它的banner总是不同的,或者总有内容不同的提示(tips),大家在网上浏览时会经常发现这样的例子.使用这种技术,不但能在一定的空间里放入更多的内容,还可以给人一种经常更新的假象喔. 怎么样心动了吧?其实只要你有一点点html和javascript 的基础,一切都是这么简单.follow me,让我们来看看她随机的奥密. 让我们从一个简单的例子开始吧.平常我们在页面中加入

Symfony2使用第三方库Upload制作图片上传实例详解_php实例

本文实例分析了Symfony2使用第三方库Upload制作图片上传的方法.分享给大家供大家参考,具体如下: 我们在应用程序或者网站的个人资料里一般都有设置头像的功能,这一章我们在Symfony2里用第三方的一个比较有名Upload库来制作上传图片的功能. 一.安装第三方库 1.在composer.json文件中的"require"中加入 "codeguy/upload": "*" 2.运行指令安装 composer update 二.编码 1.编

Ruby中的数组和散列表的使用详解_ruby专题

Ruby的数组(arrays)和散列表(hashes)是被索引的收集(indexed collections). 两者都存储对象的集合,通过键(key)来访问.数组的键是整数.而散列表支持以任何对象作为它的键.数组和散列表会按需调整大小来保存新的元素.访问数组元素是高效的,但是散列表提供了灵活性.任何具体的数组或散列表可以保存不同类型的对象. 使用数组字面量(array literal)--即方括号之间放一组元素--可以创建和初始化新的数组对象.有了数组对象,在方括号之间提供索引便可以访问单个元