前言

诶,ie6,ie7这些顽固的浏览器我就不管了,反正现在主要开发移动网页,可以用到html5,css3的很多很多特性。

背景介绍

近日做了一个小小项目,是一个很流行的通过微信投票然后选出最最美,最最好的某某某,然后给奖励的。
其中一个比较重要的点就是要保证上传的图片的比例尺寸一致,当然我们不采用固定尺寸—采用的是固定比例的方式,为此我做了一个pc端移动端通用的裁剪工具。这个问题跟这个裁剪工具还有浏览器对图片的处理息息相关。

先说说裁剪的步骤先:
注意:裁剪比例是150:200,即,3比4
图片1:

选择图片

缩小放大移动图片移动裁剪框旋转等等操作。

好了,裁剪结果如下:

我们检查一下这张图片,看看是不是符合比例

可以看到尺寸为:197:263
那么计算得到的比例是:
0.7490494296577946
跟0.75有一定差距。为什么会出现这个结果?因为裁剪出来的图片是像素,最小单位为1,精度已经不够了,必然会出现误差,然后有些情况是不会出误差的,但是大部分情况都会出现。我们在裁剪的时候只要确保出现的比例误差在取1像素级别的情况下是最小的就行了—-1像素级别最接近原有比例的裁剪结果是可以接受的。
再看看第二个裁剪结果:
选取图片

这样子的

大家看得很爽对吧?下面我要治好你们的颈椎病。经过数次操作这样

裁剪

然后检查尺寸

好了,我们算一算:

469/625=0.7504

误差为:
0.0004/0.75=0.0005333333333332746

这个误差已经可以接受了,也就是说,当我们采用裁剪方式得到等比例图片时候,因为裁剪的精度限制,很多情况精度都是1像素,所以裁剪出来的比例是有误差的,只能取其中最接近的去趋近。裁剪方面已经不算是bug了。

那么,问题来了,为什么我还说是坑爹呢。下面我们看看实际显示效果。

问题出现了

我们打开网站看看

一切都这么美好

直到我的膝盖中了一箭,竟然遇到它。

诶玛,这绝壁是图片尺寸出了问题,但是哪一个出问题了???我的比例如此接近,都是如此完美!!!

好了,我们来一个排查。逐张逐张图片分析。




真的是有一张像素多1了,那怎么解决???

在解决之前不妨做一下计算,看看在缩放的时候到底发生了什么。这时候一口认定是裁剪图片出了问题可不是负责任的做法,之前我们已经做了测试,在1像素的精度下,很多时候只能趋近裁剪比例,而非真正精确到比例

下面给出几张图片的真实缩放计算数据和浏览器采用的数据。

图片尺寸为:762 X 1016
图片的真实比例=762/1016=0.75
缩放高度=159/(762/1016)=212

图片尺寸为:729 X 972
图片的真实比例=729/972=0.75
缩放高度=159/(729/972)=212

图片尺寸为:972 X 1296
图片的真实比例=972/1296=0.75
缩放高度=159/(972/1296)=212

图片尺寸为:700 X 933
图片的真实比例=700/933=0.7502679528403001
缩放高度=159/(700/933)=211.9242857142857

图片尺寸为:299 X 399
图片的真实比例=299/399=0.7493734335839599
缩放高度=159/(299/399)=212.1772575250836

图片尺寸为:636 X 848
图片的真实比例=636/848=0.75
缩放高度=159/(636/848)=212

图片尺寸为:715 X 953
图片的真实比例=715/953=0.7502623294858342
缩放高度=159/(715/953)=211.92587412587415

结论

我计算了七张图片都给气疯了,特么逗我玩呢。。。。大于211小于或者等于212的都算是211,大于212小于或等于213的都算是212,一般正常人思考的四舍五入都没个影子。。。。
所以,这种情况不是我们裁剪图片时候比例不给力,而是浏览器的缩放图片策略跟我们想象的太有距离了。说真的,这种情况其实最好的解决方案是,裁剪出来的图片都是同一个尺寸,譬如:300x400这种,别等比缩放了,坑死。但是有时候又必须用等比缩放,这时候怎么办好呢?
下面提供一个思路:
我们别管浏览器给我们缩放的图片了,外层包裹一个尺寸唯一的背景图片,譬如是150X200,然后里面绝对定位我们的效果图片,即使多一个像素少一个像素都对整个框大小没影响。

譬如:

    <div class="这是一个显示单元"><div class="main-img" style="width:auto;height:auto;" style="position: fixed;"><img id="这是背景图片,用来占位置。" src="150x200.jpg"><img style="position: absolute;left:0;top:0;width:100%;" id="这才是我们的图片。"></div></div>

补充

下面补充一份这样的demo。。。

<%--Created by IntelliJ IDEA.User: AdministratorDate: 2015/9/25Time: 11:35To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title></title><style>#app{background: rgba(33,33,33,0.4);width: 640px;}#app:after{content: "";display: block;clear: both;}.list_item{float: left;width: 48%;border: 1px solid #008000;margin-left: 10px;margin-bottom: 10px;}.img_panel{width: 100%;position: relative;}.img_panel img{max-width: 100%;width: 100%;}.img_panel .real_img{position: absolute;left: 0;top: 0;}.desc{letter-spacing: 1px;line-height: 21px;font-size: 14px;}</style></head>
<body>
<div id="app"><div class="list_item"><div class="img_panel"><img src="loading.jpg"><img src="pic1.jpg" class="real_img"></div><div class="desc">这是文字描述</div></div><div class="list_item"><div class="img_panel"><img src="loading.jpg" ><img src="pic2.jpg" class="real_img"></div><div class="desc">这是文字描述</div></div><div class="list_item"><div class="img_panel"><img src="loading.jpg"><img src="pic3.jpg" class="real_img"></div><div class="desc">这是文字描述</div></div><div class="list_item"><div class="img_panel"><img src="loading.jpg"><img src="pic4.jpg" class="real_img"></div><div class="desc">这是文字描述</div></div>
</div>
</body>
</html>

demo下载

【坑爹系列】常见的图片排列错位问题-根源分析及解决方案相关推荐

  1. 线上问题分析系列:数据库连接池内存泄漏问题的分析和解决方案

    前言 本文来自好朋友彪哥整理,实际的生产问题分析,绝对干货~ 一.问题描述 上周五晚上主营出现部分设备掉线,经过查看日志发现是由于缓存系统出现长时间gc导致的.这里的gc日志的特点是: 1.gc时间都 ...

  2. 一款超炫的图片排列特效

    今天给大家分享一款超炫的图片排列特效.页面加载时.图片纵向堆叠在页面中,当鼠标单击toggle按钮时,图片依次展开.铺满整个网页.效果图如下: 在线预览   源码下载 实现的代码. html代码: & ...

  3. [js高手之路]深入浅出webpack教程系列9-打包图片(file-loader)用法

    [js高手之路]深入浅出webpack教程系列索引目录: [js高手之路]深入浅出webpack教程系列1-安装与基本打包用法和命令参数 [js高手之路]深入浅出webpack教程系列2-配置文件we ...

  4. 解决element-ui table 表格排列错位问题

    有时候页面切换页签时会发生table表格排列错位, 是因为切换页签时table表格没有重新渲染导致 解决办法:每次切换页签时重新渲染table表格即可解决 // 在table上添加key,每次切换页签 ...

  5. 常见的图片比例有哪些?App中不同图片比例适用场景

    在现代化的今天,图片在app中随处可见.我们通常只关心图片的内容而没有想过图片的比例其实也有一定讲究.目前常见的图片比例有1:1.2:3.4:3.16:9,为什么不同app中需要用到这些不同的图片比例 ...

  6. 七、vertical-align属性、透明度属性及兼容、ps常用工具、常见的图片格式、项目规范、命名参考、iconfont的使用

    一.css其他属性 1.vertical-align属性 设置元素的垂直对齐方式,适用于行级元素.行块级元素. (1)语法 vertical-align: top | bottom | middle ...

  7. 七、vertical-align属性、透明度属性及兼容、ps常用工具、常见的图片格式、项目规范、命名参考、iconfont的使用...

    此文转载自:https://blog.csdn.net/qq_52426181/article/details/110228561 一.css其他属性 1.vertical-align属性 设置元素的 ...

  8. word 中Visio画的图 如何修改?图片排列

    文章目录 1 在word中双击,简单的修改 2 在Visio中修改原图 3 图片排列组合 visio 安装下载,关注微信公众号:软件智库 用visio 画图非常的方便, 绘制完后成选中复制到 word ...

  9. html排列图片,css3+html实现微信朋友圈不同尺寸图片排列预览功能

    css 模拟朋友图片不同数量 排列,html 图片排列,微信朋友圈css img 自适应,微信朋友圈照片排列,vue 朋友圈图片预览,微信朋友圈缩略框尺寸,朋友圈图片尺寸,新版微信朋友圈图片大小 ht ...

最新文章

  1. 6.18docker(一)Compose 模板文件
  2. 如何利用 JConsole观察分析Java程序的运行,进行排错调优
  3. 【Android RTMP】音频数据采集编码 ( 音频数据采集编码 | AAC 高级音频编码 | FAAC 编码器 | Ubuntu 交叉编译 FAAC 编码器 )
  4. 【译】《Understanding ECMAScript6》- 第三章-Object
  5. linux查找启动程序的路径
  6. 启动类的@SpringBootApplication探究
  7. vb.net 模拟鼠标 失去焦点_孢子:EA最成功的神作,虽能“模拟万物”但却落得昙花一现...
  8. Updatepanel jquery 失效解决方案
  9. SCSI 设备热插拔
  10. matlab求多元函数微积分,中北大学高等数据MATLAB验证性实验7多元函数微积分学MATLAB实验报告格式...
  11. echarts + vue2.0 实现大数据监测态势感知系统
  12. 2019年CVTE凉
  13. 有什么日常可行的脑力锻炼方法,保持脑部活力?
  14. EXCEL中两列合并成一列以及根据相同列的值将表中一列的值复制到另一张表中?
  15. 商城-下单-订单系统接口
  16. 通用工业协议(CIP)形式化的安全分析(前期概念的梳理)
  17. 测试磁盘读取速度程序
  18. python函数和类的区别_python-函数、类与对象
  19. 程序员逼格提升完全指南
  20. Python 数据挖掘与机器学习基础-韦玮-专题视频课程

热门文章

  1. 达梦数据库DM8导出sql脚本
  2. OrientDB图遍历SQL之MATCH
  3. 银行视频监控系统解决方案
  4. 采用Dispatcher方式实现链接导出文件(在页面上实现导出文件)
  5. C# WebAPI 集成WINDOWS验证
  6. 02,Python网络爬虫第二弹《http和https协议》
  7. 攻防世界——supersqli进阶
  8. Yum三方仓库——RPMForge
  9. 解决报错显示:log4j:WARN No appenders could be found for logger .
  10. VC在编译链接的无故死掉解决方案(防VC6卡死)