Соответствие Wrapper + Canvas + Div для размера изображения - PullRequest
0 голосов
/ 28 марта 2020

Я использую тепловую карту. js в Google Apps Script и пытаюсь изменить размер холста тепловой карты (где я могу на самом деле наносить точки), чтобы соответствовать изображению. Как я могу изменить javascript или стиль, чтобы сделать эту работу?

КОД: https://jsfiddle.net/nateomardavis/51h2guL9/

  • wrapper имеет черную рамку.
  • Тепловая карта div имеет синюю рамку.
  • canvas имеет красную рамку.

Как это должно работать: Я должен пометить тепловую карту в любом месте на изображении. Оболочка, div карты тепла и холст должны иметь размер в зависимости от размера изображения.

Как это работает в настоящее время: Я могу отметить только карту тепла внутри сине-черной границы. Моя javascript изменяет размер холста, чтобы соответствовать изображению, но не границам тепловой карты.

То, что я пробовал: Вы можете увидеть в скрипте, как я пытался изменить то, что javascript изменяет размер (строки 88-90). Я также подумал об использовании использование изображения в качестве background-image для heatmap div, но размер был неправильный, и я хотел иметь возможность сохранить тепловую карту и изображение как один слой (для печати / сохранения). Я также попытался изменить размер изображения (строка 101), но все, что выше 55%, обрезало изображение.

Скриншот ниже приведен только для справки, но полный рабочий код находится на скрипке. У меня все это под HTML, потому что так работает в скрипте Google Apps.

enter image description here

 <!DOCTYPE html>
    <html>
  <head>
    <base target="_top">
    <script type="text/javascript" src="https://www.patrick-wied.at/static/heatmapjs/assets/js/heatmap.min.js"></script>
   <style>

   html, body {
     width:  100%;
     height: 100%;
  }

  html { 
    color: #333;
    font-family: sans-serif;
    font-size: 16pt;
    font-weight: 100;
    line-height: 1.5em;
  }

  .wrapper { 
    width: 100%; 
    height:100%; 
    background:rgba(0,0,0,.03); 
    border:3px solid black; 
  }

  .heatmap { 
    width:100%; 
    height:100%;
    background-position: top;
    background-repeat: no-repeat;
    background-size: contain;
    position: relative;
    border:3px solid blue; 
 }

 .canvas {
   border:3px solid red; 
 }

  </style>

  </head>

 <body>
   <button class="clear">Clear</button>
   <button onclick="printPage()" class="print-btn no-print" style="">Print</button>
   <p id="coords"></p>
    <div id="wrapper" class="wrapper"> <!-- black box on web app-->
      <div id="heatmap" class = "heatmap" style="position: relative;"> <!-- blue box on web app-->
      <canvas id="canvas" class="canvas"></canvas> <!-- red box on web app-->
    </div> 
  </div>


<script>



//CREATE HEATMAP
  window.onload = function() {
    var heatmapInstance = h337.create({
      container: document.querySelector('.heatmap'),
      gradient: {
        '.25': 'black',
        '.5': 'red',
        '.75': 'white'
      },
      radius: 20
    });

    document.querySelector('.wrapper').onclick = function(ev) {
      heatmapInstance.addData({
        x: ev.layerX,
        y: ev.layerY,
        value: 1
      });
    };

     document.querySelector('.clear').onclick = function() {
       //heatmapInstance._renderer._clear();
       heatmapInstance.setData({data:[]}); 
      };

//RESIVE CANVAS TO FIT IMAGE
  //http://jsfiddle.net/6ZsCz/1135/
  var canvas = document.getElementById('canvas');  //v1
  //var canvas = document.getElementById('heatmap'); //v2
  //var canvas = document.getElementById('wrapper');  //v3
    var ctx = canvas.getContext('2d');
      ctx.canvas.width  = window.innerWidth;
      ctx.canvas.height = window.innerHeight; 
    var imageObj = new Image();


  imageObj.onload = function() {
    canvas.width = imageObj.width; // version 2
    canvas.height = imageObj.height;  // version 2  
    ctx.drawImage(imageObj,0,0); // version 2
    //ctx.drawImage(imageObj, 0, 0, imageObj.width * 0.5, imageObj.height * 0.5); //version 1

  };
  imageObj.src = 'https://upload.wikimedia.org/wikipedia/commons/thumb/8/82/Soccer_Field_Transparant.svg/1200px-Soccer_Field_Transparant.svg.png';

 };


//MOUSE COORDINATES
//works inside heatmap
  function getCursorPosition(canvas, event) {
    const rect = canvas.getBoundingClientRect()
    const x = event.clientX - rect.left
    const y = event.clientY - rect.top
    var coor = "X coords: " + x + ", Y coords: " + y;
    document.getElementById("coords").innerHTML = coor;
  }

  const canvas = document.querySelector('.heatmap')
  canvas.addEventListener('mousedown', function(e) {
    getCursorPosition(canvas, e)
  })


  function printPage() {
    window.print();
  }

     </script>

  </body>

</html>

1 Ответ

0 голосов
/ 02 апреля 2020

После долгих попыток я смог разобраться: https://jsfiddle.net/nateomardavis/p1kwrhmv

  1. Я использовал img и дал ему background-image с CSS .
  2. Затем я устанавливаю слой тепловой карты на relative, а слой изображения на absolute, используя решение ЗДЕСЬ .
  3. Наконец, я затем устанавливаю слой изображения css с использованием метода, изложенного ЗДЕСЬ .

    .heatmap {
      background-size: contain;
      background-repeat: no-repeat;
      width: 100%;
      height: 300%; /*if the image is bigger than screen, this is needed */
      position: relative;
    }
    
    .backgroundIMG {
      background-image: url('https://upload.wikimedia.org/wikipedia/commons/thumb/8/82/Soccer_Field_Transparant.svg/1200px-Soccer_Field_Transparant.svg.png');
      background-size: contain;
      background-repeat: no-repeat;
      position: absolute;
      width: 100%;
      height: 0;
      padding-top: 151.33%;
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...