图片展示心得一二

这两天在做淘吧首页的重构, 有很多地方会有图片的展示. 图片之后会由运营上传, 所以无法硬性规定图片的规格. 于是写代码的时候, 则要加以注意, 防止因为图片的问题破坏了布局.

最开始我的做法很直接, 确定图片大小, 问题则是, 如果图片高宽比不对, 则会变形. 但考虑到运营通常会按照规则传图片, 所以其实也是可行的.

但是妙净大似乎不是很能接受这种做法, 于是给出了这边通用的一个解决方案, 可以实现任意大小图片的垂直居中, 并且过于大的图片也不会破坏布局, 缺点是结构层次太多:

<div><a><img /></a></div>

总共三层, 一方面觉得有点累赘, 一方面因为自己都是两层, 图片出现的位置很多, 要改也很麻烦, 后来想出了一个觉得不错的办法. 为了简洁, 我就直接把style写到HTML里了:

<a href=”#” style=”display: block; width: 120px; height: 100px; overflow: hidden;”>
<img alt=”vilic” src=”vilic.png” style=”display: block; margin: auto; height: 100px;” />
</a>

这段代码也很好理解, 将内外元素display: block; (当然, 对于外面的元素, 使用float, 或者是position: absolute;也是可以的), 外面的元素定高宽, 且overflow: hidden; 保证图片不会在过大的时候超出. 而对于img, 变为块级元素后, 使用margin: auto; 则可以在图片较小, 或者高宽比较大时水平居中. 而height: 100px; 与a元素等高, 宽度不定, 这样一方面可以限制图片的高度, 一方面使图片不至于变形.

所以总体来说, 这个方案除了在图片高宽比较小时, 显示会左对齐(即图片右边可能会被挡住), 其他时候, 都能比较完美地展现图片, 重要的是, 兼容性很好, 结构简单.

试一下吧~

补充下, 后来想到, 如果说把容器宽度设置得足够宽, 然后再调节margin或者其他东西, 让超出部分隐藏, 那么, 即可实现较宽的图片也能居中了.

腾讯微博API之发送带图片的微博 (JavaScript/HTA)

今天 (严格地讲是昨天) 下午开始写发送图片的部分, 其实整个代码的结构都变了, 现在调用也更加方便.

注意, 本文所讲的JavaScript是指在HTA或者其他能够自由创建ActiveXObject对象的环境中的JavaScript, 并不是指普通权限的浏览器中运行的JavaScript.

发送图片等文件需要使用multipart/form-data类型的数据, 偷偷懒地话, 可以用form来提交, 但是想全程XMLHTTP, 就绕了下.

这次遇到的问题主要有两个, 然而这两个问题如果通过form来提交, 则都能轻松搞定.

第一个问题是字节文件的读取. 我使用了ADODB.Stream对象. 详细方法请Google或者参照我的代码.

第二个问题是multipart/form-data的boundary.

当时调用API的时候一直返回file size error这个错误. 一开始我一直以为是图片的问题, 毕竟它是说的file… 但后来, 下意识地修改了一些重要参数, 甚至直接点开API, 都是这个错误. 这才意识到, 或许参数根本没有成功传递.

一开始我使用xmlhttp发送的是string, 但貌似一闪而过, 没有 “上传” 的动作在其中, 毕竟文件也有些大小, 上传是需要一定的时间的. 这时开始就起了疑心, 后来改成了stream, 先把stream改成文本模式, 写入文本, 再改成字节模式, 写入文件内容, 再改回来, 再改过去. 如此反复后, 使用xmlhttp发送了这个stream. 这时总算是有点等待的意思了. 但之后的返回内容依旧提示file size error.

这里纠结了很久, 又去查了很多资料, 最后看到这样一个.

在程序中定义了一个变量boundary,大部分例子中这个boundary变量的起始字符是”–“,因为在HTTP消息体中要使用”–“,但是,如果这样定义,那么调用
xhr.setRequestHeader(‘Content-Type’, ‘multipart/form-data; boundary=’ + boundary);
设置HTTP消息头的时候,就将”–“也声明进去了,我发现在我的运行环境中这样不行,如果定义的变量boundary中没有起始字符”–“就可以了。当然此时要注意在整个消息的结尾需要在boundary字符串前后都加”–“,可以参照HTML规范构造符合规范的消息体。

说实在的我没读懂他的意思… 但是直觉告诉我, 难道是后面的分隔符必须在定义的boundary的基础之上, 前面再加一个 “–” ? 于是试了试… 于是成功了!

具体的操作我也不多说了, 感兴趣的话可以看我的代码.

http://www.vilic.info/demo/vt.rar