• Stars
    star
    1,272
  • Rank 35,451 (Top 0.8 %)
  • Language
    JavaScript
  • License
    Other
  • Created almost 9 years ago
  • Updated 5 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Form element autosizing, the way it should be

Stretchy

Form element autosizing, the way it should be!

Features

  • Handles multiple types of form controls Textareas? Inputs? Select menus? You name it!
  • Tiny footprint Less than 1.5KB minified and gzipped!
  • Automatically accounts for newly added controls via mutation observers
  • Restrict form controls by a selector …or don’t and autosize all your form controls!
  • Completely standalone no jQuery or other dependencies
  • Plays well with existing HTML/CSS Follows placeholders, styling, min/max-width/height constraints, transitions
  • No JS knowledge required Everything can be configured just via HTML!
  • Works in all modern browsers (v1 even works in old browsers)
  • Written in ESM Available in ESM, CJS, and good ol' globals
  • Works in Shadow DOM Use it in your web components!

Usage

Good ol’ <script> element

This method is optimal if you don't need much control, and would rather avoid writing any JS.

Just include the script anywhere in the page:

<script src="https://stretchy.verou.me/dist/stretchy.iife.min.js" async></script>

If you include Stretchy this way it will run automatically and you don’t need to do anything else (unless you want to customize which elements it applies to).

ESM (v2.0.0+)

This method is ideal if you are including Stretchy as a dependency on a larger project and want to prevent any side effects.

import * as Stretchy from "https://stretchy.verou.me/dist/stretchy.min.js";
Stretchy.init();

CommonJS (v2.0.0+)

A CommonJS build is also available. require("stretchy") should work on Node.

Local files

All three of the above methods can be used with your own local files as well. You can download Stretchy here.

npm works like you’d expect too:

npm install stretchy

Which elements does Stretchy resize?

By default, Stretchy resizes all <textarea>s, <select> menus with no size attribute and <input> elements that are text fields (e.g. with no type attribute, or with one equal to text, tel, email, url).

To limit that set further you can set an additional filter, via a CSS selector. There are two ways to specify a filter: via HTML attributes (if you'd prefer to avoid writing JS) or via JS.

Via HTML attributes:

Use the data-stretchy-filter attribute, on any element. Note that this means you can use the attribute on the <script> element that calls Stretchy itself, in which case you can also shorten its name to data-filter.

For example, to restrict it to elements that either have the foo class or are inside another element that does, you could use data-stretchy-filter=".foo, .foo *" on an element or call Stretchy like this:

<script src="stretchy.min.js" data-filter=".foo, .foo *" async></script>

If you specify the data-stretchy-filter attribute on multiple elements, the last value (in source order) wins. data-filter directly on Stretchy’s <script> element takes priority over any data-stretchy-filter declaration.

Via JS

If you want to avoid modifying the markup, you can use JavaScript instead:

Stretchy.selectors.filter = ".foo, .foo *";

Note that if you are including Stretchy via a <script> element, it will run as soon as the document is ready, which may be before you’ve set a filter. You need to ensure that line runs after Stretchy has loaded (so that the Stretchy object is available) and before the DOM is ready. To avoid this hassle, I'd recommend using attributes to set the filter if you include Stretchy that way, or including Stretchy as a module if you want to customize its settings via JS.

JavaScript API

Stretchy has a spartan API, since in most cases you don’t need to call it at all. Stretchy works via event delegation and detects new elements via mutation observers, so you do not need to call any API methods for adding new elements via scripting (e.g. AJAX).

If needed, these are Stretchy’s API methods:

Property or Method Description
init([root]) Resize controls inside a given element, and monitor for changes. root can be any Node, including Shadow roots.
resize(element) Autosize one element based on its content. Note that this does not set up any event listeners, it just calculates and sets the right dimension (width or height, depending on the type of control) once.
resizeAll([elements | selector, [root]]) Apply Stretchy.resize() to a collection of elements, or all Stretchy is set to apply to, if no argument is provided.
resizes(element) Can Stretchy be used on this particular element? (checks if element is in the DOM, if it's of the right type and if it matches the selector filter provided by data-stretchy-selector, if the attribute is set.
selectors.base CSS selector to tell Stretchy which elements can be resized. Defaults to input, select, textarea. Main use case for modifying this is in case you have a custom element that behaves like these and want Stretchy to stop ignoring it. If you just want to filter which elements Stetchy resizes, use filter below.
selectors.filter CSS selector that elements need to match to be resized.
active Boolean. Set to false to temporarily disable Stretchy globally.`

Browser support

All modern browsers. For details, see .browserslistrc

v1 Browser Support Notes

Stretchy v1 worked in Chrome, FF 3.6, IE9, Opera, Safari, Android & more.

More Repositories

1

awesomplete

Ultra lightweight, usable, beautiful autocomplete with zero dependencies.
JavaScript
6,931
star
2

prefixfree

Break free from CSS prefix hell!
JavaScript
3,841
star
3

animatable

One property, two values, endless possiblities
HTML
2,580
star
4

bliss

Blissful JavaScript
JavaScript
2,384
star
5

inspire.js

Lean, hackable, extensible slide deck framework. Previously known as CSSS.
JavaScript
1,717
star
6

color.js

Color conversion & manipulation library by the editors of the CSS Color specifications
JavaScript
1,581
star
7

css3patterns

The popular CSS3 patterns gallery, now on Github :)
HTML
1,415
star
8

dabblet

An interactive CSS playground
JavaScript
810
star
9

dpi

dpi love - Easily find the DPI/PPI of any screen
JavaScript
748
star
10

multirange

A tiny polyfill for HTML5 multi-handle sliders
CSS
605
star
11

conic-gradient

Polyfill for conic-gradient() and repeating-conic-gradient()
HTML
486
star
12

rety

Record typing on one or more editors and replay it at will, to simulate live coding
JavaScript
383
star
13

parsel

A tiny, permissive CSS selector parser
TypeScript
361
star
14

md-block

A custom element for rendering stylable (light DOM) Markdown
JavaScript
283
star
15

regexplained

JavaScript
273
star
16

chainvas

Make APIs suck less
HTML
262
star
17

css.land

Hands on CSS demos
HTML
213
star
18

css3test

How does your browser score for its CSS3 support?
JavaScript
211
star
19

nudeui

Lea's kitchen sink of form components. WIP. Try at your own risk or come back later.
JavaScript
197
star
20

HTML5-Progress-polyfill

Polyfill for the HTML5 <progress> element
JavaScript
178
star
21

rgba.php

Script for automatic generation of one pixel alpha-transparent images for non-RGBA browsers to easily emulate RGBA colors in backgrounds
PHP
176
star
22

cubic-bezier

Playground for CSS bezier-based timing functions
JavaScript
169
star
23

markapp

Building apps by authoring HTML
CSS
134
star
24

duoload

Simple, client-side comparison of website loading behavior
CSS
130
star
25

play.csssecrets.io

CSS Secrets Book live demos
CSS
119
star
26

talks

All my talks (move still in progress)
HTML
91
star
27

incrementable

Increment length values in textfields
JavaScript
83
star
28

corner-shape

Play with corner-shape before it’s implemented!
JavaScript
75
star
29

StronglyTyped

A library for strongly typed properties & global variables in JavaScript
JavaScript
70
star
30

css-colors

Share & convert CSS colors
JavaScript
62
star
31

bubbly

[Unfinished] CSS speech bubbles made easy!
JavaScript
50
star
32

whathecolor

CSS
47
star
33

html-syntax-guidelines

47
star
34

css-almanac

Repo for planning & voting on which stats to study
SCSS
33
star
35

forkgasm

Lea & Chris’ culinary adventures
HTML
32
star
36

talks-list

Automatic talks list, generated from JSON. Unmaintained, use Mavo instead.
JavaScript
29
star
37

chroma-zone

Slides for my talk “The Chroma Zone: Engineering Color on the Web”
CSS
21
star
38

lea.verou.me

Towards a serverless lea.verou.me! WIP, either help out or move along.
JavaScript
17
star
39

htest

Declarative, boilerplate-free unit testing
JavaScript
17
star
40

mavoice

Prioritize features for open source projects
CSS
15
star
41

issue-closing

View issue closing stats for any repo!
HTML
14
star
42

missing-slice

The Missing Slice talk slides
HTML
12
star
43

hci.mit.edu

WIP. Preview:
HTML
12
star
44

tweeplus

Longer tweets, no strings attached.
JavaScript
11
star
45

leaverou.github.io

Just a data repo, I don't intend to put a website here for now
10
star
46

mygraine

A migraine tracker, built with Mavo. Work in progress, come back later.
HTML
9
star
47

bytesizematters

JavaScript
8
star
48

homesearch

A sample Mavo app for people looking for housing to store info about and compare the homes they are trying to decide between
HTML
6
star
49

uist2017

Website for ACM UIST 2017
HTML
6
star
50

feedback

Easily save & share lists of tweets and own your data. Made with Mavo.
HTML
5
star
51

expenses

App to generate summary of expenses, made with Mavo
CSS
4
star
52

my-lifesheets

HTML
4
star
53

rework-utils

Utilities to explore ASTs generated by the Rework CSS parser. Originally written for the Web Almanac.
JavaScript
3
star
54

testlib

Just a test, move along
JavaScript
2
star
55

mv-data

2
star
56

contacts

1
star
57

zoe-eats

Baby food log, made with Mavo
1
star
58

zoelearns.com

JavaScript
1
star
59

website

1
star
60

pathed

Get/set/subset deep objects via readable, extensible paths. WIP.
JavaScript
1
star