离子/角度自定义指令和离子列表缩略图

loloof64

我创建了一个自定义指令国际象棋棋盘,以显示国际象棋的位置。借助Ionic框架,我生成了一个棋盘列表,并想在左侧绘制棋盘缩略图。虽然我遵循文档,但是使用svg代替,因为我的指令生成svg,所以无法获得所需的布局。

这是我的JsBin(不用担心丢失图片)。

这是index.html:

<!DOCTYPE html>
<html>
<head>    
<script src="//code.ionicframework.com/1.0.0-beta.13/js/ionic.bundle.min.js"></script>
<link href="//code.ionicframework.com/1.0.0-beta.13/css/ionic.min.css" rel="stylesheet" type="text/css" />
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.3.2/angular.min.js">    </script>
  <meta charset="utf-8">
  <title>JS Bin</title>
</head>
<body ng-app="static-board">

    <ion-pane>
      <ion-header-bar class="bar-dark">
        <h1 class="title">Chess Positions Archiver</h1>
      </ion-header-bar>
      <ion-content>
        <div class="list">
          <a class="item item-thumbnail-left" href="#">
            <chess-board cells-size="30" fen="3rr1k1/pb5p/1qp3pB/1pn1Q3/8/7P/PPP3P1/R3KR2 b - - 0 1" show-coords>    </chess-board>
            <h3>Exercise 1</h3>
          </a>

          <a class="item item-thumbnail-left" href="#">
            <chess-board cells-size="30" show-coords></chess-board>
            <h3>Exercise 2</h3>
          </a>
        </div>

      </ion-content>
    </ion-pane>
  </body>
</html>

这是我的剧本

(function(){
  var chessPieces = {
    'P': 'wp',
    'N': 'wn',
    'B': 'wb',
    'R': 'wr',
    'Q': 'wq',
    'K': 'wk',

    'b': 'bb',
    'p': 'bp',
    'n': 'bn',
    'r': 'br',
    'q': 'bq',
    'k': 'bk'
  };

  angular.module('static-board', ['ionic'])
  .factory('chessPictures', [function(){
    return {
      getPicture: function(pieceFen){
        return chessPieces[pieceFen];
      }
    }
  }])
  .directive('chessBoard', [function(){

    function getBoardHtml(cellsSize, positionFen, showCoords){

      // taken from http://stackoverflow.com/questions/610406/javascript-equivalent-to-printf-string-format
      function sprintf() {
        var args = arguments,
        string = args[0],
        i = 1;
        return string.replace(/%((%)|s|d)/g, function (m) {
          // m is the matched format, e.g. %s, %d
          var val = null;
          if (m[2]) {
            val = m[2];
          } else {
            val = args[i];
            // A switch statement so that the formatter can be extended. Default is %s
            switch (m) {
              case '%d':
                val = parseFloat(val);
                if (isNaN(val)) {
                  val = 0;
                }
                break;
              }
              i++;
            }
            return val;
          });
        }

      function fenToPosition(){
        function getSingleLine(lineFen){
          var result = [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '];
          var column = 0;
          for (var index in lineFen){
            var currElem = lineFen[index];
            var isDigit = !isNaN(parseInt(currElem));
            if (isDigit){
              column += parseInt(currElem);
            }
            else {
              result[column] = currElem;
              column++;
            }
          }
          return result;
        }

        var result = [];
        var parts = positionFen.split(" ")[0].split("/");
        for (var partIndex in parts){
          var currPart = parts[partIndex];
          result.push(getSingleLine(currPart));
        }
        return result;
      }

      function getBackground(size){
        return sprintf("<rect x='0' y='0' width='%d' height='%d' fill='#BAA' />", size, size);
      };

      function getCells(){
        function getSingleCell(cellX, cellY){
          var x = cellX*cellsSize + cellsSize/2;
          var y = cellY*cellsSize + cellsSize/2;
          var color = (cellX+cellY)%2 === 0 ? "#E9E637" : "#7C4116";
          return sprintf("<rect x='%d' y='%d' width='%d', height='%d' fill='%s' />",
            x,y, cellsSize, cellsSize, color);
        }

        var result = "";
        for (var line = 0; line < 8; line++){
          for (var col = 0; col < 8; col++){
            result += getSingleCell(col, line)+'\n';
          }
        }

        return result;
      }

      function getPieces(positionPieces){
        function getSinglePiece(cellX, cellY){
          var x = cellX*cellsSize + cellsSize/2;
          var y = cellY*cellsSize + cellsSize/2;
          var pieceFen = positionPieces[cellY][cellX];
          var piecePictureRef = chessPieces[pieceFen];
          var path = sprintf("../img/chess_pieces/%s.svg", piecePictureRef);
          return piecePictureRef ? sprintf("<image x='%d' y='%d' width='%d' height='%d' xlink:href='%s' />",
            x, y, cellsSize, cellsSize, path
          ) : undefined;
        }

        var result = "";
        for (var rank = 0; rank < 8; rank++){
          for (var file = 0; file < 8; file++){
            var line = getSinglePiece(file, rank);
            if (line) {
              result += line+'\n';
            }
          }
        }

        return result;
      }

      function getPlayerTurn(){
        var turnStr = positionFen.split(" ")[1];
        var color = turnStr === "w" ? "#FFF" : "#000";
        var location = parseInt(8.5*cellsSize);
        var size = cellsSize / 2;
        return sprintf("<rect x='%d' y='%d' width='%d' height='%d' fill='%s'/>",
          location, location, size, size, color);
      }

      function getCoordinates(){
        result = "";

        var files = "ABCDEFGH";
        for (var index in files){
          var currFile = files[index];
          result += sprintf("<text x='%d' y='%d' fill='#000' font-size='%d'>%s</text>",
          parseInt(cellsSize*index + cellsSize*.8), parseInt(cellsSize*.45),
          parseInt(cellsSize*.4), currFile);
          result += sprintf("<text x='%d' y='%d' fill='#000' font-size='%d'>%s</text>",
            parseInt(cellsSize*index + cellsSize*.8), parseInt(cellsSize*8.9),
            parseInt(cellsSize*.4), currFile);
        }

        var ranks = "87654321";
        for (var index in ranks){
          var currRank = ranks[index];
          result += sprintf("<text x='%d' y='%d' fill='#000' font-size='%d'>%s</text>",
            parseInt(cellsSize*.1),     parseInt(cellsSize*1.25+cellsSize*index),
            parseInt(cellsSize*.4), currRank);
            result += sprintf("<text x='%d' y='%d' fill='#000' font-size='%d'>%s</text>",
            parseInt(cellsSize*8.7),     parseInt(cellsSize*1.25+cellsSize*index),
            parseInt(cellsSize*.4), currRank);
        }

        return result;
      }

      var size = 9*cellsSize;
      var result = sprintf("<svg width='%d'     height='%d'>\n%s\n%s\n%s\n%s\n%s\n</svg>",
        size, size, getBackground(size), getCells(),     getPieces(fenToPosition()),
        getPlayerTurn(), showCoords ? getCoordinates() : "");
      return result;
    }

    return {
      restrict: 'E',
      link: {
        post : function(scope, element, attrs){
          var cellsSize = attrs.cellsSize || 20;
          var positionFen = attrs.fen || 'rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w';
          var showCoords = attrs.showCoords !== undefined ? true : false;

          var newElem = angular.element(getBoardHtml(cellsSize, positionFen, showCoords));
          element.replaceWith(newElem);
        }
      }
    }
  }])
})();

那怎么了?

  • 我使用的是<svg>而不是<img>的事实吗?
  • 或者是别的什么 ?
文科·布拉德维卡(Vinko Bradvica)

您将需要做几件事:

将svg包装到div中,并给它分类 item-image

<div class="item-image">
  <chess-board cells-size="30"></chess-board>
</div>

然后,当您创建SVG时,您将需要设置以下属性:

width="100%" height="100%" viewBox="0,0,270,270"

widthhight将告诉它如何在容器内运行,而viewBox属性设置画布的大小,在其上绘制图像。

这条线

var result = sprintf("<svg width='%d' height='%d'>\n%s\n%s\n%s\n%s\n%s\n</svg>", size, size, getBackground(size), getCells(), getPieces(fenToPosition()), getPlayerTurn(), showCoords ? getCoordinates() : "");

应该看起来像这样

var result = sprintf("<svg width='100%%' height='100%%' viewBox='0,0,%d,%d'>\n%s\n%s\n%s\n%s\n%s\n</svg>", size, size, getBackground(size), getCells(), getPieces(fenToPosition()), getPlayerTurn(), showCoords ? getCoordinates() : "");

您可以在这里看到它http://jsbin.com/basimodufa/1/edit?html,js,输出

这里有关于SVG大小的良好资源/包含在此处

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

离子自定义指令被Angular忽略

WordPress以自定义模式获取帖子缩略图

访问模板中的自定义缩略图选项

强制缩略图预览以自定义文件格式

如何创建视频的自定义缩略图封面?

自定义缩略图设计css

自定义搜寻栏(缩略图大小,颜色和背景)

自定义缩略图不适用于Ubuntu 18.10和18.04

WooCommerce-自定义缩略图和默认后备图像占位符

使用Android Volley Library使用缩略图的自定义列表视图将不会加载任何结果

离子 3 指令。在 Div 上添加自定义属性?

显示按分类法分类的自定义帖子类型的摘录,缩略图和标题?

如何自定义离子选择和离子选择菜单(离子)

带有缩略图的自定义Bootstrap轮播无法正常工作

如何正确缩放开关小部件的自定义缩略图?

在Woocommerce购物车中显示特定产品ID的自定义缩略图

在 Unity 中播放视频之前的白框而不是自定义缩略图

自定义帖子类型显示缩略图-WordPress

为某些文件类型生成自定义Finder缩略图

附加视频的自定义缩略图(不提取)-IOS,AVFoundation

将缩略图添加到我的自定义适配器

设置Wordpress摘录并根据自定义字段发布缩略图

如何为以我自己的自定义格式保存的每个文件添加自定义缩略图

没有可用图片时,如何关闭离子缩略图

如何自定义离子中的离子选择弹出高度

EXIF和缩略图

自定义字体离子2

离子自定义颜色-SASS

如何自定义离子标签?