2015-01-25 1 views
1

나는 html 캔버스가 있습니다. 각각의 내부에는 집계 상자가 있으며 집계 상자의 수는 모든 후보자의 투표 수에 따라 생성됩니다. 집계표가 집계표 아래에 50 일 때 캔버스 안에 완전히 표시되지만 투표 수가 100을 초과하면 다른 집계표가 누락됩니다. 그들은 모두 수평으로 표시됩니다. 지금 원하는 것은 캔버스 안에 모든 집계 상자를 표시하는 것입니다. max-width : "100 %"로 CSS를 추가했는데 문제가 해결 될 것이라고 생각했지만 해결할 수는 없습니다. 그것에 대해 무엇을해야합니까? 어떤 제안이라도 대단히 감사 할 것입니다. 미리 감사드립니다.html 캔버스의 내용은 반응 적이어야합니다.

이것은 아래 코드입니다. 쇼 젬에게 감사드립니다.

var tb = angular.module("tb", []); 
 
tb.controller("tallyboxController", function($scope) { 
 
    'use strict'; 
 

 
    $scope.label = { 
 
    table: { 
 
     cName: "Candidate's Name", 
 
     cVote: 'Vote', 
 
     cTB: 'Tally Boxes', 
 
     cNV: 'No of votes', 
 
     period: '.' 
 
    }, 
 
    }; 
 

 
    $scope.presidents = [{ 
 
    no: '1', 
 
    name: 'Jeoanna Lingh', 
 
    votes: 1223, 
 
    },{ 
 
    no: '2', 
 
    name: 'Jewel Miller', 
 
    votes: 1234, 
 
    },{ 
 
    no: '3', 
 
    name: 'Shin Lee', 
 
    votes: 1001, 
 
    }]; 
 

 
    $scope.candidates = [ 
 
    $scope.presidents, 
 
    $scope.vicepresidents 
 
    ]; 
 

 
}); 
 

 

 
var tb = angular.module('tb'); 
 

 
tb.directive('drawing', function() { 
 
    return { 
 
    restrict: 'A', 
 
    scope: { 
 
     candidate: '=' 
 
    }, 
 
    link: function(scope, element, attrs) { 
 

 
     var colors = ['Red', 'Green', 'Blue', 'Yellow','black']; 
 

 
     scope.$watch("candidate.votes", function(newValue, oldValue) { 
 
      console.log('rendering', newValue); 
 
      render(); 
 
     }); 
 

 
     function render() { 
 
      var votes = scope.candidate.votes; 
 
      var ctx = element[0].getContext('2d'); 
 
      var remainder = 0; 
 
      var oneBox = 0; 
 
      
 
      // clear canvas (needed for subtracting votes) 
 
      // and is a good practice anyway 
 
      element[0].width = element[0].width; 
 

 
      if (votes > 4) { 
 
      if (remainder = votes % 5) { 
 
       oneBox = (votes - remainder)/5; 
 
      } 
 
      else { 
 
       oneBox = votes/5; 
 
      } 
 
      } else { 
 
      remainder = votes; 
 
      } 
 
      
 
      drawOneBox();   
 

 
      function drawOneBox() { 
 
      ; 
 
      for (var i = 0; i < oneBox; i++) { 
 
       
 
       var color = colors[Math.floor(i/5)]; 
 

 
       ctx.beginPath(); 
 
       ctx.moveTo(5 + i * 25, 5); 
 
       ctx.lineTo(25 + i * 25, 5); 
 

 
       ctx.moveTo(5 + i * 25, 5); 
 
       ctx.lineTo(5 + i * 25, 25); 
 

 
       ctx.moveTo(25 + i * 25, 5); 
 
       ctx.lineTo(25 + i * 25, 25); 
 

 
       ctx.moveTo(5 + i * 25, 5); 
 
       ctx.lineTo(25 + i * 25, 25); 
 

 
       ctx.moveTo(25 + i * 25, 25); 
 
       ctx.lineTo(5 + i * 25, 25); 
 
       ctx.strokeStyle = color; 
 
       ctx.stroke(); 
 
      } 
 
      
 
      // recheck the color 
 
      color = colors[Math.floor(oneBox/5)]; 
 

 
      if (remainder == 1) { 
 
       ctx.beginPath(); 
 
       ctx.moveTo(5 + i * 25, 5); 
 
       ctx.lineTo(5 + i * 25, 25); 
 
       ctx.strokeStyle = color; 
 
       ctx.stroke(); 
 
      } 
 

 
      if (remainder == 2) { 
 
       ctx.beginPath(); 
 
       ctx.moveTo(5 + i * 25, 5); 
 
       ctx.lineTo(25 + i * 25, 5); 
 

 
       ctx.moveTo(5 + i * 25, 5); 
 
       ctx.lineTo(5 + i * 25, 25); 
 
       ctx.strokeStyle = color; 
 
       ctx.stroke(); 
 
      } 
 

 
      if (remainder == 3) { 
 
       ctx.beginPath(); 
 
       ctx.moveTo(5 + i * 25, 5); 
 
       ctx.lineTo(25 + i * 25, 5); 
 

 
       ctx.moveTo(5 + i * 25, 5); 
 
       ctx.lineTo(5 + i * 25, 25); 
 

 
       ctx.moveTo(25 + i * 25, 5); 
 
       ctx.lineTo(25 + i * 25, 25); 
 

 
       ctx.strokeStyle = color; 
 
       ctx.stroke(); 
 
      } 
 

 
      if (remainder == 4) { 
 
       ctx.beginPath(); 
 
       ctx.moveTo(5 + i * 25, 5); 
 
       ctx.lineTo(25 + i * 25, 5); 
 

 
       ctx.moveTo(5 + i * 25, 5); 
 
       ctx.lineTo(5 + i * 25, 25); 
 

 
       ctx.moveTo(25 + i * 25, 5); 
 
       ctx.lineTo(25 + i * 25, 25); 
 

 
       ctx.moveTo(25 + i * 25, 25); 
 
       ctx.lineTo(5 + i * 25, 25); 
 

 
       ctx.strokeStyle = color; 
 
       ctx.stroke(); 
 
      } 
 
      }; 
 
     } 
 
     render(); 
 
     } // end 
 
    }; 
 
});
canvas { 
 
    max-width: 100%; 
 
    height: auto; 
 
    border: 2px solid black; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<!DOCTYPE html> 
 
<html data-ng-app="tb"> 
 

 
<head lang="en"> 
 
    <meta charset="utf-8"> 
 
    <title>Tally Boxes</title> 
 
</head> 
 

 
<body data-ng-controller="tallyboxController" data-ng-init="init()"> 
 
    <div id="container"> 
 
    </div> 
 
    <div class="container-table"> 
 
    <table border="1" width="100%"> 
 
     <thead> 
 
     <tr> 
 
      <td>{{label.table.cName}}</td> 
 
      <td>{{label.table.cTB}}</td> 
 
      <td>{{label.table.cNV}}</td> 
 
     </tr> 
 
     </thead> 
 
     <tbody> 
 
     <tr ng-repeat="(key,value) in candidates[0]"> 
 
      <td>{{value.no}} {{label.table.period}} {{value.name}}</td> 
 
      <td> 
 
      <canvas width="1000" height="30" id="{{value.no}}" candidate="value" drawing></canvas> 
 
      </td> 
 
      <td>{{value.votes}}</td> 
 
     </tr> 
 
     </tbody 
 
    </table> 
 
    </div> 
 

 
</body> 
 

 
</html>

+1

당신이 클래스와'canvas' 설정됩니다. – dippas

+0

뭐라구 디파스가 무슨 뜻이야? 분명히 해줘. :-) – QWERTY

+0

은 CSS에'.canvas'가 있지만'canvas'는 HTML 태그가 아니기 때문에 클래스가 아니라'canvas'가 있어야합니다. – dippas

답변

1

는 응답에 올 때 캔버스가 상당히 문제가 될 수 있습니다. 물론 CSS를 사용하여 크기를 조절할 수 있습니다 (CSS 크기가 캔버스 크기와 다르다는 점을 기억하십시오. 다른 점은 캔버스가 늘어남을 의미합니다).

그래서 직접 반응하는 기술을 구현해야합니다. 사용 가능한 캔버스 크기를 가져 와서 상자를 적절히 다시 그리는 것에 대해 생각해보십시오. 이것은 창 크기 조정 콜백으로 갈 수 있으므로 윈도우 크기 조정에서도 작동합니다.

모든 것을 처리하고 싶지 않은 경우 일반 이미지 (각 색상마다 5 개)를 사용하고 표준 HTML/CSS 응답 방식을 사용하여 다시 전환 할 수 있습니다. 그렇지 않은 경우 모든 크기 조정시 캔버스 크기를 다시 계산하고 (처음로드 할 때 더하기) 집계 상자를 그에 따라 배치해야합니다.

감사합니다. btw. :)


UPDATE

난 당신이 한편의 CSS 스케일링을 구현하지만, 마음 상자 엄청나게 작은 얻을 수 곰 관리 볼 때 투표의 수가 증가; 당신은 아마 여러 행을 사용하고자합니다.


업데이트 2

이 무슨 의미가 있습니다 - 캔버스에이 응답 버전은 당신을 위해 작동되는지 확인합니다. 아직 약간의 조정이 필요하지만 당신은 아이디어를 얻을 : 그것은 HTML 태그 인 경우

var tb = angular.module("tb", []); 
 
tb.controller("tallyboxController", function($scope) { 
 
    'use strict'; 
 

 
    $scope.label = { 
 
    table: { 
 
     cName: "Candidate's Name", 
 
     cVote: 'Vote', 
 
     cTB: 'Tally Boxes', 
 
     cNV: 'No of votes', 
 
     period: '.' 
 
    }, 
 
    }; 
 

 
    $scope.presidents = [{ 
 
    no: '1', 
 
    name: 'Jeoanna Lingh', 
 
    votes: 1223, 
 
    }, { 
 
    no: '2', 
 
    name: 'Jewel Miller', 
 
    votes: 1234, 
 
    }, { 
 
    no: '3', 
 
    name: 'Shin Lee', 
 
    votes: 1001, 
 
    }]; 
 

 
    $scope.candidates = [ 
 
    $scope.presidents, 
 
    $scope.vicepresidents 
 
    ]; 
 

 
}); 
 

 

 
var tb = angular.module('tb'); 
 

 
tb.directive('drawing', function() { 
 
    return { 
 
    restrict: 'A', 
 
    scope: { 
 
     candidate: '=' 
 
    }, 
 
    link: function(scope, element, attrs) { 
 

 
     var colors = ['Red', 'Green', 'Blue', 'Yellow', 'black']; 
 

 
     scope.$watch("candidate.votes", function(newValue, oldValue) { 
 
      console.log('rendering', newValue); 
 
      render(); 
 
     }); 
 

 
     function render() { 
 
      var votes = scope.candidate.votes; 
 
      var ctx = element[0].getContext('2d'); 
 
      var remainder = 0; 
 
      var oneBox = 0; 
 

 
      // clear canvas (needed for subtracting votes) 
 
      // and is a good practice anyway 
 
      element[0].width = element[0].width; 
 

 
      if (votes > 4) { 
 
      if (remainder = votes % 5) { 
 
       oneBox = (votes - remainder)/5; 
 
      } else { 
 
       oneBox = votes/5; 
 
      } 
 
      } else { 
 
      remainder = votes; 
 
      } 
 

 
      window.addEventListener('resize', handleResize); 
 
      setTimeout(handleResize, 100); 
 

 
      function handleResize() { 
 
      var c = element[0]; 
 
      var width = c.parentNode.offsetWidth; 
 
      var perRow = Math.floor((width - 10)/25); 
 
      c.width = width; 
 
      c.height = Math.ceil(oneBox/perRow) * 25 + 5; 
 
      console.log(perRow, width, oneBox); 
 
      drawOneBox(perRow); 
 

 
      } 
 

 
      function drawOneBox(perRow) { 
 
      for (var r = 0; r < oneBox/perRow; r++) { 
 
       var remainingInRow = (oneBox - r * perRow); 
 
       if (remainingInRow > perRow) remainingInRow = perRow; 
 
       for (var i = 0; i < remainingInRow; i++) { 
 

 
       var rowOffset = r * 25; 
 

 
       var color = colors[Math.floor(i/5)]; 
 

 
       ctx.beginPath(); 
 
       ctx.moveTo(5 + i * 25, 5 + rowOffset); 
 
       ctx.lineTo(25 + i * 25, 5 + rowOffset); 
 

 
       ctx.moveTo(5 + i * 25, 5 + rowOffset); 
 
       ctx.lineTo(5 + i * 25, 25 + rowOffset); 
 

 
       ctx.moveTo(25 + i * 25, 5 + rowOffset); 
 
       ctx.lineTo(25 + i * 25, 25 + rowOffset); 
 

 
       ctx.moveTo(5 + i * 25, 5 + rowOffset); 
 
       ctx.lineTo(25 + i * 25, 25 + rowOffset); 
 

 
       ctx.moveTo(25 + i * 25, 25 + rowOffset); 
 
       ctx.lineTo(5 + i * 25, 25 + rowOffset); 
 
       ctx.strokeStyle = color; 
 
       ctx.stroke(); 
 
       } 
 
      } 
 

 
      // recheck the color 
 
      color = colors[Math.floor(oneBox/5)]; 
 

 
      if (remainder == 1) { 
 
       ctx.beginPath(); 
 
       ctx.moveTo(5 + i * 25, 5 + rowOffset); 
 
       ctx.lineTo(5 + i * 25, 25 + rowOffset); 
 
       ctx.strokeStyle = color; 
 
       ctx.stroke(); 
 
      } 
 

 
      if (remainder == 2) { 
 
       ctx.beginPath(); 
 
       ctx.moveTo(5 + i * 25, 5 + rowOffset); 
 
       ctx.lineTo(25 + i * 25, 5 + rowOffset); 
 

 
       ctx.moveTo(5 + i * 25, 5 + rowOffset); 
 
       ctx.lineTo(5 + i * 25, 25 + rowOffset); 
 
       ctx.strokeStyle = color; 
 
       ctx.stroke(); 
 
      } 
 

 
      if (remainder == 3) { 
 
       ctx.beginPath(); 
 
       ctx.moveTo(5 + i * 25, 5 + rowOffset); 
 
       ctx.lineTo(25 + i * 25, 5 + rowOffset); 
 

 
       ctx.moveTo(5 + i * 25, 5 + rowOffset); 
 
       ctx.lineTo(5 + i * 25, 25 + rowOffset); 
 

 
       ctx.moveTo(25 + i * 25, 5 + rowOffset); 
 
       ctx.lineTo(25 + i * 25, 25 + rowOffset); 
 

 
       ctx.strokeStyle = color; 
 
       ctx.stroke(); 
 
      } 
 

 
      if (remainder == 4) { 
 
       ctx.beginPath(); 
 
       ctx.moveTo(5 + i * 25, 5 + rowOffset); 
 
       ctx.lineTo(25 + i * 25, 5 + rowOffset); 
 

 
       ctx.moveTo(5 + i * 25, 5 + rowOffset); 
 
       ctx.lineTo(5 + i * 25, 25 + rowOffset); 
 

 
       ctx.moveTo(25 + i * 25, 5 + rowOffset); 
 
       ctx.lineTo(25 + i * 25, 25 + rowOffset); 
 

 
       ctx.moveTo(25 + i * 25, 25 + rowOffset); 
 
       ctx.lineTo(5 + i * 25, 25 + rowOffset); 
 

 
       ctx.strokeStyle = color; 
 
       ctx.stroke(); 
 
      } 
 

 
      }; 
 
     } 
 
     render(); 
 
     } // end 
 
    }; 
 
});
canvas { 
 
    max-width: 100%; 
 
    height: auto; 
 
    border: 2px solid black; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<!DOCTYPE html> 
 
<html data-ng-app="tb"> 
 

 
<head lang="en"> 
 
    <meta charset="utf-8"> 
 
    <title>Tally Boxes</title> 
 
</head> 
 

 
<body data-ng-controller="tallyboxController" data-ng-init="init()"> 
 
    <div id="container"> 
 
    </div> 
 
    <div class="container-table"> 
 
    <table border="1" width="100%"> 
 
     <thead> 
 
     <tr> 
 
      <td>{{label.table.cName}}</td> 
 
      <td>{{label.table.cTB}}</td> 
 
      <td>{{label.table.cNV}}</td> 
 
     </tr> 
 
     </thead> 
 
     <tbody> 
 
     <tr ng-repeat="(key,value) in candidates[0]"> 
 
      <td>{{value.no}} {{label.table.period}} {{value.name}}</td> 
 
      <td> 
 
      <canvas width="1000" height="30" id="{{value.no}}" candidate="value" drawing></canvas> 
 
      </td> 
 
      <td>{{value.votes}}</td> 
 
     </tr> 
 
     </tbody> 
 
    </table> 
 
    </div> 
 

 
</body> 
 

 
</html>

+1

나는 말문이 막혔다. :-). 그것이 바로 지금 당장 필요한 것입니다. 다시 한번 고마워. :-) 나는 지금 당신의 코드를 연구하고 그것을 익숙하게하고있다. 이 변수를 "var rowOffset = r * 25;" . 왜 r은 25에 배가됩니까? 너 나 한테 더 설명해 줄 수 있니? :-) 고마워. – QWERTY

+1

. 천만에. :) 25 상자의 높이 (5의 상단 여백을 더한 것)가 맞았습니까? 그래서 기본적으로, 이것은 각각의 새로운 행을 25 픽셀 씩 내립니다. – Shomz

관련 문제