Веб-разработка

индекс
236,88

DIV поверх флэш

У веб-разработчиков существует известная проблема — как расположить DIV (или что либо другое) поверх flash-объекта внутри html-страницы. Стандартные манипуляции, типа z-index не помогают. И бедные разработчики начинают проклинать flash, хотя это совершенно напрасно, так как раз он здесь совершенно не при чем. Корни гораздо глубже.

DIV поверх флэш

Существует стопроцентно кроссбраузерное решение. Хотя может это и не очень официально со стороны Adobe, но тем не менее, именно этот метод они используют у себя на сайте.

При размещении Flash на странице (совершенно не важно, каким методом, будь-то стандартным от Adobe, либо используя SWFObject) необходимо использовать атрибут/параметр wmode тэга object/embed со значением «opaque».

Естественно — это только первый шаг. О том как позиционировать глубину «дивов» — здесь рассказывать смысла нет :)

Вот рабочий пример (сорри, но мне было лень делать демо-пример, так как закончив с этой задачей, решил сразу написать сюда, пока из головы не вылетело, а по ссылке около метра):

<script type="text/javascript" src="js/swfobject.js"></script>
<script type="text/javascript">swfobject.embedSWF("main.swf", "flash", "100%", "100%", "8", null, null, {menu:"false", wmode:"opaque"});</script>
................................................
<div id="over-holder"><p>А этот текст мы видим поверх Флэш</p></div>
<div id="flash">А тут будет сам Флэш</div>

Теперь, манипулируя значениям z-index, вы можете размещать поверх flash все что угодно.

P.S. Кстати, насчет атрибута wmode, раньше существовало недоразумение со стороны официальной документации и наверно отсюда и пошло недоверия к этому свойству:
«This attribute/parameter works only in Windows with the Flash Player ActiveX control» — т.е. данный атрибут работает только под Windows и IE (это документация трехлетней давности).

Проверено — это работает везде. И в нынешней документации такого утверждения больше нет.
+80
27 января 2009, 00:31
272

комментарии (78)

+4
CurlyBrace #
Только вы забыли упомянуть о том что в таком режиме флэш не всегда корректно обрабатывает события мыши, сиречь клики и hover.
НЛО прилетело и опубликовало эту надпись здесь
+1
CurlyBrace #
В некоторых случаях hover на флэше вобще не отрабатывает, и это в принципе логично, так как DIV его перекрывает, но неприемлемо если флэш интерактивен.
0
shaggysmile #
хороший пример демонстрирует сайт Adobe. Когда выпадающее меню нужно расположить поверх Flash. А флэшки у них чаще всего интерактивные
0
CurlyBrace #
Вобще-то это плохой пример, так как выпадающие менюшки имеют свойство пропадать, когда вы убираете с них мышь, а так же не обладают шириной в 100% по дефолту, как любой DIV
+7
shaggysmile #
конечно было бы странно если флэш перекрывать дивом на 100% а потом говорить, что события не работают )
–6
CurlyBrace #
Вобще-то у DIV по дефолту ширина 100%. А у вас как раз топик называется «DIV поверх флэш».
+1
alex_blank #
div используется верстальщиками как блочный элемент «для всего» (не несущий семантической нагрузки), так же как span — инлайн-элемент «для всего»
НЛО прилетело и опубликовало эту надпись здесь
0
yeremeiev #
Ну, есть другие способы перекрывать что-либо: относительное позиционирование или отрицательные марджины, например.
0
Rulez #
А кто подскажет как решать данную проблему, если нужно что бы div был поверх флеш баннера, а баннер вызывается через JS и параметр wmode прописать не получается, так как его нет. Как решить данную проблему?
НЛО прилетело и опубликовало эту надпись здесь
0
CurlyBrace #
Именно.
НЛО прилетело и опубликовало эту надпись здесь
0
CurlyBrace #
Нет, вы как раз точно описали ситуацию комментарием выше. И именно wmode opaque был проблемой.
НЛО прилетело и опубликовало эту надпись здесь
0
Goodkat #
Случайно, не под Оперой?

У меня как-то давно, были какие-то глюки под Оперой с wmode opaque. но это было очень давно.
+1
Gangsta #
Также в таком режиме в версиях 8 и ниже имеются проблемы с вводом уникодных символов в текстовые поля. Кстати, баг тянется с пятой версии.
+1
Stepik #
и проблемы с кириллицей в полях ввода
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
+2
shaggysmile #
transparent включает прозрачность у flash, что не всегда приемлемо. Этот режим просто удивительно «жрет» память, особенно в FF
+3
shaggysmile #
попробуйте в таком режиме посмотреть полупрозрачное видео
НЛО прилетело и опубликовало эту надпись здесь
0
shaggysmile #
сейчас также актуально, увы
0
Radeon #
акутально, плюс прозрачность иногда конфликтует с русскими буковками
0
zaynutdinoff #
при режиме transparent мы получаем не только «съеденную» память, но и огромное количество непредсказуемых глюков со стороны флэшки, как например: невозможность вводить кирилицу; мигание графики, учавствующей в анимации по ее bounding'у, невозможность корректно отловить мышинные события и размеры сцены и еще миллиард тонн подобного рода мусора.
Глюки проявляются через раз, но отловить их проблем особых не составляет.
0
xaerom #
еще z-index теряется :(
+1
kossnocorp #
Главная ошибка jQuery разработчиков при общении с flash, это поиск альтернатив популярному SWFObject. Хочеться что бы это был легкий плагин для jQuery. Но… jQuery.flash — зло, т.к не поддерживает wmode и при верстки создается впечатление, что просто «не тот» способ. В ход идут разные уловки, но и они не помагают. То же самое и с другими плагинами. Будьте аккуратны!
0
shaggysmile #
это верно.
кстати SWFObject 2 по стилю swfobject.embedSWF — чем то похож на стиль JQuery
0
Frank #
Хмм, возможно я неправильно вас понял, но я использую именно этот плагин и он прекрасно поддерживает wmode.
$('#logo').flash({src: 'logo.swf', wmode: 'opaque'});
0
crash #
А есть еще метод с wmode=transparent. Чем он лучше/хуже?
0
shaggysmile #
уже писал выше — приведет к очень сильному снижению производительности
0
valyard #
С transparent появляется толпа странных глюков, один из них — полная невозможность писать нелатинскими шрифтами в текстовых полях, косяки с видео и другие непонятные вещи. Так что transparent флэш разработчики стараются не использовать, чтобы не создавать головняков.
+3
radarlog #
в линуксе не работает. даже оффсайт адоба.
0
brutaler #
у меня работает
0
brutaler #
flash v10
archlinux
+1
Garret #
Эх, еще изменение значение wmode ломает ввод в текстовых полях в раскладках отличных от EN.
bugs.adobe.com/jira/secure/attachment/21618/FlashPlayerBug_wmode_transparent_working.htm
0
xdisa #
Огромное спасибо, как раз искал решение. Плюсик Ваш :)
+2
kr1z #
Спасибо автору, уже несколько сайтов видел с флэшем на фоне, правда с пассивной анимацией ))
Всегда было интересно как сделано, но лень было разбираться или заглянуть в исходный код.
0
vick #
спасибо
+1
AlDev #
wmode как правило может дать два побочных эффекта:
1. Большие проблемы с производительностью (скорость работы Flash-ки падает в разы)
2. Иногда абсолютно странное отображение содержимого flash-ки при использовании фильтров (деталей не помню, но то, что были проблемы — это точно)
+1
Clark #
Неможко не в тему, но на вашем сайте стоит позорная надпись "— Счастливые пользователи Internet Explorer и Opera идут лесом и остаются без скругленных уголков".
+1
shaggysmile #
это немного другая история :)
в тему этого топика не входит ))
–1
Clark #
Я являюсь пользователем Opera и это меня малость задело)
–1
shaggysmile #
да и не только вас )
надпись была немного грубоватой.
была )
–1
homm #
«Поверьте, мы знаем как делают «кроссбраузерные» скругленные уголки —
результат вы видите у себя на экране (можете проверить, если не верите).

Но мы за то, что бы вы пользовались правильными браузерами.»

Это вы сами решили какие браузеры правильные? Похвально. У верстальщика детсикй максимализм из ушей прет?
–1
shaggysmile #
давайте тему этого вопроса оставим здесь.
я напишу еще отдельный топик, почему так (не про сайт), а про подход…
–1
pepelsbey #
Пишите в Desktop Team, чтобы они внедрили border-radius ;)
0
Orion #
wmode = opaque дико глючит, если используется абсолюное позиционирование и страница проскроллированна — firefox начинает отдавать плееру неправильные координаты, соответственно работать становится невозможно. У Ослика и оперы нормально.
+4
homm #
Автор, простите, но…
www.tinyurl.com/c8wqkm
0
muxx #
Прикольно, эта статья по запросу «div поверх флэш» уже на 6 месте =)
0
Richard_Ferlow #
Странно, у меня без проблем вроде получилось.

через position relative, absolute и z-index

Но соглашусь — флэш подшлючивает немного.
–1
Slon #
Спасибо!
–1
ontolog #
Спасибо, очень вовремя!
0
rimmer333 #
Соглашусь, новичкам полезно. Нехай висит на главной, цветет плюсами, проникает в favorities. В одной команде разработчиков даже пришли к выводу всегда писать wmode, приличествующий случаю, ибо польза делу от этого всегда есть.
0
Tvarb #
Это все шалости.
Вот попробуйте разместить div поверх select формы :)
+2
egorinsk #
Да, хабр не торт. Эта «проблема» решается 20-минутным гуглением.
+1
Andrey_Gordeev #
Вы меня извините… но 20 минут много будет… об этом в FAQах писали когда я еще под стол пешком ходил.
xpoint.ru/forums/internet/html_css/css/faq.xhtml#751
0
egorinsk #
Просто я не флешер, факи не читаю (есть же гугл), не верстальщик, а необходимость однажды заставить флеш-плагин вести себя как html-элемент (а не висеть поверх всего контента) была.
+1
Dojd #
Проблема на самом деле незначительная и гугл легко дает по ней ответ (egorinsk, откуда 20 минут, достаточно 2-х). Не знаком с проблемой и не знает решения только ленивый верстальщик или тот, кому не довелось работать с флешем.
Грустно действительно что такие мелочные вопросы столь горячо принимаются хаудиторией хабра.
0
Tvarb #
Надо ввести ветку «Web-разработка — начинающим» :)
0
Retarded #
Не надо.
0
egorinsk #
Возможно, меня оправдает то, что я не флешер и не верстальщик, а поправить «поведение» флеш-плагина поручили мне)) Причем, мне сказали примерно так: либо помести дивы как надо, либо докажи почему это невозможно сделать  — я полез на сайт адоба за доказательствлом невозможности (ибо думал, что флеш всегда создает отдельное окно) — а там обнаружилось, что проблема решаема))
+3
Retarded #
Какой-то прямо культпросвет на хабре разворачивается. То как футер сделать, то див сверху флеша положить…
0
Vilz #
песочница работает ^_^
+1
Andrey_Gordeev #
Да уж… что это за «веб-разработчики» которые этого не знают и начинают проклинать flash?
Я все как-то стесняюсь, вреде как ценного людям поведать нечего, а после такого думаю… напишу что нить типа «Капитан очевидность рекомендует!» опыт большой, наработок много. Как говориться «Я решил начать серию статей… для себя»… заодно карму подниму )
–1
shaggysmile #
представьте, оказывается таковых много…
лично для меня это не новость, но как оказалось что очень многие об этом не знают :(
+1
Holden #
Этот способ работает. Но не всегда.
В опере 9 и 10 под линукс не работает. Хотя в той же опере под виндовс — работает без проблем.
+1
heel #
Отключен JS — не увидишь флеш
0
Vilz #
< noscript > уже не актуален?
0
nortiman #
Пример работы активной анимации www.anywayanyday.ru
После задания параметров перелёта, нажимайте найти и перейдёте на страницу с самолётиком которые летает за мышкой. Логотип и текст расположены поверх объекта flash.
0
hydralien #
Ещё есть ситуация когда в embed отображается плагин (в частности, SVG от Adobe в IE7), и события в плагине не работают — требует клика по нему. Решение нашёл такое:

var theObjects = document.getElementsByTagName(«embed»);
for (var i = 0; i < theObjects.length; i++) {
theObjects[i].outerHTML = theObjects[i].outerHTML;
}
0
Rulez #
А кто подскажет как решать данную проблему, если нужно что бы div был поверх флеш баннера, а баннер вызывается через JS и параметр wmode прописать не получается, так как его нет. Как решить данную проблему?
0
r0zh0k #
«Вызывай банер в диве, для дива укажи z-index, всего то делов.»

Ответ от моего друга, который не зареган на хабре.
0
r0zh0k #
Простите, совет неверный.
0
Rulez #
А проверял? не работает
0
r0zh0k #
Выше уже ответил — погорячился с выводами.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.