WebFont.load({
google: {
families: [
'Anton',
'Bad Script',
'Catamaran',
'Droid Sans',
'Droid Serif',
'Hammersmith One',
'Hanalei',
'IM Fell Double Pica',
'Lobster',
'Merriweather',
'Noto Sans JP',
'Open Sans',
'Pangolin',
'Roboto',
'Shadows Into Light',
'Stalinist One',
'Ubuntu',
'Ultra'
]
},
fontloading: function(familyName, fvd) {
console.log('Loading font [' + familyName + ']')
},
fontactive: function(familyName, fvd) {
console.log('Loaded font [' + familyName + ']')
$('#fontName').append('<option value="' + familyName + '">' + familyName + '</option>');
},
});
const stage = new Konva.Stage({
container: 'container',
width: window.innerWidth,
height: window.innerHeight
}),
layer = new Konva.Layer(),
// Create the text node
textObj = new Konva.Text({
x: 20,
y: 100,
fill:'black',
draggable: true
}),
// prepare a transformer
transformer = new Konva.Transformer(),
// make a rect to show the extent of the text
rect = new Konva.Rect({
stroke: 'red',
listening: false
})
// Add layer to stage and group to layer
stage.add(layer);
layer.add(textObj, transformer, rect);
textObj.on('dragmove', function(){
reset();
})
transformer.on('transform', function(){
reset();
})
// function to do the drawing. Could easily be accomodated into a class
function reset()
{
$('#lineHeightVal').html(parseFloat($('#lineHeight').val()));
textObj.setAttrs({
text: $('#displayText').val(),
fontFamily: $('#fontName').val(),
fontSize: parseFloat($('#fontSize').val()),
lineHeight: parseFloat($('#lineHeight').val())
});
let w = textObj.width(),
h = textObj.height();
// position and size rect to illustrate size of text
rect.setAttrs({
x: textObj.x(),
y: textObj.y(),
width: w,
height: h,
scaleX: textObj.scaleX(),
scaleY: textObj.scaleY(),
rotation: textObj.rotation()
});
transformer.nodes([textObj])
stage.setAttrs(
{
scaleX: parseFloat($('#scale').val()),
scaleY: parseFloat($('#scale').val())
});
}
$('.inputThang').on('input', function(e){
reset();
})
$('#displayText').on('blur', function(){
reset();
})
$('#lineHeight').on('input', function(){
reset();
})
// call go once to show on load
reset();
body {
margin: 20px;
padding: 0;
overflow: hidden;
background-color: #f0f0f0;
}
#displayText {
width: 550px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://unpkg.com/konva@8/konva.min.js"></script>
<p>Text: <input id='displayText' value="Wombats are a scatty creature"> </p>
<p>
<label for='fontSize'>Font Size (Pts)</label>
<select id='fontSize' class='inputThang'>
<option >200</option>
<option>180</option>
<option>160</option>
<option >140</option>
<option>120</option>
<option selected>100</option>
<option>75</option>
<option>66</option>
<option >48</option>
<option >32</option>
<option>24</option>
<option>16</option>
<option>12</option>
<option>10</option>
<option>6</option>
</select>
<select id='fontName' class='inputThang'>
<option selected value='Arial'>Arial</option>
<option value='Verdana'>Verdana</option>
<option value='Tahoma'>Tahoma</option>
<option value='Calibri'>Calibri</option>
<option value='Trebuchet MS'>Trebuchet MS</option>
<option value='Times New Roman'>Times New Roman</option>
<option value='Georgia'>Georgia</option>
<option value='Garamond'>Garamond</option>
<option value='Courier New'>Courier New</option>
<option value='Brush Script MT'>Brush Script MT</option>
</select>
</p>
<p>
<label for='lineHeight'>Line height</label>
<input id='lineHeight' type="range" min="0.2" max="2.4" value="1.2" step="0.2">
<span id='lineHeightVal' style='margin-right: 10px;'></span>
<p>
<label for='scale'>Stage scale</label>
<select id='scale' class='inputThang'>
<option >0.25</option>
<option>0.5</option>
<option>1</option>
<option>2</option>
<option>3</option>
<option>4</option>
<option>5</option>
<option>10</option>
<option>20</option>
</select>
</p>
<div id="container"></div>
<script src="http://ajax.googleapis.com/ajax/libs/webfont/1/webfont.js"></script>