element.style.top 在变为什么 对应元素位置可以不变?

<!DOCTYPE html>

<html lang="en">  

<head>

    <meta charset="UTF-8" />

    <meta name="viewport" content="width=device-width, initial-scale=1.0" />

    <meta http-equiv="X-UA-Compatible" content="ie=edge" />

    <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>

    <title>Document</title>

    <!-- <script src="./demo/jquery.min.js"></script> -->

  </head>

  <style lang="">

    

    *{

        margin: 0;

        padding: 0;

      }


    body{

      /*height: 1000px;*/

      /*position: relative;*/

      /*margin:0px;

      padding:0px;*/

    }

    .point {

      position: absolute;

      border: 5px solid red;

    }


    .ball{

      width:4px;

      height:4px;

      /*background: #d9fe37;*/

      background: red;

      border-radius: 50%;

      position: absolute;

    }


    #sketchPad{

        /*width: 400px;

        height: 400px;*/

        /*left: 100px;

        top: 100px;*/

        /*background-color: #ff0;

        overflow: auto;*/

        /*position: relative;*/

     }

    

    .small{

        position: relative;

        height: 300px;

        overflow: auto;

      }


    .small img{

        height: 300px;

      }


    #selectImage{

      left: 200px;

      top: 500px;

      position: absolute;

    }

    

    .box{

        width: 300px;

        height: 300px;

        margin: 100px;

        border: 1px solid #ccc;

        position: relative;

        /*overflow: auto;*/

      }


    .big{

        width: 600px;

        height: 600px;

        position: absolute;

        top: 0;

        left: 560px;

        border: 1px solid #ccc; 

        overflow: auto;

        /*display: none;*/

        display: block;

        background-color: #eee;

      }


    .big::-webkit-scrollbar{

      display: none;

    }


    .mask{

      width: 50px;

      height: 50px;

      background: rgba(255,255,0,0.4);

      position: absolute;

      top: 0;

      left: 0;

      /*鼠标的样式*/

      cursor: crosshair;

      display: none;

    }


    .big img{

      position: absolute;

      height: 3600px; /*box.height*big.width/mask.width */

      top: 0;

      left: 0;

    }


    .aim{

      position: absolute;

      top: 50%;

      left: 50%;

      width: 20px;

      margin-left: -10px;

      height: 20px;

      margin-top: -10px;

      display: block;

      /*z-index: 8*/

    }

    

    .aim__ver{

      position: absolute;

      top: 50%;

      left: 50%;

      width: 2px;

      height: 40px;

      margin-top: -20px;

      margin-left: -1px;

      background-color: #f00;

    }


    .aim__hor{

      position: absolute;

      top: 50%;

      left: 50%;

      width: 40px;

      height: 2px;

      margin-top: -1px;

      margin-left: -20px;

      background-color: #f00;

      }

    </style>

  <body>

    <div class="box" id="fdj">

      <div id="sketchPad" class="small">

        <img id='imageID' name='imageID' src=" " alt="">

        <div class="mask"></div>

      </div>


      <div class="big">

          <img  id='imageIDBig' name='imageID' src=" "/>

          <div class="aim">

            <div class="aim__ver"></div>

            <div class="aim__hor"></div>

          </div>

      </div>

    </div>

    <div id="selectImage">

      <form name="form" id="form" method="post" enctype="multipart/form-data" style="display: block;padding:2px;overflow: hidden;" >

      <input type="file" name="upload" id="upload" style="display: none;"

      onchange="document.form.path.value=this.value;selectImage(this)" 

      multiple="multiple" accept=".PNG,.JPG,.GIF,.BMP" />

      <input name="path" id="path" readonly style="display: block;float:left;margin-left:120px;height:24px">

      <input type="button" value="请点击上传需要进行测量的图片" onclick="document.form.upload.click();"  style="display: block;float:left;margin-left:10px;height:30px">

      </form>

    </div>

    

    <button id="myBtn">创建连线</button>

  </body>

  <script>

  document.getElementById("myBtn").onclick = function(event) {

    document.getElementById("sketchPad").style.cursor="crosshair";

    document.getElementById("sketchPad").addEventListener("click", createLine, false);

    event.stopPropagation();

    // 阻止冒泡 

    

  };


  // 1. 获取外面的父级盒子

  var fdj = document.getElementById("fdj");


  // 2.获取小的图片

  var small = fdj.children[0];

  var smallImage = small.children[0];

  // 3.获取容纳大图片的盒子

  var big = fdj.children[1];

  // 4.获取遮罩

  var mask = small.children[1];

  // 5.获取大的那张图片

  var bigImage = big.children[0];

  

  // 6.鼠标经过小的图片的时候显示

  small.onmouseover = function(){

    mask.style.display = "block";

    big.style.display = "block";

  }

  // 7. 鼠标离开时隐藏

  small.onmouseout = function(){

    mask.style.display = "none";

    big.style.display = "none";

  }


  console.log("fdj_marginLeft",document.defaultView.getComputedStyle(fdj, null).marginLeft);

  var fdj_marginLeft=document.defaultView.getComputedStyle(fdj, null).marginLeft.slice(0,-2);

  var fdj_marginTop =document.defaultView.getComputedStyle(fdj, null).marginTop.slice(0,-2);


  function createLine() {

    var sketchPad=document.getElementById("sketchPad");

    var sketchPad_top=document.defaultView.getComputedStyle(sketchPad, null).top.slice(0,-2);

    var sketchPad_left=document.defaultView.getComputedStyle(sketchPad, null).left.slice(0,-2);

    // console.log("sketchPad_scrollLeft",sketchPad.scrollLeft);

    let radius=2;//半径


    let pointHtmlStr = `<div style="position:absolute;border-radius: 50%;background: red;width:${radius*2}px;height:${radius*2}px;top:${event.pageY-radius-sketchPad_top+sketchPad.scrollTop-fdj_marginTop}px;left:${event.pageX-radius-sketchPad_left+sketchPad.scrollLeft-fdj_marginLeft}px;"></div>`;

    sketchPad.innerHTML = sketchPad.innerHTML + pointHtmlStr;


    let firstPoint = {};

    firstPoint.xPoint = event.pageX-sketchPad_left+sketchPad.scrollLeft-fdj_marginLeft;

    firstPoint.yPoint = event.pageY-sketchPad_top+sketchPad.scrollTop-fdj_marginTop;

    // console.log("firstPoint1:"+firstPoint.xPoint);


    function createPoints(event) {

      var sketchPad=document.getElementById("sketchPad");

      let secondPoint = {};

      secondPoint.xPoint = event.pageX-sketchPad_left+sketchPad.scrollLeft-fdj_marginLeft;

      secondPoint.yPoint = event.pageY-sketchPad_top+sketchPad.scrollTop-fdj_marginTop;

      let lineLength = calcLine(firstPoint, secondPoint);

      let angle = getAngle(

        firstPoint.xPoint,

        firstPoint.yPoint,

        secondPoint.xPoint,

        secondPoint.yPoint

      );

      // 设置一个div 宽度为 两点之间的距离,并且以 transform-origin: 0 50% 为圆心旋转,角度已经算出来

      let lineHtmlStr = `<div style="position:absolute;border-top:1px solid red;width:${lineLength}px;top:${firstPoint.yPoint}px;left:${firstPoint.xPoint}px;transform:rotate(${angle}deg);transform-origin: 0 0;"></div>`;


      // let bodyDiv = document.getElementsByTagName("body")[0];

      // // 添加到body 后面

      // bodyDiv.innerHTML = bodyDiv.innerHTML + lineHtmlStr;

      sketchPad.innerHTML = sketchPad.innerHTML + lineHtmlStr;

      // 取消本段的起始点的监听

      document.getElementById("sketchPad").removeEventListener("click", createPoints);

    }


    // 计算连线长度

    function calcLine(firstPoint, secondPoint) {

      // 计算出两个点之间的距离

      let line = Math.sqrt(

        Math.pow(firstPoint.xPoint - secondPoint.xPoint, 2) +

          Math.pow(firstPoint.yPoint - secondPoint.yPoint, 2)

      );

      // console.log("calcLinefirstPoint2.xPoint:"+firstPoint.xPoint);

      // console.log("calcLinesecondPoint2.xPoint:"+secondPoint.xPoint);

      // console.log("calcLinefirstPoint2.yPoint:"+firstPoint.yPoint);

      // console.log("calcLinesecondPoint2.yPoint:"+secondPoint.yPoint);

      console.log("line:",line);

      return line;

    }

    // 计算角度

    // 获得人物中心和鼠标坐标连线,与x轴正半轴之间的夹角

    function getAngle(x1, y1, x2, y2) {

      // 获得人物中心和鼠标坐标连线,与x轴正半轴之间的夹角

      var x = x1 - x2;

      var y = y1 - y2;

      var z = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));

      var cos = y / z;

      var radina = Math.acos(cos); // 用反三角函数求弧度

      var angle = 180 / (Math.PI / radina); // 将弧度转换成角度

      if (x2 > x1 && y2 === y1) {

        // 在x轴正方向上

        angle = 0;

      }

      if (x2 > x1 && y2 < y1) {

        // 在第一象限;

        angle = angle - 90;

      }

      if (x2 === x1 && y1 > y2) {

        // 在y轴正方向上

        angle = -90;

      }

      if (x2 < x1 && y2 < y1) {

        // 在第二象限

        angle = 270 - angle;

      }

      if (x2 < x1 && y2 === y1) {

        // 在x轴负方向

        angle = 180;

      }

      if (x2 < x1 && y2 > y1) {

        // 在第三象限

        angle = 270 - angle;

      }

      if (x2 === x1 && y2 > y1) {

        // 在y轴负方向上

        angle = 90;

      }

      if (x2 > x1 && y2 > y1) {

        // 在四象限

        angle = angle - 90;

      }

      return angle;

    }

    // 解决第一次绑定的时候执行方法

      // setTimeout(function() {

    // document.removeEventListener("click", createPoints);

    // 添加节点

    document.getElementById("sketchPad").addEventListener("click", createPoints, false);  // 在冒泡过程中处理函数

      // }, 0);

  }

    //加载任意图片

  function selectImage(file) {

    if (!file.files || !file.files[0]) {

        return;

    }

    var reader = new FileReader();

    reader.onload = function (evt) {

        document.getElementById('imageID').src = evt.target.result;

        document.getElementById('imageIDBig').src = evt.target.result;

        image = evt.target.result;

    }

    reader.readAsDataURL(file.files[0]);

  }


  // 8 鼠标移动

  // var x = 0;

  // var y = 0;


  small.onmousemove = function(event){

    // console.log("mask_display = ", mask.style.display);

    // console.log("mask_display = ", document.defaultView.getComputedStyle(mask, null).width);

    

    var event = event || window.event;

    // 9.获取在盒子内部的坐标    本身定位了,这里换用父亲边框到body边框的距离  显示在遮罩的中间

    var x = event.clientX - this.offsetParent.offsetLeft - mask.offsetWidth/2+ small.scrollLeft ;

    var y = event.clientY - this.offsetParent.offsetTop - mask.offsetHeight/2+small.scrollTop;


    console.log("x = ",x);

    console.log("y = ",y);

    // console.log("mask_width=",mask.style)

    // 10.增加限制条件

    if(x < 0){

      // x = 0;

    }else if(x > small.offsetWidth - mask.offsetWidth){

      // x = small.offsetWidth - mask.offsetWidth;

    }

    if(y < 0){

      // y = 0;

    }else if(y > small.offsetHeight - mask.offsetHeight){

      // y = small.offsetHeight-mask.offsetHeight;

    }


    mask.style.left = x+ "px";

    mask.style.top = y + "px";

    console.log("mask.style.left = ",mask.style.left);

    console.log("mask.style.top = ",mask.style.top);

    console.log(document.getElementsByClassName("mask")[0]);

    // 11.利用倍数关系显示大图片 开始没有看懂为什么大图片要定位,后来想想只有定位的盒子才有top/left值


    var mask_height=window.getComputedStyle(mask).getPropertyValue('height');

    var mask_width=window.getComputedStyle(mask).getPropertyValue('width');

    var big_height=window.getComputedStyle(big).getPropertyValue('height');

    var big_width=window.getComputedStyle(big).getPropertyValue('width');


    bigImage.style.left = -x*big_width.slice(0,-2)/mask_width.slice(0,-2) +"px";

    bigImage.style.top = -y*big_height.slice(0,-2)/mask_height.slice(0,-2) + "px";

  }


  // console.log("x=",x);

  // console.log("y=",y);

  </script>

</html>




这是一个自己的小练习,目的就是标记测量图片中相关标的尺寸。鼠标移动时还带有一个放大镜效果。

出现的问题是:点击左下角【创建连线】按钮并点击图中某位置,选中第一个标记点后,通过354-355行(倒数10行左右

console.log("mask.style.left = ",mask.style.left);

    console.log("mask.style.top = ",mask.style.top);

)中代码设置,在控制台明明看到x和y都在随着鼠标移动不断更新,但是偏偏无法对黄色mask框的left和top正确赋值。想得脑瓜疼,希望指教下 element.style.top和element.style.left控制css属性失效的原因

http://img1.sycdn.imooc.com/climg/5e5f83d409182a0a06130467.jpg

幕布斯3322991
浏览 931回答 1
1回答

邢大爷的微笑

麻烦用代码模式 复制 粘贴,这样看的比较清晰
打开App,查看更多内容
随时随地看视频慕课网APP