HTML5 图片宽高自适应,居中裁剪不失真
一,使用 JS,先上效果图,右图为定死宽高的效果,左图为处理之后的


1, 主要思路是,在图片 onload 后,将图片的宽高比和 div 容器的宽高比进行比较,
2, 从而确定拉伸或者压缩之后是宽还是高不足以填充容器
3,将不足以填充容器的方向设置为和容器一致
4,此时,图片的另一个方向可能超出容器,此时只要将图片做反方向的偏移,使其居中
5,容器定义超出部分不显示,以下是结合 Vue 的一个例子
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>图片居中</title>
<link rel="stylesheet" href="../../common/css/common.css">
<script src="../../common/js/common.js"></script>
<script src="../../common/js/vue.min.js"></script>
<style type="text/css">
#main {
font-size: 0;
}
.box {
display: inline-block;
vertical-align: center;
width: 150px;
height: 150px;
overflow: hidden;
margin: 50px 0 0 20px;
}
</style>
</head>
<body>
<div id="main">
<div class="box" v-for="(item, i) in srcs">
<img :src="item" @load="resizeImg($event, 150, 150)">
</div>
</div>
<script type="text/javascript">
var vm = new Vue({
data: {
srcs: [
"http://img.zcool.cn/community/01b34f58eee017a8012049efcfaf50.jpg@1280w_1l_2o_100sh.jpg",
"http://img17.3lian.com/d/file/201703/07/4ceeb6fc3d7956ac7731290a603e0a84.jpg",
"https://up.enterdesk.com/edpic_source/f5/34/83/f53483429ccc69d00ae98dd5f05317a4.jpg",
"http://img.taopic.com/uploads/allimg/131125/240503-1311250IT642.jpg"
]
},
methods: {
// 对图片大小调整,使其能够刚好充满容器, 多余方向裁剪使得图片不变形
resizeImg: function (ev, w, h) {
var img = ev.target;
console.log(img)
var scalebox = w / h, shifting = 0;
var scaleImg = img.width / img.height;
if (scalebox > scaleImg) {
img.width = w;
shifting = parseInt((img.height - h) / 2);
img.style.marginTop = 0 - shifting + 'px';
} else {
img.height = h;
shifting = parseInt((img.width - w) / 2);
img.style.marginLeft = 0 - shifting + 'px';
}
}
}
}).$mount("#main");
</script>
</body>
</html>
二,使用 CSS 的 backgroud-image,backgroud-size,backgroud-postion 属性,这个比较简单,兼容性也比较好,推荐使用
注意,绑定数据的时候,使用 backgroud-image 不要使用 backgroud,否则会覆盖 backgroud-size,backgroud-postion 这两个属性
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>图片居中</title>
<link rel="stylesheet" href="../../common/css/common.css">
<script src="../../common/js/common.js"></script>
<script src="../../common/js/vue.min.js"></script>
<style type="text/css">
#main {
font-size: 0;
}
.box {
display: inline-block;
vertical-align: top;
margin: 50px 0 0 20px; width: 150px; /* 容器必须设置宽高 */
height: 150px;
background-size: cover;
background-position: center center;
}
</style>
</head>
<body>
<div id="main">
<div class="box" v-for="(item, i) in srcs" :style="{'background-image': 'url(' + item + ')'}"></div>
</div>
<script type="text/javascript">
var vm = new Vue({
data: {
srcs: [
"http://img.zcool.cn/community/01b34f58eee017a8012049efcfaf50.jpg@1280w_1l_2o_100sh.jpg",
"http://img17.3lian.com/d/file/201703/07/4ceeb6fc3d7956ac7731290a603e0a84.jpg",
"https://up.enterdesk.com/edpic_source/f5/34/83/f53483429ccc69d00ae98dd5f05317a4.jpg",
"http://img.taopic.com/uploads/allimg/131125/240503-1311250IT642.jpg"
]
}
}).$mount("#main");
</script>
</body>
</html>
HTML5 图片宽高自适应,居中裁剪不失真的更多相关文章
- css+background实现 图片宽高自适应,拉伸裁剪不变形
图片宽高不固定 ,一样实现自适应,拉伸裁剪不变形,适应各大兼容性. 下面咱们在网上找两张宽高不一样的照片: No.1 ...
- jquery操作html中图片宽高自适应
在网站制作中如果后台上传的图片不做宽高限制,在前台显示的时候,经常会出现图片变形,实用下面方法可以让图片根据宽高自适应,不论是长图片或者高图片都可以完美显示. $("#myTab0_Cont ...
- JS实现图片宽高的等比缩放
关于图片宽高的等比缩放,其实需求就是让图片自适应父容器的宽高,并且是等比缩放图片,使图片不变形. 例如,需要实现如下的效果: 要实现上面的效果,需要知道图片的宽高,父容器的宽高,然后计算缩放后的宽高. ...
- 从零开始学习前端开发 — 7、CSS宽高自适应
一.宽度自适应 语法:width:100%; 注: a)块状元素的默认宽度为100% b) 当给元素设置宽度为100%时,继承父元素的宽度 c) 通常使用宽度自适应实现通栏效果 二.高度自适应 语法: ...
- php 图片上传的公共方法(按图片宽高缩放或原图)
写的用于图片上传的公共方法类调用方法: $upload_name='pic';$type = 'logo_val';$file_name = 'logo_' . $user_id .create_st ...
- css3圆形头像(当图片宽高不相等时)
1.图片宽高相等,width:300px: height:300px; 把他变成宽高100px的圆形头像 img{width:100px; height:100px; border-radius:50 ...
- JS快速获取图片宽高的方法
快速获取图片的宽高其实是为了预先做好排版样式布局做准备,通过快速获取图片宽高的方法比onload方法要节省很多时间,甚至一分钟以上都有可能,并且这种方法适用主流浏览器包括IE低版本浏览器. 我们一步一 ...
- 007. 自定义ListBox的item的宽高, 字体居中
/// <summary> /// 自定义ListBox的item的宽高, 字体居中 /// </summary> /// <param name="sende ...
- 转载:JS快速获取图片宽高的方法
快速获取图片的宽高其实是为了预先做好排版样式布局做准备,通过快速获取图片宽高的方法比onload方法要节省很多时间,甚至一分钟以上都有可能,并且这种方法适用主流浏览器包括IE低版本浏览器. 我们一步一 ...
随机推荐
- kafka产生的数据通过Flume存到HDFS中
试验目标: 把kafka的生产者发出的数据流经由Flume放到HDFS来存储. 试验环境: java:1.8 kafka:2.11 flume:1.6 hadoop:2.8.5 试验流程: 1.进入z ...
- bundle adjustment原理(1)
那些光束平差的工具,比如SBA.SSBA之类的虽然好,然而例子和教程都不够多且不够详细,让初学者难以上手. 要传入的参数虽然有解释,然而却也不是十分清楚其含义,具体要怎么生成,生成为什么形式. 我在折 ...
- junit中线程需要注意的问题
Junit主线程执行完毕后,就会结束进程,不关注是否有其他线程在运行.当Junit运行完毕后,如果其他线程还没有执行完毕,那么不会再执行. 使用CountDownLatch,保证启动的线程运行结束后, ...
- Android-PullToRefresh 下拉刷新增加setOnItemLongClickListener
项目地址:https://github.com/chrisbanes/Android-PullToRefresh 不知道为什么这个项目没有给listview 加 OnItemLongClickLis ...
- Android 按下home键,程序在后台运行,在设置中点击程序的启动时,会再次打开启动页的解决办法
在onCreate()方法中增加如下代码即可: if (!isTaskRoot()) { finish(); return; }
- 2018-7-23到quectel报道
以后和quectel产品相关的技术都会用这个blog来记录
- Kaptcha
Kaptcha:google自动生成验证码组件 kaptcha的使用比较方便,只需添加jar包依赖之后简单地配置就可以使用了 kaptcha所有配置都可以通过web.xml来完成,如果你的项目中使用了 ...
- GIT命令行笔记
一次常规的初始化+推送: git initgit config user.email "you@example.com"git config user.name "asm ...
- rsync+inotfiy文件同步
rsync+inotfiy文件同步 1.部署rsync服务 yum install rsync #安装rsync,如果嫌yum版本过低也可以源码安装 2.vim /etc/rsyncd.conf #默 ...
- 外网访问内网的FTP服务器-原理解析
1. 背景简介 最近研究如何在内网搭架FTP服务器,同时要保证外网(公网)能访问的到.终成正果,但走了一些弯路,在此记下,以飨后人. 2. 基础知识 FTP 使用 2 个端口,一个数据端口和一个命令端 ...