在fabric.js中修改对象后,如何获得文本对象字体大小?
下面是我的代码。
var text = new fabric.Text(imgText, {
left: 10,
top: 5,
fontSize: 15,
fontFamily: 'Verdana',
fill: 'white'
});
text.scaleToWidth(canvas.width * 0.5);
text.setControlsVisibility(canvasConfig);
canvas.add(text);
canvas.renderAll();
var objects = canvas.getActiveObject();
var obj = objects;
if (!obj) {
return;
}
//console.log(obj.get('fontSize') *= obj.scaleX);
var angle = obj.get('angle');
var objWidth = obj.get('width') * obj.scaleX;
var objWidthPercent = objWidth / canvas.width * 100;
var objHeight = obj.get('height') * obj.scaleY;
var objHeightPercent = objHeight / canvas.height * 100;
var bound = obj.getBoundingRect();
var objLeft = obj.get('left') / canvas.width * 100;
var objTop = obj.get('top') / canvas.height * 100;
var newfontsize = obj.fontSize * obj.scaleX;
上面,我将默认 FontSize 设置为15。然后,我修改了对象,我可以得到正确的Height, Width, Left, Top,
,但我无法获得FontSize。
在后端,我像下面的屏幕截图一样设置图像和文本。
在前端,我在屏幕截图下会得到什么。
下面的图片和文字样式。
element.style {
left: 64.37%;
top: 14.54%;
width: 28.25%;
height: 14.37%;
font-size: 63.58px;
color: #E346FF;
font-family: Times New Roman;
position: absolute;
max-width: 100%;
z-index: 996;
max-height: 100%;
}
element.style {
left: 56.5%;
top: 0.81%;
width: 42.86%;
height: 42.86%;
max-width: 100%;
max-height: 100%;
position: absolute;
z-index: 995;
display: block;
background-image: url(http://10.16.16.101/LabelExtension/pub/media/labelimageuploader/images/image/o/r/orange_38.png);
background-position: center;
background-repeat: no-repeat;
background-size: contain;
}
当我添加下面的代码时,它可以正常工作,但是后端对象变得越来越模糊。
this.canvas.setHeight(300);
this.canvas.setWidth(240);
this.canvas.backgroundColor = '#E8EEF1';
this.canvas.setDimensions({width: '480px', height: '600px'}, {cssOnly: true});
答案 0 :(得分:7)
以下是将Fabric.js字体转换与CSS转换匹配的方法:https://jsfiddle.net/mmalex/evpky3tn/
解决方案是匹配文本的转换,不尝试调整字体大小。
第1步-准备场景,组成画布,使用矩形对文本进行分组,让用户操作该分组,旋转和缩放。
var canvas = new fabric.Canvas(document.getElementById('c'));
var rect = new fabric.Rect({
width: 50,
height: 50,
left: 90,
top: 120,
fill: 'rgba(255,0,0,0.25)'
});
var text = new fabric.Text("123", {
left: rect.left,
top: rect.top,
fontSize: 15,
fontFamily: 'Verdana',
fill: 'black'
});
text.scaleToWidth(rect.width);
canvas.add(text);
var group = new fabric.Group([rect, text], {
originX: 'center',
originY: 'center',
angle: 25,
scaleY: 1.7
});
canvas.add(group);
canvas.renderAll();
步骤2 -准备DIV样式以进行缩放
.scaled { // this style is applied to DIV element with text
...
font-size: 15px; // Fabric.js text is also 15px size
transform: scale(1, 1); // define initial transform
transition: all 0.25s linear; // let it animate
...
}
步骤3 -评估Fabric.js转换并将CSS应用于DIV元素, 例如:
element.style {
transform: rotate(25deg) scale(1.74774, 2.97116);
}
该解决方案(也称为按钮处理程序)将Fabric.js转换转换为CSS转换:
function matchCssTransform() {
let textScale = text.getTotalObjectScaling();
let pixelRatio = window.devicePixelRatio;
let styleStr = `rotate(${group.angle}deg) scale(${textScale.scaleX / pixelRatio}, ${textScale.scaleY / pixelRatio}) `;
document.getElementById("scaled").style.transform = styleStr;
}
答案 1 :(得分:3)
getHeightOfLine(lineIndex)→{Number}:计算给定位置的字符高度,并返回字符的fontSize。是吗?告诉我。 这是文本类的方法。 http://fabricjs.com/docs/fabric.Text.html#getHeightOfLine
答案 2 :(得分:2)
这是普通的js解决方案。
我无法获取FontSize。
您可以使用计算样式来实现fontSize
let style = window.getComputedStyle(text, null).getPropertyValue('font-size');
let fontSize = parseFloat(style);
https://developer.mozilla.org/de/docs/Web/API/Window/getComputedStyle
除此之外,我建议您使用vw
和vh
.text {
font-size: 10vw;
}
https://web-design-weekly.com/2014/11/18/viewport-units-vw-vh-vmin-vmax/
答案 3 :(得分:2)
问题是文本对象在修改或转换后不会更改其fontSize属性,除非手动设置fontSize属性。这就是为什么文本变得模糊的原因,因为尽管更改了转换大小,但主fontSize仍然保持不变。因此可能的解决方案将是以某种方式动态更改fontSize属性。 http://jsfiddle.net/therowf/xkhwagd8/41/ 在这里,我附了一个jsfiddle示例,形成了您的代码。这段代码与您的代码非常相似。
谢谢,让我知道是否可行。 (:
var canvas = new fabric.Canvas(document.getElementById('c'));
var imgText ="This is text";
var canvasConfig = true;
var text = new fabric.Text(imgText, {
left: 10,
top: 5,
fontSize: 50,
fontFamily: 'Verdana',
fill: 'black'
});
text.scaleToWidth(canvas.width * 0.5);
text.setControlsVisibility(canvasConfig);
canvas.add(text);
canvas.renderAll();
var objects = canvas.getActiveObject();
function moveHandler(evt){
//evt.target.fontSize = 10;
var fontSizeX = evt.target.scaleX;
var fontSizeY = evt.target.scaleY;
if(fontSizeX === fontSizeY){
evt.target.fontSize = fontSizeX*100;
console.log(evt.target.fontSize);
}
}
canvas.on('object:scaling', moveHandler);
<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/2.6.0/fabric.min.js"></script>
<canvas id="c" width="400" height="400"></canvas>