I'm stuck on what appears to be a CSS/z-index conflict with the YouTube player. In Firefox 3 under Windows XP, Take a look at this page: http://spokenword.org/program/21396 Click on the Collect button and note that the pop-up <div> appears under the YouTube player. On other browsers the <div> appears on top. It has a z-index value of 999999. I've tried setting the z-index of the <object> element containing the player to a lower value, but that didn't work. Any idea how to get the pop-up to appear over the player?
5 Answers
Try to add the wmode
parameter to be opaque
like this:
(Note that it's included in both a <param>
tag and a wmode
attribute on the <embed>
tag.)
<object width='425' height='344'>
<param name='movie' value='http://www.youtube.com/v/Wj_JNwNbETA&hl=en&fs=1'>
<param name='type' value='application/x-shockwave-flash'>
<param name='allowfullscreen' value='true'>
<param name='allowscriptaccess' value='always'>
<param name="wmode" value="opaque" />
<embed width='425' height='344'
src='http://www.youtube.com/v/Wj_JNwNbETA&hl=en&fs=1'
type='application/x-shockwave-flash'
allowfullscreen='true'
allowscriptaccess='always'
wmode="opaque"
></embed>
</object>

- 96,640
- 56
- 199
- 270

- 807,428
- 183
- 922
- 838
-
Ha! That did it. I'll have to read up to see why. Would have thought that making the player opaque might have the opposite effect if anything. Excellent! – Doug Kaye Nov 28 '08 at 17:03
-
It sucks that ad-networks do not, and sometimes REFUSE to, do this. They want their ads bleeding through... – eduncan911 Oct 15 '09 at 00:00
-
Taht code worked for me in IE but not in firefox. I have the same code. – David García González Feb 03 '10 at 10:03
although the recommendation by CMS is valid, there is an important update. If you want to use 'iframe' instead of 'embed' , simply add ?wmode=transparent
to your video link and that does the magic. I find this more simple and clean.
Update, Feb 2014
It's been a while and this may be outdated.
Somebody reported that now &wmode=transparent
works instead.

- 3,440
- 2
- 33
- 47
-
1
-
4This is the most relevant answer, since no one uses YouTube embed tags anymore. Thanks! – phreakhead Feb 24 '12 at 08:43
-
2
-
1
i've found a pure JS function that fix it in all browsers!
there you go:
function fix_flash() {
// loop through every embed tag on the site
var embeds = document.getElementsByTagName('embed');
for (i = 0; i < embeds.length; i++) {
embed = embeds[i];
var new_embed;
// everything but Firefox & Konqueror
if (embed.outerHTML) {
var html = embed.outerHTML;
// replace an existing wmode parameter
if (html.match(/wmode\s*=\s*('|")[a-zA-Z]+('|")/i))
new_embed = html.replace(/wmode\s*=\s*('|")window('|")/i, "wmode='transparent'");
// add a new wmode parameter
else
new_embed = html.replace(/<embed\s/i, "<embed wmode='transparent' ");
// replace the old embed object with the fixed version
embed.insertAdjacentHTML('beforeBegin', new_embed);
embed.parentNode.removeChild(embed);
} else {
// cloneNode is buggy in some versions of Safari & Opera, but works fine in FF
new_embed = embed.cloneNode(true);
if (!new_embed.getAttribute('wmode') || new_embed.getAttribute('wmode').toLowerCase() == 'window')
new_embed.setAttribute('wmode', 'transparent');
embed.parentNode.replaceChild(new_embed, embed);
}
}
// loop through every object tag on the site
var objects = document.getElementsByTagName('object');
for (i = 0; i < objects.length; i++) {
object = objects[i];
var new_object;
// object is an IE specific tag so we can use outerHTML here
if (object.outerHTML) {
var html = object.outerHTML;
// replace an existing wmode parameter
if (html.match(/<param\s+name\s*=\s*('|")wmode('|")\s+value\s*=\s*('|")[a-zA-Z]+('|")\s*\/?\>/i))
new_object = html.replace(/<param\s+name\s*=\s*('|")wmode('|")\s+value\s*=\s*('|")window('|")\s*\/?\>/i, "<param name='wmode' value='transparent' />");
// add a new wmode parameter
else
new_object = html.replace(/<\/object\>/i, "<param name='wmode' value='transparent' />\n</object>");
// loop through each of the param tags
var children = object.childNodes;
for (j = 0; j < children.length; j++) {
try {
if (children[j] != null) {
var theName = children[j].getAttribute('name');
if (theName != null && theName.match(/flashvars/i)) {
new_object = new_object.replace(/<param\s+name\s*=\s*('|")flashvars('|")\s+value\s*=\s*('|")[^'"]*('|")\s*\/?\>/i, "<param name='flashvars' value='" + children[j].getAttribute('value') + "' />");
}
}
}
catch (err) {
}
}
// replace the old embed object with the fixed versiony
object.insertAdjacentHTML('beforeBegin', new_object);
object.parentNode.removeChild(object);
}
}
}
now you can just run in when the page loads with jQuery:
$(document).ready(function () {
fix_flash();
});

- 2,982
- 3
- 30
- 40
-
I wish I had seen this last month when I was looking for something like this! My search never found this page. Ended up writing something almost exactly the same! – Adam Heath Jan 07 '11 at 11:59
-
-
Be careful though, this solution as it is will hide Flash objects on IE<9 – lima Nov 24 '11 at 19:18
-
hey fandelost. it still works for me. i've used it here: http://skydiveinisrael.com/ and it all seems good. look at the youtube video in the middle and press on one of the pictures on the side. you'll see the picture pop above the flash which is exactly the wanted result... – danfromisrael Nov 30 '11 at 14:06
We use jQuery Flash plugin to convert YouTube links to Flash movies. In this case, wmode is passed as an option in order to get the YouTube video to appear underneath the jQuery Dialog we open:
$('a[href^="http://www.youtube.com"]').flash(
{ width: nnn, height: nnn, wmode: 'opaque' }
);

- 53
- 8
I've noticed that wmode="opaque" terribly affects on usage of CPU.
Chrome make on my notebook 50% CPU usage (without opaque ~8%).
So be careful with this option.

- 7,823
- 6
- 41
- 67