<html>
<head>
<meta name="description" content="[add your bin description]" />
<meta charset="utf-8">
<title>An element query experiment by @scottjehl</title>
</head>
<body>
<h1>An element query experiment by <a href="http://twitter.com/scottjehl">@scottjehl</a></h1>
<div class="example-layout">
<p class="mod mod-foo">The background of this element will change depending on its own width</p>
</div>
<h2> How to</h2>
<ol>
<li>Give an element a class of <code>mod</code> and whatever other classes you might need for styling it.
<pre><code>
<p class="mod mod-foo">...</p>
</code></pre>
</li>
<li>Claim that element’s potential element query breakpoints in your CSS by setting its <code>:before</code> selector’s <code>content</code> property value with space-separated numbers, like this:
<pre><code>
.mod-foo:before {
content: "300 450 620";
}
</code></pre>
</li>
<li>For all elements with this "mod" class, a little JavaScript will set and maintain (on resize) a <code>data-minwidth</code> attribute on them containing a subset of the widths that are less-than-or-equal-to the element’s own width. You can use that to write selectors like this, which says, “if the data-minwidth attribute contains the 450”:
<pre><code>
.mod[data-minwidth~="450"] {
background: blue;
}
</code></pre>
</li>
</ol>
<p>That’s about it. Here’s the CSS for the sample element on this page:</p>
<pre><code>
.mod-foo:before {
content: "300 410 500";
}
.mod-foo {
background: green;
color: #fff;
padding: 20px;
}
.mod-foo[data-minwidth~="300"] {
background: blue;
}
.mod-foo[data-minwidth~="410"] {
background: red;
}
.mod-foo[data-minwidth~="500"] {
background: gray;
}
</code></pre>
</body>
</html>
.mod:before {
display: none;
}
/* set up some element query breakpoints for mod-foo */
.mod-foo:before {
content: "300 410 500";
}
.mod-foo {
background: green;
color: #fff;
padding: 20px;
}
.mod-foo[data-minwidth~="300"] {
background: blue;
}
.mod-foo[data-minwidth~="410"] {
background: red;
}
.mod-foo[data-minwidth~="500"] {
background: gray;
}
/* demo styles for the layout surrounding the element query element */
body {
margin: 30px;
font-family: sans-serif;
}
.example-layout {
background: tan;
}
@media (min-width: 350px){
.example-layout {
padding-right: 25%;
}
}
@media (min-width: 550px){
.example-layout {
padding-right: 50%;
}
}
/*
An element query experiment by @scottjehl
*/
(function( w ){
function updateModAttributes(){
var mods = w.document.querySelectorAll( ".mod" );
for( var m = 0; m < mods.length; m++ ){
var mod = mods[ m ],
breakpoints = w.getComputedStyle( mod, ":before" ).getPropertyValue( "content" ),
widths = breakpoints.replace(/[^\d ]/g,"").split( " "),
modWidth = mod.clientWidth,
minWidths = [];
for( var i = 0; i < widths.length; i++ ){
if( parseFloat( widths[ i ] ) <= modWidth ){
minWidths.push( widths[ i ] );
}
}
mod.setAttribute( "data-minwidth", minWidths.join( " " ) );
}
}
w.addEventListener( "load", updateModAttributes, false );
w.addEventListener( "resize", updateModAttributes, false );
})( this );
Output
300px
You can jump to the latest bin by adding /latest
to your URL
Keyboard Shortcuts
Shortcut | Action |
---|---|
ctrl + [num] | Toggle nth panel |
ctrl + 0 | Close focused panel |
ctrl + enter | Re-render output. If console visible: run JS in console |
Ctrl + l | Clear the console |
ctrl + / | Toggle comment on selected lines |
ctrl + ] | Indents selected lines |
ctrl + [ | Unindents selected lines |
tab | Code complete & Emmet expand |
ctrl + shift + L | Beautify code in active panel |
ctrl + s | Save & lock current Bin from further changes |
ctrl + shift + s | Open the share options |
ctrl + y | Archive Bin |
Complete list of JS Bin shortcuts |
JS Bin URLs
URL | Action |
---|---|
/ | Show the full rendered output. This content will update in real time as it's updated from the /edit url. |
/edit | Edit the current bin |
/watch | Follow a Code Casting session |
/embed | Create an embeddable version of the bin |
/latest | Load the very latest bin (/latest goes in place of the revision) |
/[username]/last | View the last edited bin for this user |
/[username]/last/edit | Edit the last edited bin for this user |
/[username]/last/watch | Follow the Code Casting session for the latest bin for this user |
/quiet | Remove analytics and edit button from rendered output |
.js | Load only the JavaScript for a bin |
.css | Load only the CSS for a bin |
Except for username prefixed urls, the url may start with http://jsbin.com/abc and the url fragments can be added to the url to view it differently. |