【问题标题】:image coords changing on browser width change图像坐标随浏览器宽度变化而变化
【发布时间】:2020-04-14 19:25:14
【问题描述】:

您好,我正在单击图像上的特定点并在选定区域上显示一个图标。当我更改分辨率时,该点正在移动到图像的其他部分。下面是我的代码。如何修复分辨率或浏览器宽度变化的坐标。添加了 eventlistner 并且需要知道在窗口调整大小时必须进行任何计算吗?

我的组件是:

 import React, { Component } from "react";
import { withRouter } from "react-router-dom";
import { connect } from "react-redux";
import { showCardDetails } from "../../store/Action";
let temp = [];
class cardDetails extends Component {
  constructor(props) {
    super(props);
  }
  state = {
    left: "",
    right: "",
    coords: []
  };
  componentDidMount() {
    const { dispatch } = this.props;
    console.log(this.props.backOffice + "props");
    console.log(this.props.match.params.userId);
    let coords = JSON.parse(localStorage.getItem("coords"));
    this.setState({ coords: coords });
    window.addEventListener("resize", this.handlePress);
  }
  handlePress = () => {
    const { coords } = this.state;
    console.log(this.state);
   //anycalculation here?
  };
  handleclick = e => {
    var canvas = document.getElementById("imgCoord");
    var w = document.documentElement.clientWidth;
    var h = document.documentElement.clientHeight;
    console.log(e.offsetLeft);
    var x =
      e.clientX +
      document.body.scrollLeft +
      document.documentElement.scrollLeft;
    var y =
      e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
    let left = x + "px";
    let top = y + "px";
    let obj = {
      left: left,
      top: top,
      width: w,
      height: h
    };
    temp.push(obj);
    this.setState({ left: left, top: top, coords: temp });
    localStorage.setItem("coords", JSON.stringify(temp));
  };
  render() {
    const { backOffice, match } = this.props;
    const { left, top, coords } = this.state;
    console.log(coords);
    return (
      <React.Fragment>
        <div>
          <img
            id="imgCoord"
            src={require("../../assets/images/imageTagging.PNG")}
            onClick={$event => this.handleclick($event)}
          />
          {coords &&
            coords.map(item => (
              <img
                style={{
                  width: "20px",

                  position: "absolute",
                  left: item.left,
                  top: item.top,
                  backgroundColor: "white"
                }}
                src={require("../../assets/images/tag.png")}
                id="marker"
              />
            ))}
        </div>
      </React.Fragment>
    );
  }
}

/**
 * Redux map state
  @param {} state
  @param {} ownParams
 */
function mapStateToProps(state, ownParams) {
  console.log(state);
  return {
    backOffice: state.selectedCardData
  };
}

export default withRouter(connect(mapStateToProps)(cardDetails));

【问题讨论】:

    标签: javascript html reactjs coordinates


    【解决方案1】:

    [编辑]

    您需要在 componentDidMount 方法中添加一个事件监听器(这里是文档https://www.w3schools.com/jsref/event_onresize.asp),并在 componentWillUnmount 方法中删除这个监听器。 在监听器内部放置一个函数来设置新的坐标。

    还需要计算图标坐标相对于窗口宽度和高度的百分比

    handleclick = e => {
        ...your previous code
    
        const yPercent = h / top;
        const xPercent = w / left;
    
        this.setState({ yPercent, xPercent });
    };
    
    handleResize = () => {
        var w = document.documentElement.clientWidth;
        var h = document.documentElement.clientHeight;
    
        const newTop = (this.state.yPercent * h) + "px";
        const newLeft = (this.state.xPercent * w) + "px";
    
        this.setState({ left: newLeft; top: newTop });
    }
    

    【讨论】:

    • 我没听懂你能不能举个例子如何在页面调整大小时重置坐标
    • @Sudhir ,抱歉等了这么久,如果问题仍然相关,请告诉我
    • 我已经更新了我的代码并添加了事件监听器,你能看一下吗,我从昨天开始就一直卡在这个问题上
    • @Sudhir ,我已经编辑了答案。让我知道是否需要更多说明
    • 我已根据您的回答进行了更改但没有工作,一件事是我已将位置更改为图标的相对位置,因此当我更改它正在工作的分辨率时,此单击位置的问题未标记在确切的位置