electron 不支持Ctrl+滚动条放大缩小,自己动手做了一个react组件

摘要:
需要注意的是,这仅适用于Electron的包装要求。一般来说,不会有这样的要求,因为浏览器有这样的功能!!!滚动框。TsximportReact,{useEffect,useRef,useState}from'act'导入{Button}from‘td'etsize=1//默认大小lettimer=null//计时器关闭导出默认值=˃{const[isZoom,setIsZoom]=useState//是否显示控制器const[isOver,setIsOver]=useState//是否显示控件const[per,setPer]=use状态//控制器百分比useEffect//放大函数zoomOut(){size=size˃=3?

前言:功能是不难的,看过代码之后,肯定能理解,肯定。重点说明,这仅仅是为了electron打包做的需求,一般是不会有这样的需求,因为浏览器都带有这样的功能!!!说三遍!!说三遍!!说三遍!!

ScrollBox.tsx

import React, { useEffect, useRef, useState } from 'react'
import { Button } from 'antd'
let size = 1 // 默认大小
let timer = null // 定时器关闭

export default ({ claName }) => {
  const [isZoom, setIsZoom] = useState(false) // 是否显示控制器
  const [isOver, setIsOver] = useState(false) // 是否显示控制器
  const [per, setPer] = useState(100) // 控制器百分数

  useEffect(() => {
    start() // 绑定键盘滚轮事件
  }, [])

  // 放大
  function zoomOut() {
    size = size >= 3 ? size:  size + 0.05;
    const num = +Math.floor(size * 100).toFixed(0)
    setPer(num)
    set();
  }

  // 缩小
  function zooMin() {
    size = size <= 0.6 ? size : size - 0.05;
    const num = +Math.floor(size * 100).toFixed(0)
    setPer(num)
    set();
  }

  // 放大缩小修改样式
  function set() {
    setIsZoom(true)
    const divElement = document.querySelector(`.${claName}`)
    // @ts-ignore
    divElement.style.zoom = size+'';
    // @ts-ignore
    divElement.style.cssText += '; -moz-transform: scale(' + size + ');-moz-transform-origin: 0 0; ';
    // document.body.style.zoom = size+'';
    // document.body.style.cssText += '; -moz-transform: scale(' + size + ');-moz-transform-origin: 0 0; ';
  }

  // 重置
  function reset() {
    size = 1
    setPer(100)
    const divElement = document.querySelector(`.${claName}`)
    // @ts-ignore
    divElement.style.zoom = size+'';
    // @ts-ignore
    divElement.style.cssText += '; -moz-transform: scale(' + size + ');-moz-transform-origin: 0 0; ';
  }

  // 启动
  function start() {
    const userAgent = navigator.userAgent
    if (userAgent.includes('NativeClient')) {
      document.onkeydown = e => {
        const key = e.key // Control
        window.onmousewheel = (e: any) => {
          const wheelDelta = e.wheelDelta
          if (key === 'Control' && wheelDelta > 0) {
            zoomOut()
          } else if (key === 'Control' && wheelDelta < 0) {
            zooMin()
          }
        }
      }
      document.onkeyup = e => {
        const key = e.key // Control
        if (key === 'Control') {
          window.onmousewheel = null
          // @ts-ignore
          timer = setTimeout(() => {
            setIsZoom(false)
            timer = null
          }, 1500)
        }
      }
    }
  }

  // 鼠标放在控制器不消失
  const mouseOver = () => {
    setIsOver(true)
  }

  // 鼠标离开控制器消失
  const mouseOut = () => {
    setIsOver(false)
    setIsZoom(false)
  }

  const scrollBoxStyle: any = {
    position: 'absolute',
    top: '20px',
    right: '30px',
    padding: '5px 12px',
    boxShadow: '0 1px 1px #999',
    cursor: 'default',
    userSelect: 'none',
  }

  return (
    <div>
      {
        isZoom || isOver ? <div style={scrollBoxStyle} onMouseEnter={mouseOver} onMouseLeave={mouseOut}>
          <span style={{ marginRight: '50px' }}>{per}%</span>
          <span style={{ padding: '5px 12px',fontSize: '20px' }} onClick={zooMin}>-</span>
          <span style={{ padding: '5px 12px',fontSize: '20px' }} onClick={zoomOut}>+</span>
          <Button onClick={reset}>重置</Button>
        </div> : ''
      }
    </div>
  )
}

  

使用方式:

在最外层的tsx文件中引入,比如说你的内容都包含在一个父div下,就把上面那个组件引入最大的.tsx文件下面,与包含所有的那个父div并列,如下:

import React from 'react'
import ScrollBox from '@/components/ScrollBox'
import Login from '@/pages/login/index'

export default () => {
  const click = () => {
  }
  return (
    <div>
      <div>
        <ScrollBox claName={'ssss'}></ScrollBox> // 滚动组件
        <Login className={'ssss'}></Login> // 我的所有内容都在这个组件下面,className要保持一致,因为是根据className找到对应的标签进行操作,至于为什么不对bady操作,因为操作body会导致控制器也跟着变大变小,与谷歌自带的功能相违背
      </div>
    </div>
  )
}

  

免责声明:文章转载自《electron 不支持Ctrl+滚动条放大缩小,自己动手做了一个react组件》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ntfs-3g### Cause: java.sql.SQLException: Connection is read-only. Queries leading to data modification are下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

饿了么vue-cli3.0+cube-ui笔记

1、目录结构 模板文件是public里的index.html,运行项目的时候,会引用src/main.js(入口文件) 详细文档在这里:https://cli.vuejs.org/zh/config/#pwa public:放着html模板和静态资源,public/index.html文件是一个会被html-webpack-plugin处理的模板。在构建...

QCefView实现与JS的交互

Cef主动向JS通信主要有一种方法:首先在Cef中 QCefEvent event ( const QString& eventName ); //定义一个CEF事件 event.setStringProperty ( const QString& key, const QString& msg ); //为事件添加参数 board...

关于react实现类似vue keep-alive 的cache router的功能解决方案

// 问题来源 众所周知react是单页面应用,在路由发生变化的时候,她所对应的页面或者组件会被卸载。当路由加载的时候,原页面所有的数据都会重新加载 这在移动端的用户体验可能是一个重大灾难! 比如列表滚动到第20页或者tab切换第三个tab 再去滚动列表进入详情页,当你返回的时候你原来的浏览记录被重新加载了,这个体验会是非常差。 react官方...

Taro开发微信小程序的初体验

了解Taro 听说Taro是从几个星期前开始的,在一次饭桌上,一个小伙伴说:“Hey, 你听说了Taro么,听说只需要写一套程序就可以生成H5,小程序以及RN的代码模板,并且类似于React的语法。”“哦?还有这么好的事,赶紧研究一下。” Taro初体验 去官网,Github了解了一下,Taro是由京东·凹凸实验室团队开发的,在掘金上看到他们的发稿,大致归...

PHP socket 接收 java端口 netty 网络字节序

java 服务端测试代码: @Override public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throwsException { buffer.writeShort(5); buffer.writeI...

React Native Image多种加载图片方式

React-NativeImage加载图片方式解析 1.加载当前工程文件夹下图片 <Image style={styles.image} source={require('./TT2.jpg')} /> 2.加载当前应用沙盒文件内图片 分析: 假定图片存储在document文件夹下(document/TT1.jpg) 理论上这个加载方式和第一种...