Vue3、TypeScript 实现图片数量及大小随宽度自适应调整

前言

过了这么久,想起自己还有个博客,更点内容吧!

来,上需求!

最近在做个前端界面,要求在一行中展示一些图片,展示的图片数量随着窗口宽度大小进行变化,除此之外还有以下要求:

  • 图片要均匀分布;
  • 所有图片要完整的填充一整行;
  • 图片的大小随着窗口宽度变化自适应调整。

不说了,不说了,上个最终实现效果图。

dynamic_show_iamge_in_vue3.gif

实现

基本思路

最开始是打算主要依靠 CSS 的布局来实现,几乎把自己了解的布局方式都想了一遍了,最后默默的给自己找了个借口:刚开始学,不要为难自己!不要为难自己!

motion_1.jpg

最终思路:

  1. 每张图片设定一个最小宽度;
  2. 当JS监测到窗口宽度变化后获取窗口宽度;
  3. 计算在当前窗口宽度,使用最小宽度图片的情况下一行中可以容纳的最多图片数量;
  4. 计算出一行中剩余的空间,然后平均分配给所有图片,得到最终的图片宽度;
  5. 最后通过 CSS 调整图片大小。

代码实现

测试环境:vite + vue3 + ts + sass

<!--
 * @Author       : KK
 * @Date         : 2022-02-19 12:30:41
 * @LastEditTime : 2022-02-19 13:58:02
-->


<script setup lang="ts">
import { reactive, onMounted, onUnmounted } from 'vue'
// 计算中心 content 的可视宽度 viewpoint-width,content 占据一行的85%宽度
const vw = () => document.body.clientWidth * 0.85; 
const minBoxCnt = 3; // 最少可显示的盒子数量
const maxBoxCnt = 8; // 最多可显示的盒子数量
const boxInfo = reactive({
  w: 160, // 盒子的宽度
  mw: 160,  // 盒子的最小宽度
  ratio: 1.45,// 高宽比
  gap: 20, // 盒子间的 gap 大小
  cnt: 3,  // 可显示的盒子数量
})

// 计算中心区域可以容纳的盒子数量并设定盒子的宽度
const cal_box_cnt = () => {
  let c = Math.floor(vw() / boxInfo.mw);
  c = Math.min(c, maxBoxCnt);
  const cal_lave_space = (c: number) => {
  	return vw() - boxInfo.mw * c - boxInfo.gap * (c - 1);
  }
  let lave_space = 0;
  let width = 0;
  if ((lave_space = cal_lave_space(c)) > 0) {
    width = boxInfo.mw + lave_space / c;
  } else {
    c--;
    width = boxInfo.mw + cal_lave_space(c) / c;
  }
  // console.log(lave_space, c, vw());
  boxInfo.w = width;
  if (c < minBoxCnt) {
    boxInfo.w = boxInfo.mw;
  }
  // console.log(boxInfo.w);

  return Math.max(c, minBoxCnt);
}

boxInfo.cnt = cal_box_cnt()
onMounted(() => window.onresize = () => boxInfo.cnt = cal_box_cnt());
onUnmounted(() => window.onresize = null);
</script>

<template>
  <div class="outer">
    <div class="inner" v-for="item in boxInfo.cnt">
      <img src="./assets/bg.jpg" alt="background" />
    </div>
  </div>
</template>

<style lang="scss">
body {
  background-color: darkcyan;
}
#app {
  width: 85%;
  min-width: 520px; // 160 * 3 + 2 * 20
  margin: 100px auto;
  background-color: #fff;
}

.outer {
  display: flex;
  flex-wrap: nowrap;
  transition: all 0.5s;
  .inner {
    img {
      width: 100%;
      height: 100%;
    }
  }
  .inner:nth-child(n) {
    width: v-bind('boxInfo.w + "px"');
    height: v-bind('boxInfo.w * boxInfo.ratio + "px"');
    margin-right: v-bind('boxInfo.gap + "px"');
  }
  .inner:last-child {
    margin-right: 0;
  }
}
</style>

本文章转自:https://blog.nas-kk.top/?p=449

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 3中实现拖动改变元素宽度实现宽度自适应的方法如下: 1. 首先,创建一个可拖动的元素,可以使用HTML的`<div>`标签,并给它一个固定的宽度。 2. 在Vue组件中,使用`@mousedown`事件监听鼠标按下的动作,并绑定一个方法来处理拖动事件。 3. 在这个方法中,使用`@mousemove`和`@mouseup`事件来监听鼠标移动和释放的动作,并绑定对应的方法来处理。 4. 在鼠标按下时,记录下鼠标的初始位置和元素的初始宽度。 5. 在鼠标移动时,计算鼠标移动的距离,并根据这个距离计算出新的元素宽度。 6. 更新元素的宽度,可以使用Vue的响应式数据或者直接操作DOM元素。 下面是一个示例代码: ```html <template> <div class="draggable" :style="{ width: width + 'px' }" @mousedown="startDragging"> <!-- 内容 --> </div> </template> <script> export default { data() { return { startX: 0, startWidth: 0, width: 200, // 初始宽度 }; }, methods: { startDragging(event) { this.startX = event.clientX; this.startWidth = this.width; document.addEventListener('mousemove', this.drag); document.addEventListener('mouseup', this.stopDragging); }, drag(event) { const dx = event.clientX - this.startX; this.width = this.startWidth + dx; }, stopDragging() { document.removeEventListener('mousemove', this.drag); document.removeEventListener('mouseup', this.stopDragging); }, }, }; </script> <style scoped> .draggable { border: 1px solid #ccc; cursor: col-resize; } </style> ``` 这样,当你拖动可拖动元素时,它的宽度会随着鼠标的移动而改变,并实现宽度自适应效果。注意,在实际项目中,你可能需要根据需求对代码进行适当的修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值