当前位置: 首页 > news >正文

vue 实现根据窗口大小自适应图片预览

目录

    • 0.data 字段设置
    • 1.监听窗口大小的改变,更新 screenSize
    • 2.获取图片的原始宽高,更新 picWidth / picHeight
    • 3.使用计算属性计算预览时图片的宽高

  <!-- 查看大图 -->
  <div class="viewPic-container" v-show="picSrc">
    <!-- 遮罩层 -->
    <div class="modal" @click="endViewPic"></div>
    <img class="viewPic-img" :src="picSrc" :style="{width, height} = picSize">
  </div>
.viewPic-container {
  display:flex;
  justify-content: center;
  align-items: center;
  position:fixed;
  top:0;
  left:0;
  width:100vw;
  height:100vh;
  z-index:100;
}
.modal {
  position:absolute;
  top:0;
  left:0;
  width:100%;
  height:100%;
  background-color:#000;
  opacity:.5;
}
.viewPic-img{
  display: block;
  position:relative;
  object-fit: scale-down;
}

0.data 字段设置

  • screenSize 记录视窗大小的对象
  • picSrc 预览的图片 src
  • picWidth 图片的原始宽度
  • picHeight 图片的原始高度
  data() {
    return {
	  // 监听窗口大小,使图片自适应
      screenSize:null,
      // 查看大图的图片 src 及其原始大小
      picSrc:'',
      picWidth:0,
      picHeight:0,
    }
  },

1.监听窗口大小的改变,更新 screenSize

  • 在 mounted 中,设置监听窗口大小的改变
  • 当窗口大小发生改变的时候,使用 window.innerWidth 和 window.innerHeight 将 data 中对应的字段更新
  • 记得使用防抖装饰器包装。
mounted() {
  // 初始化窗口大小 + 设置监听
  this.screenSize = {
    width:document.body.clientWidth,
    height:document.body.clientHeight
  }
  window.onresize = this.listenScreenSize
},
beforeUnmounted(){
  window.onresize = null
},
methods: {
	// 监听窗口大小变化
	listenScreenSize:this.debounceWrapper(function(e){
	  const {innerWidth:width, innerHeight:height} = e.target
	  this.screenSize = {width, height}
	  console.log('ScreenSize', this.screenSize, width, height)
	}),
	debounceWrapper(func){
	  let timer;
	  return function(){
	  	clearTimeout(timer);
	  	timer = setTimeout(()=>func.apply(this, arguments),500)
	  }
	}
}

2.获取图片的原始宽高,更新 picWidth / picHeight

img 元素有 naturalWidthnaturalHeight 属性,值为图片的原始宽度和高度。但是需要图片先渲染到页面上才能获取。
因此可以考虑获取所点击的缩略图的属性。

在双击缩略图的时候触发方法 viewPic

<div class="img" @click="viewPic(scope.row.url,$event)">
    <img :src="scope.row.url" alt="thumbnail">
</div>
    // 查看大图
    viewPic(src, e){
      console.log('viewPic', src)
      const img = e.target.querySelector('img') || e.target
      console.log(img)
      this.picSrc = src
      this.picWidth = img.naturalWidth
      this.picHeight = img.naturalHeight
    },

3.使用计算属性计算预览时图片的宽高

使用计算属性能够在依赖的数据发生改变时重新计算。

假设预览时图片的宽度最大为视窗宽度的 90%,
图片的高度最大为视窗高度的 95%。

  1. 分别计算图片宽度最大时的缩放比例scaleX = 最大允许宽度 / 图片的原始宽度,和高度最大时的缩放比例 scaleY = 最大允许高度 / 图片的原始高度
  2. 然后取 scaleX, scaleY, 1 中最小的一个作为图片的缩放比例 scale。这里的 1 是因为如果图片本身小于视窗的大小,scaleXscaleY 都会大于1,即图片最后会被放大。取 1 时图片将保持原始大小。
  3. 计算经缩放比例 scale 缩放后的图片宽度和高度,返回即可
computed:{
    // 计算图片的宽度和高度
    picSize(){
      if(!this.picWidth || !this.picHeight) return {width:0, height:0}
      const scaleX =  this.screenSize.width * 0.9 / this.picWidth
      const scaleY = this.screenSize.height * 0.95 / this.picHeight 
      const scale = Math.min(scaleX, scaleY, 1)
      console.log(scale)
      const width = this.picWidth * scale + 'px'
      const height = this.picHeight * scale + 'px'
      console.log("picSize", width, height)
      return { width, height }
    },
  },

相关文章:

  • 《计算机网络 自顶向下方法》笔记 - 第二章 应用层
  • 使用 BrowserRouter 报错 invaild hook call 解决方案
  • python中assert关键字的作用
  • CSS3 :nth-child(n)用法
  • CSS3中的transition属性详解
  • HTML中导航栏title前面小图标的实现
  • mysql区分大小写
  • SpringMvc中/和/*的区别
  • varchar 和 varchar2的区别
  • IntelliJ IDEA 各种搜索功能
  • HashMap中的tableSizeFor(int cap)
  • Jdk1.8-HashMap put() 方法tab[i = (n - 1) hash] 解惑
  • JDK1.8源码 resize()解析
  • HashMap中的迭代器
  • Hashtable中的get(key)方法,为什么进行hash 0x7FFFFFFF
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • 【前端学习】-粗谈选择器
  • DOM的那些事
  • js
  • Js基础知识(一) - 变量
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • SpringBoot几种定时任务的实现方式
  • 阿里云Kubernetes容器服务上体验Knative
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 设计模式 开闭原则
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 自动记录MySQL慢查询快照脚本
  • 你对linux中grep命令知道多少?
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (bean配置类的注解开发)学习Spring的第十三天
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (强烈推荐)移动端音视频从零到上手(上)
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (五)MySQL的备份及恢复
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (转载)(官方)UE4--图像编程----着色器开发
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .NET 4.0中的泛型协变和反变
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .Net小白的大学四年,内含面经
  • .pop ----remove 删除
  • @德人合科技——天锐绿盾 | 图纸加密软件有哪些功能呢?
  • @我的前任是个极品 微博分析
  • [1]-基于图搜索的路径规划基础
  • [Android]竖直滑动选择器WheelView的实现
  • [JavaWeb]—Spring入门
  • [KMP求最小循环节][HDU1358][Period]
  • [LOJ#6259]「CodePlus 2017 12 月赛」白金元首与独舞
  • [MAUI]集成高德地图组件至.NET MAUI Blazor项目