【问题标题】:Opacity Slider for Objects对象的不透明度滑块
【发布时间】:2018-12-17 10:47:31
【问题描述】:

我正在尝试合并一个不透明度滑块,以便将任何选定的对象设置为根据滑块的位置进行更改(100 完全可见)。我正在使用 Fabric.js 版本 1.7.22 和 jQuery 3.3.1。

我最初提出这个问题并得到了一个可行的解决方案(谢谢@Durga),但我意识到我使用了错误的 Fabric.js 版本。我查看了文档但被卡住了。我在这里做错了什么?

我有什么: http://jsfiddle.net/code4ever/srm25f9d/

var canvas = new fabric.Canvas("c");
canvas.isDrawingMode = true;

// select, draw
$("#select").click(function() {
  canvas.isDrawingMode = false;
});
$("#draw").click(function() {
  canvas.isDrawingMode = true;
});
var activeObject = null;
canvas.on('selection:created', function(options) {
  activeObject = options.target;
  $("#alpha").slider("option", "value", activeObject.opacity);
});
canvas.on('selection:updated', function(options) {
  activeObject = options.target;
  $("#alpha").slider("option", "value", activeObject.opacity);
});
canvas.on('selection:cleared', function(options) {
  activeObject = null;
});
$("#alpha").slider({
  max: 1,
  min: 0,
  step: 0.1,
  value: 1,
  slide: function(event, ui) {
    activeObject && (activeObject.opacity = ui.value)
    canvas.requestRenderAll();
  },
  stop: function(event, ui) {
    canvas.requestRenderAll();
  }
});
canvas {
  border: solid 1px #000;
}

fieldset {
  max-width: 350px;
}
<link href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.css" rel="stylesheet"/>
<script src="https://code.jquery.com/jquery-3.3.1.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.7.22/fabric.min.js"></script>
<canvas id="c" width="400" height="400"></canvas>
<br>
<button id="draw">Draw</button>
<button id="select">Select</button>
<br>
<br>
<fieldset>
  <legend>Controls</legend>
  <label for="alpha">Opactity</label>
  <div id="alpha" name="alpha"></div>
</fieldset>

提前致谢!

【问题讨论】:

  • 如果你将fabricjs升级到v2有什么问题吗?
  • 嗨,Durga,是的,它没有按预期运行

标签: javascript fabricjs


【解决方案1】:

假设您当时需要更新一个对象,那么您可以使用 FabriJs 函数 getActiveObject() 来更新不透明度:

var canvas = new fabric.Canvas("c");
canvas.isDrawingMode = true;

// select, draw
$("#select").click(function() {
  canvas.isDrawingMode = false;
});
$("#draw").click(function() {
  canvas.isDrawingMode = true;
});

$("#alpha").slider({
  max: 1,
  min: 0,
  step: 0.1,
  value: 1,
  slide: function(event, ui) {
    if (canvas.getActiveObject()){
        canvas.getActiveObject().setOpacity(ui.value);
        canvas.renderAll();
    }
  },
  stop: function(event, ui) {
    canvas.renderAll();
  }
});

如果您需要使用多个对象,则需要分别循环并更改每个对象的不透明度。

【讨论】:

    【解决方案2】:

    使用object:selected 事件获取选定对象并在selection:cleared 移除活动对象。

    适用于 v2 check

    var canvas = new fabric.Canvas("c");
    canvas.isDrawingMode = true;
    
    // select, draw
    $("#select").click(function() {
      canvas.isDrawingMode = false;
    });
    $("#draw").click(function() {
      canvas.isDrawingMode = true;
    });
    
    var activeObject = null;
    
    canvas.on('object:selected', function(options) {
      activeObject = options.target;
      $("#alpha").slider("option", "value", activeObject.opacity);
    });
    canvas.on('selection:cleared', function(options) {
      activeObject = null;
      $("#alpha").slider("option", "value", 1);
    });
    
    $("#alpha").slider({
      max: 1,
      min: 0,
      step: 0.1,
      value: 1,
      slide: function(event, ui) {
        activeObject && (activeObject.opacity = ui.value)
        canvas.renderAll();
      },
      stop: function(event, ui) {
        canvas.renderAll();
      }
    });
    canvas {
      border: solid 1px #000;
    }
    
    fieldset {
      max-width: 350px;
    }
    <link href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.css" rel="stylesheet"/>
    <script src="https://code.jquery.com/jquery-3.3.1.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.7.22/fabric.min.js"></script>
    <canvas id="c" width="400" height="400"></canvas>
    <br>
    <button id="draw">Draw</button>
    <button id="select">Select</button>
    <br>
    <br>
    <fieldset>
      <legend>Controls</legend>
      <label for="alpha">Opactity</label>
      <div id="alpha" name="alpha"></div>
    </fieldset>

    【讨论】:

      猜你喜欢
      • 2015-05-03
      • 1970-01-01
      • 2017-02-05
      • 1970-01-01
      • 1970-01-01
      • 2017-11-28
      • 1970-01-01
      • 2012-11-24
      • 1970-01-01
      相关资源
      最近更新 更多