打造称心如意的列表控件

列表是常用的控件,于是要想想怎么弄好它。

一、布局迷思

话说 N 久之前,矩阵型的布局是用 <table> 做到的,那时我为这个算法研究过一阵子(从菜鸟来……)。后来 CSS 布局渐替,到 CSS3,出现过几种布局方案。

  • 浮动,设置 float:left
  • 内联级块,设置 display:inline-block
  • CSS 3 弹性布局,设置 box/box-flex/box,根据版本新旧而不同

他们的优缺点如下表,

float:left display:inline-block box/box-flex/box
经典方案,各浏览器都支持 可解决 float:left 高度不一致的问题,除早期 ie 外,各浏览器都支持 完美的解决上述问题,而且更灵活,参见我之前写的
不能等高,高度不一致出现布局错位 有间隙空白的问题,比较蛋疼 老版 box 居然不支持换行(参见:“由于老版语法对多行支持不好”),这个很致命,而且版本繁杂,不易书写

经过一番权衡,最后还是采取 float:left 的方案。针对其相关问题会特定的解决即可。例如高度不一致出现布局错位,针对该问题,我想到两个方法,各有优劣:

  • 因为屏幕宽度、列数是固定的,所以可以计算 item 的最终宽度,相关方法参见《多列列表控件中图片尺寸处理的若干问题》
  • 遍历图片,取一固定高度,然后其余强行统一即可。这是图片加载并显示后的动作,有一点延迟性并导致 reflow,而且 resize 事件(也就是切换横竖屏的时候)这个有问题。但这种写法比较简单,现正采用。

既然多列的矩阵型布局可以做了,那么单列的列表便不成问题。

二、各种杂项特性

要打造称心如意的列表控件,细节不能错过,一般该怎么弄就怎么弄吧,

MVC

  1. 内容如何渲染?
  2. item 项
  3. url 标识

分页

1、一般分页,提示最后一页

2、触底自动加载(未实现)

3、更优秀的列表渲染算法,无须记录翻页(未实现)。

4、分页加载中提示(未实现)

图片

1、应该有一个可通过参数指定高宽的图片服务器。挑选适合的图片分辨率视网屏适应, 根据 window.devicePixelRatio 适应,代码拟定如下:

function getCellRequestWidth(){
	window.devicePixelRatio = window.devicePixelRatio || 1;

	var screenWidth = window.innerWidth; // 获取视口宽度
	var columns = 3; // 列数,可双列或三列(取值:2|3),假设三列  

	var cellWidth = screenWidth * ( 1 / columns );// 求单元格实际宽度
	var cellHight = cellWidth / (4 / 3); // 实际高度。此为横图,竖图为 8/9
	var reqeustWidth = cellWidth * window.devicePixelRatio;
	reqeustWidth = Math.floor(reqeustWidth);
	var MaxWidth = 500;// 宽度上限
	return reqeustWidth;
}

2、加载背景图,图片未加载完成,在 placeholder 显示这是图片的位置

  • 设置 background-image(PNG 优化压缩、转换 Base64 合并在 HTML 中,已节省文件大小、HTTP 请求、优先加载)
  • 设置 <img /> 标签 alt 属性,会有加载提示文字

3、图片加载失败,替换为默认图片, onerr 事件。

4、Fx 特效,Fadeout 渐显,依次出现。使用 step.js 异步处理,十分好写!不过 iphone 好像还不能依次出现。

5、图片懒加载,结合分页。注意 onscroll 事件优化

6、怎么才能让图片不变形、等高等宽诸如此类的问题,着实是个大问题,而且不是三言两语可以讲清楚的,参考《非等宽图片列表的布局》

三、小结

有待补充,不吝赐教!

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

打造称心如意的列表控件的相关文章

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 列表控件CListCtrl加载类似QQ界面的头像与文字

本文主要讲述使用VS2012 MFC的CListCtrl(列表)控件加载类似于QQ界面的图片与文字数据.主要通过CListCtrl::InsertColumn.InsertItem.SetItemText向列表插入数据,CImageList插入BMP图片或ICON图标. 一.创建项目及界面 1.创建项目     创建项目名为"QQList"的基于MFC对话框的应用程序.资源视图中对话框IDD_QQLIST_DIALOG删除"TODE"和按钮,并添加List Cont

为列表控件添加水平滚动条

Win32的标准控件之中,列表控件(ListBox)并没有和列表视图(ListView)一样提供水平滚动条,所以如果列表项的长度超过列表的宽度的话,那么超出的部分将无法显示.在本文中我将以一个简单的例子来说明如何使用SDK来解决这一问题,在这个例子中,我将为一个列表控件添加100行如下格式的文本: This is a very very very very very long sentence - line 1 This is a very very very very very long se

ASP.NET 2.0移动开发之列表控件

asp.net|控件 概述 在很多情况下,我们都会使用到列表控件来方便用户选择一些选项.例如在某网站上注册新用户时,通常会询问你的性别是"男"还是"女",这时我们用单项按钮以供用户做出相应的选择.还有当你填写自己的家庭地址时,通常会使用到一个包含各省省名的下拉列表来供用户直接选择,这样可以减少用户的输入量.上述的这些单项按钮和下拉列表都在ASP.NET移动程序中都是以列表控件的形式存在的.我们可以使用列表控件来呈现各种形式(单项.多选.下拉列表)的列表,以供用户选择

ASP.NET 数据列表控件的分页总结(一)自定义方法分页和PageDataSource类分页

在Asp.net中,提供了三个功能强大的列表控件:GridView.DataList和Repeater控件,但其中只有GridView控件提供分页功能.虽然DataGrid提供了分页功能,不过看上去功能有限,但是我们可以通过GridView的一些属性来获取状态以及增加首页.尾页功能按钮.如果在速度效率不是很讲究的情况下,由DataGrid自己管理分页还是不错的,付出的代价就是要把整个相关数据取出来后再删选指定页的数据.好处就是开发速度快,不需要写分页的存储过程.所以若需要追求执行效率,而且数据量

自定义控件—特效列表控件

一.创建目标 建立类似于Windows XP窗口中左部的列表控件,如下图所示 用户可自由添加列表成员 控件可以折叠和伸展,折叠时只显示标题栏 控件可显示在由CWnd派生的窗口类中 每个成员可响应鼠标事件,并向用户提供编程接口 二.设计与实现 1.对象 特效列表控件(TaskListBox)--提供用户编程接口,处理与窗口对象衔接. 特效列表(TaskList)--受特效列表控件委托,实现控件的所有功能. 成员(Item)--代表每个列表成员,可以响应鼠标事件. 边框(TaskFrame)--处理

如何实现由列表控件控制的属性表

摘要:很多MFC的程序都用到了属性表和属性页来实现选项设置的界面,但是MFC本身提供的属性表页功能有限,界面也很原始,一些新软件都实现了自己定义的更为美观的属性页.MFC原始的属性页是通过CTabCtrl进行切换控制的,本文给出了一种现在较为常见的用CListCtrl进行页面切换的属性页的方法,并且对对列表控件进行了重绘. CMyPropertySheet是一个从CPropertySheet派生而来的类,因此你仍然可以不费力的利用MFC CPropertySheet的诸多特性,具体使用方法稍后我

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

已有树状列表控件分析发现问题 近期发现有人在ASP.NET项目开发中使用一种叫dtree的树状列表组件加载缓慢.这也是笔者撰写本章的动机.毛主席教导我们,做事要发现问题,分析问题和解决问题.首先我们发现了已有的树状列表WEB控件加载缓慢的问题,接下来就很自然的是分析问题了. 下图就是dtree 运行界面的例子 分析问题 现在我们分析问题,对使用dtree生成树状列表的程序代码的分析,可以了解程序运行过程如下图所示 在这样的程序中,首先服务器端的C#代码查询数据库,然后根据查询所得数据拼凑出一个J

Android开发入门(十二)列表控件 —— 12.4 Spinner

从前面的几节课可知,ListView用来显示一个长列表信息,同时把整个屏幕占满了(ListActivity).但 是有的时候,你可能需要其他类似的视图,这样,你就不必把整个屏幕都占满了.在这种情况下,你就应该 使用Spinner控件.Spinner一次显示列表中的一个信息,并且它能让用户进行选择. 下面将展示如何 在Activity中使用Spinner. 1. 创建一个工程:BasicViews6. 2. main.xml中的代码. <?xml version="1.0" enc