Jumpy Live Frame Selector (Full Canvas, Auto-Resizing)
<style>html{margin:0;overflow:hidden}.post-nav{display:none}</style>
<form name="jumpy" style="background:transparent">
<select name="example" size="1" onChange="gone()">
<!-- CHANGE THE BELOW URLS TO YOUR OWN-->
<option value="https://noobish.com/cat-vs-ball-of-yarn/">Select a Site (or Play w/Cat)</option>
<option value="https://denverit.com">DenverIT.com</option>
<option value="https://halsgallery.com">HalsGallery.com</option>
<option value="https://culturesolutionsgroup.com">CultureSolutionsGroup.com</option>
<option value="https://microchic.fm">MicroChic.fm</option>
<option value="https://microchic.com">MicroChic.com</option>
</select>
<input type="button" name="test" value="Go!" onClick="gone()">
</form>
<script language="javascript">
<!--
//Drop-down Document Viewer- (c) Dynamic Drive (www.dynamicdrive.com)
//For full source code, 100's more DHTML scripts, and TOS,
//visit http://www.dynamicdrive.com
//Specify display mode (0 or 1)
//0 causes document to be displayed in an inline frame, while 1 in a new browser window
var displaymode=0
//if displaymode=0, configure inline frame attributes (ie: dimensions, intial document shown
var iframecode='<iframe id="external" style="width:100%; height: calc(100vh - 21.2px); border: none;" src="https://noobish.com/cat-vs-ball-of-yarn/"></iframe>'
/////NO NEED TO EDIT BELOW HERE////////////
if (displaymode==0)
document.write(iframecode)
function gone(){
var selectedurl=document.jumpy.example.options[document.jumpy.example.selectedIndex].value
if (document.getElementById&&displaymode==0)
document.getElementById("external").src=selectedurl
else if (document.all&&displaymode==0)
document.all.external.src=selectedurl
else{
if (!window.win2||win2.closed)
win2=window.open(selectedurl)
//else if win2 already exists
else{
win2.location=selectedurl
win2.focus()
}
}
}
//-->
</script>
<script>
// Selecting the iframe element
var frame = document.getElementById("external");
// Adjusting the iframe height onload event
frame.onload = function()
// function execute while load the iframe
{
// set the height of the iframe as
// the height of the iframe content
frame.style.height =
frame.contentWindow.document.body.scrollHeight + 'px';
// set the width of the iframe as the
// width of the iframe content
frame.style.width =
frame.contentWindow.document.body.scrollWidth+'px';
}
</script>
YouTube Embed Light (Full Canvas, Auto-Resizing)
<div class="youtube-embed" data-id="hmH3XMlms8E"></div>
Or select to use the Youtube Full Canvas Template in the Post Editor and put (only) the YouTube Video ID Code (i.e. hmH3XMlms8E) in the Facebook Description Field.
<style>
lite-youtube {
background-color: #000;
position: relative;
display: block;
contain: content;
background-position: center center;
background-size: cover;
cursor: pointer;
max-width: 720px;
}
/* gradient */
lite-youtube::before {
content: '';
display: block;
position: absolute;
top: 0;
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAADGCAYAAAAT+OqFAAAAdklEQVQoz42QQQ7AIAgEF/T/D+kbq/RWAlnQyyazA4aoAB4FsBSA/bFjuF1EOL7VbrIrBuusmrt4ZZORfb6ehbWdnRHEIiITaEUKa5EJqUakRSaEYBJSCY2dEstQY7AuxahwXFrvZmWl2rh4JZ07z9dLtesfNj5q0FU3A5ObbwAAAABJRU5ErkJggg==);
background-position: top;
background-repeat: repeat-x;
height: 60px;
padding-bottom: 50px;
width: 100%;
transition: all 0.2s cubic-bezier(0, 0, 0.2, 1);
}
/* responsive iframe with a 16:9 aspect ratio
thanks https://css-tricks.com/responsive-iframes/
*/
lite-youtube::after {
content: "";
display: block;
padding-bottom: calc(100% / (16 / 9));
}
lite-youtube > iframe {
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
border: 0;
}
/* play button */
lite-youtube > .lty-playbtn {
width: 68px;
height: 48px;
position: absolute;
cursor: pointer;
transform: translate3d(-50%, -50%, 0);
top: 50%;
left: 50%;
z-index: 1;
background-color: transparent;
/* YT's actual play button svg */
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 68 48"> .lty-playbtn,
lite-youtube .lty-playbtn:focus {
filter: none;
}
/* Post-click styles */
lite-youtube.lyt-activated {
cursor: unset;
}
lite-youtube.lyt-activated::before,
lite-youtube.lyt-activated > .lty-playbtn {
opacity: 0;
pointer-events: none;
}
.lyt-visually-hidden {
clip: rect(0 0 0 0);
clip-path: inset(50%);
height: 1px;
overflow: hidden;
position: absolute;
white-space: nowrap;
width: 1px;
}
</style>
<lite-youtube videoid="ogfYd705cRs" playlabel="Play: Keynote (Google I/O '18)"></lite-youtube>
<script>
/**
* A lightweight youtube embed. Still should feel the same to the user, just MUCH faster to initialize and paint.
*
* Thx to these as the inspiration
* https://storage.googleapis.com/amp-vs-non-amp/youtube-lazy.html
* https://autoplay-youtube-player.glitch.me/
*
* Once built it, I also found these:
* https://github.com/ampproject/amphtml/blob/master/extensions/amp-youtube (👍👍)
* https://github.com/Daugilas/lazyYT
* https://github.com/vb/lazyframe
*/
class LiteYTEmbed extends HTMLElement {
connectedCallback() {
this.videoId = this.getAttribute('videoid');
let playBtnEl = this.querySelector('.lty-playbtn');
// A label for the button takes priority over a [playlabel] attribute on the custom-element
this.playLabel = (playBtnEl && playBtnEl.textContent.trim()) || this.getAttribute('playlabel') || 'Play';
/**
* Lo, the youtube placeholder image! (aka the thumbnail, poster image, etc)
*
* See https://github.com/paulirish/lite-youtube-embed/blob/master/youtube-thumbnail-urls.md
*
* TODO: Do the sddefault->hqdefault fallback
* - When doing this, apply referrerpolicy (https://github.com/ampproject/amphtml/pull/3940)
* TODO: Consider using webp if supported, falling back to jpg
*/
if (!this.style.backgroundImage) {
this.posterUrl = `https://i.ytimg.com/vi/${this.videoId}/hqdefault.jpg`;
// Warm the connection for the poster image
LiteYTEmbed.addPrefetch('preload', this.posterUrl, 'image');
this.style.backgroundImage = `url("${this.posterUrl}")`;
}
// Set up play button, and its visually hidden label
if (!playBtnEl) {
playBtnEl = document.createElement('button');
playBtnEl.type = 'button';
playBtnEl.classList.add('lty-playbtn');
this.append(playBtnEl);
}
if (!playBtnEl.textContent) {
const playBtnLabelEl = document.createElement('span');
playBtnLabelEl.className = 'lyt-visually-hidden';
playBtnLabelEl.textContent = this.playLabel;
playBtnEl.append(playBtnLabelEl);
}
// On hover (or tap), warm up the TCP connections we're (likely) about to use.
this.addEventListener('pointerover', LiteYTEmbed.warmConnections, {once: true});
// Once the user clicks, add the real iframe and drop our play button
// TODO: In the future we could be like amp-youtube and silently swap in the iframe during idle time
// We'd want to only do this for in-viewport or near-viewport ones: https://github.com/ampproject/amphtml/pull/5003
this.addEventListener('click', e => this.addIframe());
}
// // TODO: Support the the user changing the [videoid] attribute
// attributeChangedCallback() {
// }
/**
* Add a to the head
*/
static addPrefetch(kind, url, as) {
const linkEl = document.createElement('link');
linkEl.rel = kind;
linkEl.href = url;
if (as) {
linkEl.as = as;
}
document.head.append(linkEl);
}
/**
* Begin pre-connecting to warm up the iframe load
* Since the embed's network requests load within its iframe,
* preload/prefetch'ing them outside the iframe will only cause double-downloads.
* So, the best we can do is warm up a few connections to origins that are in the critical path.
*
* Maybe `` would work, but it's unsupported: http://crbug.com/593267
* But TBH, I don't think it'll happen soon with Site Isolation and split caches adding serious complexity.
*/
static warmConnections() {
if (LiteYTEmbed.preconnected) return;
// The iframe document and most of its subresources come right off youtube.com
LiteYTEmbed.addPrefetch('preconnect', 'https://www.youtube-nocookie.com');
// The botguard script is fetched off from google.com
LiteYTEmbed.addPrefetch('preconnect', 'https://www.google.com');
// Not certain if these ad related domains are in the critical path. Could verify with domain-specific throttling.
LiteYTEmbed.addPrefetch('preconnect', 'https://googleads.g.doubleclick.net');
LiteYTEmbed.addPrefetch('preconnect', 'https://static.doubleclick.net');
LiteYTEmbed.preconnected = true;
}
addIframe() {
const params = new URLSearchParams(this.getAttribute('params') || []);
params.append('autoplay', '1');
const iframeEl = document.createElement('iframe');
iframeEl.width = 560;
iframeEl.height = 315;
// No encoding necessary as [title] is safe. https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html#:~:text=Safe%20HTML%20Attributes%20include
iframeEl.title = this.playLabel;
iframeEl.allow = 'accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture';
iframeEl.allowFullscreen = true;
// AFAIK, the encoding here isn't necessary for XSS, but we'll do it only because this is a URL
// https://stackoverflow.com/q/64959723/89484
iframeEl.src = `https://www.youtube-nocookie.com/embed/${encodeURIComponent(this.videoId)}?${params.toString()}`;
this.append(iframeEl);
this.classList.add('lyt-activated');
// Set focus for a11y
this.querySelector('iframe').focus();
}
}
// Register custom element
customElements.define('lite-youtube', LiteYTEmbed);
</script>
Add &igu=1 to the end of a Google Search to display the results in an iFrame... ghost blog themes
<a href="https://www.google.com/search?q=ghost+blog+themes&igu=1" rel="dd">ghost blog themes</a>
Put this in the Excerpt field, replacing CODE with the code from the shared Otter Note URL.
(uses ddottersidepanel.min.js, div.ddottersidepanel, .ddottersidepanel .contentarea, and div.ddottersidepanel iframe)
<a href="https://otter.ai/u/CODE?noGapBottom=true" rel="otter">LISTEN</a>
Note: to slide-in a page other than Otter, use rel=dd
(uses ddajaxsidepanel.min.js, div.ddajaxsidepanel, .ddajaxsidepanel .contentarea, and div.ddajaxsidepanel iframe)
Full canvas - the iFrame content covers the entirety of the popped-up page, with a Home button in the top left corner (also useful for embedding, popping up or sliding in from other sites.)
a. In the editor, select the Otter Full Canvas Template (which only uses the empty as wrapper for the iFrame.
b. In the Facebook Description, put (only) the Otter CODE.
Or... alternatively – put this HTML into the content of the post. This accomplishes the same as the above, but includes all of the default post elements which you can selectively include on the page along with the iFrame. (Also useful as a re-usable Snippet in the editor.)
(uses iframe.modal_iframe modal_iframe-on, div.otterpop, and div.otterpop iframe)
<div class="otterpop">
<iframe src="https://otter.ai/u/CODE?noGapBottom=true"></iframe>
</div>
<style>
body.post-template article.post,
section.post,
.container-wrap-modal {
padding: 0;
margin:0
}
.post-title,
.post-full-image,
.post-nav,
.post-meta--top,
.authors,
.aside,
.toc-details,
.group {
display:none
}
figure {
margin: 0
}
</style>
(uses ddottersidepanel.min.js, div.ddottersidepanel, .ddottersidepanel .contentarea, and div.ddottersidepanel iframe)
<div style="padding: 0 25%">
<a href="https://otter.ai/u/CODE?noGapBottom=true" rel="otter">
<h2 class="post-title" style="font-size: 1.2em">
Listen >>
</h2>
>> INSERT IMAGE CARD HERE <<
</a>
</div>
<style>
.post-full-image {
display: none
}
.kg-image-card {
margin: 0
}
</style>
(uses ddottersidepanel.min.js, div.ddottersidepanel, .ddottersidepanel .contentarea, and div.ddottersidepanel iframe)
<a href="https://otter.ai/u/CODE?noGapBottom=true" rel="otter">Listen >></a>
Use this sparingly as it loads with the page and slows down the site.
(uses div.otterframe and div.otterframe iframe)
<div class="otterframe">
<iframe src="https://otter.ai/u/CODE?noGapBottom=true"></iframe>
</div>
The portable version (to embed Otter.ai posts in any other site) is this code (also useful as a re-usable Snippet in the editor):
<style>
div.otterframe iframe {
height:30em;
width:100%;
border:0px none;
margin:-57px 0 1.5em 0
}
div.otterframe {
overflow:hidden;
border-radius:10px;
background-color:#fff;
width:30em;
margin:auto;
box-shadow: -1px 3px 15px -4px rgba(0,0,0,0.76)
}
@media (max-width: 767px) {
div.otterframe {
width:100%;
box-shadow:none
}
}
</style>
<div class="otterframe">
<iframe src="https://otter.ai/u/CODE?noGapBottom=true">
</iframe>
</div>