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

vue实现鼠标滚轮控制页面横向滑动

先看效果

20240919_095531

1.首先创建一个xScroll.vue组件

<template>
  <div class="main" v-size-ob="mainSize">
    <div class="v-scroll">
      <div class="content">
        <slot></slot>
      </div>
    </div>
  </div>
</template>
<script setup lang="ts">

</script>
<style scoped lang="less">
.main {
  width: 100%;
  height: 100%;
}
</style>

在页面中使用

<div class="zlcXScroll">
      <xScroll>
        <div class="imgs">
          <div>
            <img src="https://picsum.photos/200/300" alt="" />
          </div>
          <div>
            <img src="https://picsum.photos/200/300" alt="" />
          </div>
          <div>
            <img src="https://picsum.photos/200/300" alt="" />
          </div>
          <div>
            <img src="https://picsum.photos/200/300" alt="" />
          </div>
          <div>
            <img src="https://picsum.photos/200/300" alt="" />
          </div>
          <div>
            <img src="https://picsum.photos/200/300" alt="" />
          </div>
          <div>
            <img src="https://picsum.photos/200/300" alt="" />
          </div>
          <div>
            <img src="https://picsum.photos/200/300" alt="" />
          </div>
          <div>
            <img src="https://picsum.photos/200/300" alt="" />
          </div>
          <div>
            <img src="https://picsum.photos/200/300" alt="" />
          </div>
          <div>
            <img src="https://picsum.photos/200/300" alt="" />
          </div>
          <div>
            <img src="https://picsum.photos/200/300" alt="" />
          </div>
          <div>
            <img src="https://picsum.photos/200/300" alt="" />
          </div>
          <div>
            <img src="https://picsum.photos/200/300" alt="" />
          </div>
          <div>
            <img src="https://picsum.photos/200/300" alt="" />
          </div>
          <div>
            <img src="https://picsum.photos/200/300" alt="" />
          </div>
          <div>
            <img src="https://picsum.photos/200/300" alt="" />
          </div>
        </div>
      </xScroll>
    </div>

效果:

将容器内的内容横向排列

.zlcXScroll {
    width: 100%;
    height: 300px;
    .imgs {
      display: flex;
      flex-direction: row;
      align-items: center;
      img {
        margin-right: 10px;
      }
    }
  }

效果:(目前需要按住shift再滑动滚轮)

2.利用盒子纵向滚动条默认不需要shift键

绿色盒子就是v-scroll,v-scroll网上转90之前,需要将内容(照片盒子content)向下旋转90°

3.获取红色盒子的宽高,赋值给绿色盒子的高宽

<template>
  <div class="main" v-size-ob="mainSize">
    <div class="v-scroll">
      <div class="content">
        <slot></slot>
      </div>
    </div>
  </div>
</template>
<script setup lang="ts">
import { reactive } from "vue";
let mainMes = reactive({
  w: 0,
  h: 0,
});
interface Eobj {
  width: number;
  height: number;
}
let mainSize = (e: Eobj) => {
  let { width, height } = e;
  mainMes.w = width;
  mainMes.h = height;
};
</script>
<style scoped lang="less">
.main {
  width: 100%;
  height: 100%;
  outline: 1px solid red;
  .v-scroll {
    outline: 1px solid rgb(17, 0, 255);
    --w: calc(v-bind(mainMes.w) * 1px);
    --h: calc(v-bind(mainMes.h) * 1px);
    width: var(--h);
    height: var(--w);
    .content{
       height: var(--h);
    }
  }
}
</style>

4.将content盒子向下旋转90°

按照左上角为中心,直接旋转,会跑到最大容器外面去,可以往右移一点距离(红色容器的高度),然后再旋转

<template>
  <div class="main" v-size-ob="mainSize">
    <div class="v-scroll">
      <div class="content">
        <slot></slot>
      </div>
    </div>
  </div>
</template>
<script setup lang="ts">
import { reactive } from "vue";
let mainMes = reactive({
  w: 0,
  h: 0,
});
interface Eobj {
  width: number;
  height: number;
}
let mainSize = (e: Eobj) => {
  let { width, height } = e;
  mainMes.w = width;
  mainMes.h = height;
};
</script>
<style scoped lang="less">
.main {
  width: 100%;
  height: 100%;
  outline: 1px solid red;
  .v-scroll {
    outline: 1px solid rgb(17, 0, 255);
    --w: calc(v-bind(mainMes.w) * 1px);
    --h: calc(v-bind(mainMes.h) * 1px);
    width: var(--h);
    height: var(--w);
    position: relative;
    .content {
      height: var(--h);
      position: absolute;
      left: var(--h);
      transform-origin: left top;
      transform: rotate(90deg);
    }
  }
}
</style>

效果:

5.content旋转完后,再将v-scroll向上旋转90°即可

<template>
  <div class="main" v-size-ob="mainSize">
    <div class="v-scroll">
      <div class="content">
        <slot></slot>
      </div>
    </div>
  </div>
</template>
<script setup lang="ts">
import { reactive } from "vue";
let mainMes = reactive({
  w: 0,
  h: 0,
});
interface Eobj {
  width: number;
  height: number;
}
let mainSize = (e: Eobj) => {
  let { width, height } = e;
  mainMes.w = width;
  mainMes.h = height;
};
</script>
<style scoped lang="less">
.main {
  width: 100%;
  height: 100%;
  outline: 1px solid red;
  .v-scroll {
    outline: 1px solid rgb(17, 0, 255);
    --w: calc(v-bind(mainMes.w) * 1px);
    --h: calc(v-bind(mainMes.h) * 1px);
    width: var(--h);
    height: var(--w);
    position: relative;
    overflow: hidden scroll;
    transform-origin: 0 0;
    transform: translateY(var(--h)) rotate(-90deg);
    &::-webkit-scrollbar {
      width: 0;
      height: 0;
    }
    .content {
      height: var(--h);
      position: absolute;
      left: var(--h);
      transform-origin: left top;
      transform: rotate(90deg);
    }
  }
}
</style>

效果:(现在不需要按住shift,可直接滑动滚轮实现页面横向滑动)

6.v-size-ob是自定义指令:(获取元素的宽高)

新建一个sizeOb.ts文件

const map = new WeakMap();
const ob = new ResizeObserver((entries) => {
  for (const entry of entries) {
    const handler = map.get(entry.target);
    if (handler) {
      const box = entry.borderBoxSize[0];
      handler({
        width: box.inlineSize,
        height: box.blockSize,
      });
    }
  }
});

export default {
  mounted(el, binding) {
    ob.observe(el);
    map.set(el, binding.value);
  },
  unmounted(el) {
    ob.unobserve(el);
  },
};

在main.ts入口文件中引入

import { createApp } from "vue";
import "./style.css";
import App from "./App.vue";
import Antd from "ant-design-vue";
import "ant-design-vue/dist/reset.css";
import sizeOb from "./directives/sizeOb";

let app = createApp(App);
app.config.globalProperties.msg = "hello";

//自定义指令
app.directive("size-ob", sizeOb);

app.use(Antd).mount("#app");

http://www.kler.cn/a/321019.html

相关文章:

  • 【Linux:IO多路复用(select、poll函数)
  • 系统架构师考试18天极限备考复盘(2024年11月)
  • Python sys模块介绍
  • 【Linux】Linux 权限的理解
  • 数据库范式、MySQL 架构、算法与树的深入解析
  • 122、java的LambdaQueryWapper的条件拼接实现数据sql中and (column1 =1 or column1 is null)
  • 你知道吗?制造手机芯片的关键竟然是一台“打印机”?
  • Redis配置文件详解(上)
  • 【报告阅读】chatgpt-o1 技术报告阅读 | 新的迭代开始了~
  • 大数据新视界 --大数据大厂之数据清洗工具 OpenRefine 实战:清理与转换数据
  • Java 入门指南:获取对象的内存地址
  • 美信监控易的优势:长期稳定运行
  • java se 快速入门
  • 自制网络连接工具(支持tcpudp,客户端服务端)
  • SDK(1.1note)
  • Qt/C++事件过滤器与控件响应重写的使用、场景的不同
  • 【ollama 在linux 上离线部署 本地大模型】
  • vue-animate-onscroll动画库(可来回触发动画)
  • Latex和Vscode安装和配置
  • 【Python】pip安装加速:使用国内镜像源
  • 华为---代理ARP简介及示例配置
  • 深度学习模型之BERT的24个小模型源码与预训练紧凑模型的重要性
  • c# 自定义字符串排序
  • Vue引入js脚本问题记录(附解决办法)
  • CAD 3dsmax maya等autodesk系列专用卸载修复工具AutoRemove,一键完全彻底卸载删除软件的专用卸载工具
  • jmeter性能测试---csv数据文件设置