npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

text-metrics

v4.0.1

Published

An efficient text measurement set for the browser.

Downloads

8,835

Readme

text-metrics

NPM version Build Status BrowserStack Status Download Coverage Status

An lightweight & efficient text measurement set for the browser using canvas to prevent layout reflows.

Features

  • Compute width
  • Compute height
  • Compute linebreaks
  • Compute max font-size to fit into element

Installation

If you're using node, you can run npm install text-metrics.

text-metrics is also available via Bower (bower install text-metrics)

Alternatively if you just want to grab the file yourself, you can download either the current stable production version or the development version directly.

Setting it up

text-metrics supports AMD (e.g. RequireJS), CommonJS (e.g. Node.js) and direct usage (e.g. loading globally with a <script> tag) loading methods. You should be able to do nearly anything, and then skip to the next section anyway and have it work. Just in case though, here's some specific examples that definitely do the right thing:

CommonsJS (e.g. Node)

text-metrics needs some browser environment to run.

const textMetrics = require('text-metrics');

const el = document.querySelector('h1');
const metrics = textMetrics.init(el);

metrics.width('unicorns');
// -> 210

metrics.height('Some long text with automatic word wraparound');
// -> 180
metrics.lines('Some long text with automatic word wraparound');
// -> ['Some long text', 'with automatic', 'word', 'wraparound']
metrics.maxFontSize('Fitting Headline');
// -> 33px

Webpack / Browserify

const textMetrics = require('text-metrics');
textMetrics.init(document.querySelector('.textblock')).lines();

AMD (e.g. RequireJS)

define(['text-metrics'], function (textMetrics) {
  textMetrics.init(document.querySelector('h1')).width('unicorns');
});

Directly in your web page:

<script src="text-metrics.min.js"></script>
<script>
  textMetrics.init(document.querySelector('h1')).width('unicorns');
</script>

API

Construct textmetrics object:

textMetrics.init([el, overwrites])

You can call textMetrics with either an HTMLElement or with an object with style overwrites or with both. e.g.

// takes styles from h1
textMetrics.init(document.querySelector('h1'));

// takes styles from h1 and overwrites font-size
textMetrics.init(document.querySelector('h1'), {fontSize: '20px'});

// only use given styles
textMetrics.init({
  fontSize: '14px',
  lineHeight: '20px',
  fontFamily: 'Helvetica, Arial, sans-serif',
  fontWeight: 400,
  width: 100,
});

Methods

width([text, [options, [overwrites]]]) height([text, [options, [overwrites]]]) lines([text, [options, [overwrites]]]) maxFontSize([text, [options, [overwrites]]])

text

Type: string Defaults to el.innerText if an element is available

options

Type: object

| key | default | description | | --------- | ------- | ------------------------------------------------------------------ | | multiline | false | The width of widest line instead of the width of the complete text |

overwrites

Type: object

Use to overwrite styles

Performance

I've compared this module with a very naive jQuery implementation as well as the . See https://jsperf.com/bezoerb-text-metrics Even if Range.getBoundingClientRect should be considered as a performance bottleneck according to what-forces-layout by Paul Irish, i couldn't detect any sort of recalculate style and it massively outperforms textMetrics.height().

Compatibility

The normal build (3,2kb gzipped) should work well on modern browsers. These builds are tested using

License

Copyright (c) 2016 Ben Zörb Licensed under the MIT license.

License

MIT © Ben Zörb