多列列表控件中图片尺寸处理的若干问题

一、自适应

当前终端设备种类繁多,即单以 iOS 设备论计,从 iPhone 3GS 到 iPhone 6 Plus 总的数量亦不少了。如果对图片的什么尺寸都不指定(默认),或者只确定一种尺寸(也就是写死了),那么可以想象,小的图片在屏幕小的手机显示刚刚好,不过在屏幕大的手机中就显得很小;如果把图片调大尺寸,虽然屏幕大的手机显示刚刚好,但屏幕小的手机就不能完全展示了。总之,这个问题就是,五花八门的屏幕尺寸怎么让图片好去适应?

解决的办法也比较简单,也就是:

              采用百分比单位设置图片

这便是所谓的“自适应设计”——让浏览器获取父容器尺寸再按照比例去拉伸图片。自适应设计中,宽度都是按照百分比单位来进行设置的,这是一般推荐的方法,适应性更好。不仅仅图片,实际上文字、按钮都可采用自适应设计。

二、比例

对于图片尺寸大小,也就是 <img src=”aaa.jpg” / > 元素,浏览器有个不成文的约定,就是指定了宽度,不指定高度的话,那么高度就是按照图片的比例计算出来,反之亦然(即指定了高度,自动计算出宽度)——无论单位是绝对值的 px 还是自适应的 % 都是如此。简单的运算公式如下:

height = width / (4/3)
width = height * (4/3)

其中,4/3 是比例,即比例系数 4 /3 = 1.33~。我们约定 4/3 的比例为横图比例, 8 /9 为竖图比例(当然,此处的 4/3 是推荐值。不过也应该尽快确定好,因为图片一旦选定好了比例裁剪,再修改的话则比较麻烦,而且数量上是大批量的。)。

明显,这样的好处是还原了图片的真实比例,不会使正常比例的图片产生不期望的变型。由此,也确定了我们展示图片的第二个原则:

                不要使图片变型

前面说到,图片高度的是不确定的。因为每张图片如果比例不一,那么尽管指定了其宽度,最近得出的高度也是五花八门的。为了统一高度展示,我们应明确图片的比例,例如上述的横图为 4/3、竖图为 8/9 ——也只允许出现这限定几种的比例,那么图片在前端展示的时候,高度也就能确定,不会突然冒出一截或者缩进去一截;同时图片也不会破坏比例(无论图片原图多大)、失真。于是我们归纳第三个原则:

                明确几种可用的图片比例

所有的图片都应该在可提供的几种比例中选择,不应有“奇怪”比例的图片,否则单个看起来没什么问题,但放进控件容器中就出问题。

三、求高度算法

在上述原则指导下,我们拟定一套算法,求出图片实际高度。

例如,上图是图片三列列表,于是计算高度的方法如下:

var screenWidth = getScreenWidth(); // 获取视口宽度
var cellWidth; // 单元格宽度
var columns = 3; // 列数,可双列或三列(取值:2|3),假设三列
// 求单元格实际宽度
cellWidth = scrennWidth * ( 1/ columns ); // 实际宽度
var cellHight =  cellWidth / (4/3); // 实际高度。此为横图,竖图为 8/9

上述算法只是求高度,如果宽度已经设置了百分比,那么不一定需要设置图片 px 宽度。程序实现中,单纯求高度并不复杂。如果考虑 window.resize 事件,动态改变视口尺寸的话(手机中,便是 横屏、竖屏的问题),高度应该随着视口大小变化而变化——那么那将是该算法的难点。

时间: 2024-09-22 16:34:00

多列列表控件中图片尺寸处理的若干问题的相关文章

如何更新vc列表控件中的数据

问题描述 如何更新vc列表控件中的数据 我建立了一个基于对话框的MFC,三个对话框-一个主对话框,一个往列表控件添加数据的Add对话框,一个修改列表控件数据的Edit对话框,怎么实现Edit对话框中修改的数据在主对话框展现呢? 解决方案 可以为listctrl控件添加一个CListCtrl类型的变量 m_list;int nIndex =(int)m_list.GetFirstSelectedItemPosition() - 1; //获取选中列行号.然后通过m_list.SetItemText

listbox-MFC列表控件中删除记录的问题

问题描述 MFC列表控件中删除记录的问题 要实现点击按钮后删除列表中的一条记录代码如下:void CMyAccountView::OnClickedDelete(){ int nCurSel = m_listctrl.GetSelectionMark(); if (LB_ERR == nCurSel) MessageBox(_T(""请选择所要删除的内容!""));else m_pSet->MoveFirst(); for(int i=0;i m_pSet-&

mfc-用MFC写一个程序登陆到学校教务处,把成绩那个页面解析到自己的列表控件中

问题描述 用MFC写一个程序登陆到学校教务处,把成绩那个页面解析到自己的列表控件中 我想用MFC写一个程序登陆到学校教务处,把成绩那个页面解析到自己的列表控件中,有没有大神这方面的资料,或者有类似的源代码,给出一点点建议也好-- 解决方案 先用HTML View获取网页内容,再分析内容得到自己想要的信息放到控件中 解决方案二: 发送http请求,winhttp.获取内容.然后解析.再插入ListCtrl. SetItemText

asp.net 用户控件中图片及样式问题_实用技巧

比如,头尾用户控件.这时候控件里的图片,及css 样式就会出现问题.不同位置的文件引用同一个位置的用户控件,这时候用户控件的图片及css样式路径发生错乱. 1.如果用户控件中有服务器控件需要引用图片地址,比如ImageButton,这时候你只要按照用户控件的位置写好引用图片的链接地址就行,也就是服务器控件可以智能解析出它的确切位置 2.如果是插入图片,按照用户控件所在文件夹位置写出图片链接地址,是不行的.比如:图片文件是:/images/dian.gif . /index.aspx 和/memb

C#发现之旅-高性能ASP.NET树状列表控件(中)

第一段HTML代码块 若控件的"DynamicLoadChildNodes"属性值为true,也就是控件运行在客户端动态加载子节点,则输出支持客户端动态加载子节点的HTML代码,首先输出一个名为"SkyTreeViewControlTempXML"的XML数据岛标签,并将它的 "onreadystatechange"事件绑定到"SkyTreeViewControlDynamicLoadChildNodes"的 Javascri

jQuery获取file控件中图片的宽高与大小_jquery

问题 如何判断input file表单里上传的图片的宽高和大小呢? 解决方案 这个时候图片还没真正上传,也不是在页面上展示,不能使用$("#id").width(),$("#id").height()这种方式. 在Stack Overflow找到一个方法获取input file图片文件的宽高: var _URL = window.URL || window.webkitURL; $("#file").change(function (e) { v

report控件中图片URL的问题

问题描述 REPORT中的IMAGE控件,我把它的DATASOURCE设为了EXTERNAL,然后也指定了它的VALUE的值=Fields!StuPic.Value,并且也写了reportViewer1.LocalReport.EnableExternalImages=true;但是为什么运行起来,IMAGE控件那也不没有红叉也不出图片呢,只是一片空白.有人说是图片URL写得不对,比如显示D盘的123.jpg图片的话,请问应该在数据库StuPic属性中如何写URL?D:/123.jpg?还是D:

打造称心如意的列表控件

列表是常用的控件,于是要想想怎么弄好它. 一.布局迷思 话说 N 久之前,矩阵型的布局是用 <table> 做到的,那时我为这个算法研究过一阵子(从菜鸟来--).后来 CSS 布局渐替,到 CSS3,出现过几种布局方案. 浮动,设置 float:left 内联级块,设置 display:inline-block CSS 3 弹性布局,设置 box/box-flex/box,根据版本新旧而不同 他们的优缺点如下表, float:left display:inline-block box/box-

mfc 属性页 列表控件-属性页中添加列表框控件,当我点击下一步时,想让列表显示信息

问题描述 属性页中添加列表框控件,当我点击下一步时,想让列表显示信息 我在用向导模式实现数据库导入,想实现当点击下一步时,能够在列表控件中添加信息,这个信息提示着数据库导入到哪了,与进度条差不多,可是我在OnWizardNext()中添加m_ListCtrl.InsertItem(1,"数据库导入中,请稍后.....");,一开始并不显示着一行信息,等数据库导入完成后才跳出信息,请问我该怎么弄