CSS Independent Content: Difference between revisions

From GreaseSpot Wiki
Jump to navigationJump to search
Ecmanaut (talk | contribs)
I think the more common use case is a panel that doesn't cover center screen.
Henrik (talk | contribs)
Minor tidywork/rephrasing.
Line 3: Line 3:
The solution is to add your panel inside an iframe. Example code:
The solution is to add your panel inside an iframe. Example code:


  // Position:fixed means stay fixed even the page scrolls. z-index keeps your iframe on top.
  // position:fixed means stay fixed even the page scrolls. z-index keeps your iframe on top.
  // The remainder of the line smacks the panel into the bottom left corner, out of your way.
  // The remainder of the line smacks the panel into the bottom left corner, out of your way.
  // Overflow (in combination with the setTimeout) ensures the iframe fits your entire panel.
  // Overflow (in combination with the setTimeout) ensures the iframe fits your entire panel.
  var css = 'position:fixed; z-index:9999; bottom:0; left:0; border:0; margin:0; padding:0; ' +
  var css = 'position:fixed; z-index:9999; bottom:0; left:0; border:0; margin:0; padding:0; ' +
  'overflow:hidden;'
          'overflow:hidden;'
   
   
  var iframe = document.createElement('iframe');
  var iframe = document.createElement('iframe');
Line 17: Line 17:
  document.body.appendChild(iframe);
  document.body.appendChild(iframe);
   
   
  // setTimeout( cb, 0 ) lets Firefox initialize the DOM before we try to use it.
  // setTimeout(function, 0) lets Firefox initialize the DOM before we try to use it.
  setTimeout( function() {
  setTimeout(function() {
   
   
     var doc = iframe.contentDocument;
     var doc = iframe.contentDocument;
     doc.body.style.background = 'red';
     doc.body.style.background = 'red';
     doc.body.innerHTML = 'Test.';
     doc.body.innerHTML = 'Test.';
    iframe.style.width = doc.body.offsetWidth + "px";
     iframe.style.height = doc.body.offsetHeight + "px";
     iframe.style.height = doc.body.offsetHeight + "px";
    iframe.style.width = doc.body.offsetWidth + "px";
   
   
  }, 0 );
  }, 0);


A variant on a more intrusive interface (perhaps invoked from a menu item) might be a lightbox style panel, mid-screen. Just drop the last two iframe.style lines and change the CSS to:
The above code will result in a minimal panel always-on-top in the bottom left corner, that grows to contain its contents. For a more intrusive lightbox-style panel mid-screen, just drop the two <code>iframe.style</code> lines and change the CSS to e.g.:


  // Margin, top, left, width and height centers the iframe horizontally and vertically:
  // Margin, top, left, width and height centers the iframe horizontally and vertically:
  var css = 'position:fixed; z-index:9999; border:1px solid black; ' +
  var css = 'position:fixed; z-index:9999; border:1px solid black; ' +
  'top:50%; left:50%; width:30em; margin:-15em; 0 0 -10em; height:20em;';
          'top:50%; left:50%; width:30em; margin:-15em; 0 0 -10em; height:20em;';

Revision as of 06:59, 5 June 2007

Any HTML you inject into a site is subject to the CSS rules of that site. This is often what you want: the elements you inject will fit in nicely. But if you inject something – perhaps a configuration panel – that should look the same to pages where styles can vary wildly (e.g. MySpace, eBay) or across multiple sites (e.g. @include *), you may find that you want it exempt from the site CSS.

The solution is to add your panel inside an iframe. Example code:

// position:fixed means stay fixed even the page scrolls. z-index keeps your iframe on top.
// The remainder of the line smacks the panel into the bottom left corner, out of your way.
// Overflow (in combination with the setTimeout) ensures the iframe fits your entire panel.
var css = 'position:fixed; z-index:9999; bottom:0; left:0; border:0; margin:0; padding:0; ' +
          'overflow:hidden;'

var iframe = document.createElement('iframe');
iframe.setAttribute('style', css);

// The about:blank page becomes a blank(!) canvas to modify
iframe.src = 'about:blank');

document.body.appendChild(iframe);

// setTimeout(function, 0) lets Firefox initialize the DOM before we try to use it.
setTimeout(function() {

    var doc = iframe.contentDocument;
    doc.body.style.background = 'red';
    doc.body.innerHTML = 'Test.';
    iframe.style.width = doc.body.offsetWidth + "px";
    iframe.style.height = doc.body.offsetHeight + "px";

}, 0);

The above code will result in a minimal panel always-on-top in the bottom left corner, that grows to contain its contents. For a more intrusive lightbox-style panel mid-screen, just drop the two iframe.style lines and change the CSS to e.g.:

// Margin, top, left, width and height centers the iframe horizontally and vertically:
var css = 'position:fixed; z-index:9999; border:1px solid black; ' +
          'top:50%; left:50%; width:30em; margin:-15em; 0 0 -10em; height:20em;';