【问题标题】:How do i get itext styles in fabric.js ver. 2?我如何在 fabric.js 版本中获取 itext 样式。 2?
【发布时间】:2021-07-21 17:28:39
【问题描述】:

在之前的fabric.js 版本中,我以getStyle 函数中使用的方式使用getSelectionStyles,并取得了巨大成功。

在这种情况下:当我选择一些文本时,fontsize-slider 将更改为第一个选定字符的当前值。

但是升级到版本 2+ 后,它不再工作了。 getStyle 函数返回 undefined

canvas.on('text:selection:changed', onSelectionChanged);

function onSelectionChanged() {
  var obj = canvas.getActiveObject();
  if (obj.selectionStart>-1) {
    $('#fontSize').val(getStyle(obj,'fontSize'));
  }
}

function getStyle(object, styleName) {
  return (object.getSelectionStyles && object.isEditing)
    ? object.getSelectionStyles()[styleName] : object[styleName];
}

这是一个使用 fabric.js 版本 1.7.22 的工作示例。如果您将其更改为当前版本,它将失败。 如何在版本 2 中使用 getSelectionStyles?发生了什么变化?

var canvas = new fabric.Canvas('c');
canvas.add(new fabric.IText('Fontsize test'))
canvas.on('text:selection:changed', onSelectionChanged);

$( "#fontSize" ).on("input", function() {
    var obj = canvas.getActiveObject();
    if (obj) {
    setStyle(obj, 'fontSize', $( "#fontSize" ).val());
        canvas.renderAll();
    }
});
    
function setStyle(object, styleName, value) {
    if (object.setSelectionStyles && object.isEditing) {
        var style = { };
        style[styleName] = value;
        object.setSelectionStyles(style);
    }
    else {
        object[styleName] = value;

    }
}

function onSelectionChanged() {
    var obj = canvas.getActiveObject();
    if (obj.selectionStart>-1) {
           $('#fontSize').val(getStyle(obj,'fontSize'));
    }
}

function getStyle(object, styleName) {
    return (object.getSelectionStyles && object.isEditing)
    ? object.getSelectionStyles()[styleName] : object[styleName];
}
canvas{
 border:2px solid #000;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.7.22/fabric.min.js"></script>
<!--<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/2.2.3/fabric.min.js"></script>-->
<canvas id='c' width=400 height=120></canvas>
<label for="fontSize" hint="Font size"><a style="font-size:12px;color:#999">T</a><a style="font-size:19px;color:#ccc">T</a></label>
<input type="range" value="" min="1" max="120" step="1" id="fontSize">

【问题讨论】:

    标签: javascript fabricjs


    【解决方案1】:

    getSelectionStyles 返回当前选择的样式对象数组。

    所以object.getSelectionStyles()[styleName] 永远是undefined

    演示

    var canvas = new fabric.Canvas('c');
    canvas.add(new fabric.IText('Hello'))
    canvas.on('text:selection:changed', onSelectionChanged);
    
    function onSelectionChanged() {
      var obj = canvas.getActiveObject();
      if (obj.selectionStart>-1) {
        console.log(getStyle(obj,'fontSize'));
      }
    }
    
    function getStyle(object, styleName) {
      console.log(object.getSelectionStyles())
      return object[styleName];
    }
    canvas{
     border:2px solid #000;
    }
    <script src="https://rawgit.com/kangax/fabric.js/master/dist/fabric.js"></script>
    <canvas id='c' width=400 height=400></canvas>

    您需要使用getStyleAtPosition(position) 来获取该特定位置的样式。

    var canvas = new fabric.Canvas('c');
    canvas.add(new fabric.IText('Fontsize test'))
    canvas.on('text:selection:changed', onSelectionChanged);
    
    $("#fontSize").on("input", function() {
      var obj = canvas.getActiveObject();
      if (obj) {
        setStyle(obj, 'fontSize', $("#fontSize").val());
        canvas.renderAll();
      }
    });
    
    function setStyle(object, styleName, value) {
      if (object.setSelectionStyles && object.isEditing) {
        var style = {};
        style[styleName] = value;
        object.setSelectionStyles(style);
      } else {
        object[styleName] = value;
    
      }
    }
    
    function onSelectionChanged() {
      var obj = canvas.getActiveObject();
      if (obj.selectionStart > -1) {
         console.log(obj.getSelectionStyles())
        $('#fontSize').val(getStyle(obj, 'fontSize'));
      }
    }
    
    function getStyle(object, styleName) {
      return (object.getStyleAtPosition && object.isEditing) ?
        object.getStyleAtPosition(object.selectionStart)[styleName] : object[styleName];
    }
    canvas{
     border:2px solid #000;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <script src="https://rawgit.com/kangax/fabric.js/master/dist/fabric.js"></script>
    <!--<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/2.2.3/fabric.min.js"></script>-->
    <canvas id='c' width=400 height=120></canvas>
    <label for="fontSize" hint="Font size"><a style="font-size:12px;color:#999">T</a><a style="font-size:19px;color:#ccc">T</a></label>
    <input type="range" value="" min="1" max="120" step="1" id="fontSize">

    【讨论】:

    • 做到了!谢谢:-)
    【解决方案2】:

    console.log('ActiveObject', canvas.getActiveObject().fontFamily)

    【讨论】:

    • 请解释答案
    • 这是我能找到的从 activeObject 访问属性的唯一方法。似乎有效的语法是 canvas.getActiveObject().fontFamily。另一个是 canvas.getActiveObject().fill 字体颜色。
    【解决方案3】:

    在fabricjs v4.5.0中,可以通过getCompleteStyleDeclaration(lineIndex, charIndex)方法获取选中文本的样式声明对象。


    例如:object.getCompleteStyleDeclaration(1, 1)。更多信息在这里:http://fabricjs.com/docs/fabric.IText.html#getCompleteStyleDeclaration

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-09
      • 2018-07-03
      • 2020-03-22
      • 2015-06-05
      • 2013-11-20
      • 2013-03-19
      • 2015-04-21
      相关资源
      最近更新 更多