IronRangeBehavior provides the behavior for something with a minimum to
maximum range.
See: Documentation, Demo.
npm install --save @polymer/iron-range-behavior
import {PolymerElement} from '@polymer/polymer/polymer-element.js';
import {mixinBehaviors} from '@polymer/polymer/lib/legacy/class.js';
import {html} from '@polymer/polymer/lib/utils/html-tag.js';
import {IronRangeBehavior} from '@polymer/iron-range-behavior/iron-range-behavior.js';
class SimpleRange extends mixinBehaviors(IronRangeBehavior, PolymerElement) {
  static get template() {
    return html`
      <style>
        :host {
          display: inline-flex;
          align-items: center;
        }
        :host > * {
          margin: 0.125em;
        }
        #barContainer {
          display: inline-block;
          position: relative;
          border: 0.125em solid gray;
          height: 1em;
          width: 12em;
        }
        #bar {
          position: absolute;
          top: 0.125em;
          bottom: 0.125em;
          left: 0.125em;
          background-color: blue;
        }
      </style>
      <span>[[ratio]]%</span>
      <div id="barContainer"><div id="bar" style="width: {{ratio}}%;"></div></div>
    `;
  }
}
customElements.define('simple-range', SimpleRange);Then, in your HTML:
<simple-range min="0" max="200" value="120"></simple-range>If you want to send a PR to this element, here are the instructions for running the tests and demo locally:
git clone https://github.com/PolymerElements/iron-range-behavior
cd iron-range-behavior
npm install
npm install -g polymer-clipolymer serve --npm
open http://127.0.0.1:<port>/demo/polymer test --npm