前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >图片不变形,宽高不超出父元素的情况下旋转图片

图片不变形,宽高不超出父元素的情况下旋转图片

作者头像
前端GoGoGo
发布2018-08-24 16:30:10
2K0
发布2018-08-24 16:30:10
举报

demo

如题,具体的效果见这里 。做这样的效果的难点在于,计算没旋转前图片的宽,高和旋转后的宽高。

下面来看具体的实现。

实现步骤

让图片在父元素中水平居中,垂直居中显示。我用的是 flex。

代码语言:javascript
复制
/* 图片的父元素 */
.img-wrap{
  display: flex;
  justify-content: center;
  align-items: center;
  height: 400px;
}

获得图片的实际的宽高

代码语言:javascript
复制
function getImgSize (src) {
  return new Promise(function (resolve, reject) {
    $('<img/>', {
      load: function () {
        resolve({
          width: this.width,
          height: this.height
        })
      },
      src: src
    })
  })
}

获得父元素的宽高

代码语言:javascript
复制
let $imgWrap = $('.img-wrap')
let wrapSize = {
  width: $imgWrap.width(),
  height: $imgWrap.height()
}

计算图片在父元素中的宽高

我们知道图片在旋转 (2n * 90)度在父元素的宽高是一样的,((2n + 1) * 90) 度在父元素的宽高是一样的。所以我们只需要两组宽高。

图片的宽和高要满足

  • 不超出父元素
  • 图片不能变形

在上面的条件下,图片的宽高只有有限的值可以选。

  • 在 旋转 (2n * 90) 度的情况下
    • 图片的宽为父元素的宽,高度自适应
    • 图片的高为父元素的高,宽度自适应
  • 在 旋转((2n + 1) * 90) 度的情况下
    • 图片的宽为父元素的高,高度自适应
    • 图片的高为父元素的宽,宽度自适应

大概的代码如下

代码语言:javascript
复制
// this.imgSizeInfo 存旋转 (2n * 90) 度和旋转 ((2n + 1) * 90) 度的宽高
let imgRatio = imgSize.width / imgSize.height
let imgW = wrapSize.width
let imgH = imgW / imgRatio
if (imgH < wrapSize.height) {
  this.imgSizeInfo.push([wrapSize.width + 'px', 'auto'])
} else {
  this.imgSizeInfo.push(['auto', wrapSize.height + 'px'])
}
// 旋转((2n + 1) * 90) 度后
imgW = wrapSize.height
imgH = imgW / imgRatio
if (imgH < wrapSize.width) {
  this.imgSizeInfo.push([wrapSize.height + 'px', 'auto'])
} else {
  this.imgSizeInfo.push(['auto', wrapSize.width + 'px'])
}

旋转

旋转用 CSS3 的 transform: rotate(旋转角度)deg; 来实现。旋转后,需要从新设置图片宽高。

代码语言:javascript
复制
rotate: function (degree) {
  this.rotateDegree += degree
  this.styleObject.transform = `rotate(${this.rotateDegree}deg)`
  if (this.rotateDegree % 180 === 0) {
    this.styleObject.width = this.imgSizeInfo[0][0]
    this.styleObject.height = this.imgSizeInfo[0][1]
  } else {
    this.styleObject.width = this.imgSizeInfo[1][0]
    this.styleObject.height = this.imgSizeInfo[1][1]
  }
}

对应的 html

代码语言:javascript
复制
<div class="target-wrap">
  <div class="img-wrap">
    <img src="demo.png" alt="" class="target" :style="styleObject">
  </div>
  <a href="javascript:void(0);" class="target-left-control" @click="rotate(-90)">左转90度</a>
  <a href="javascript:void(0);" class="target-right-control" @click="rotate(90)">右转90度</a>
</div>

demo 的完整代码,见这里


本文遵守创作共享CC BY-NC-SA 4.0协议 网络平台如需转载必须与本人联系确认。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016.09.03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 实现步骤
    • 让图片在父元素中水平居中,垂直居中显示。我用的是 flex。
      • 获得图片的实际的宽高
        • 获得父元素的宽高
          • 计算图片在父元素中的宽高
            • 旋转
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档