Как сделать flash-ку ссылкой


Flash баннер

Сегодня передо мной возникла одна небольшая проблемка: как сделать flash-ку ссылкой. Поясню - у меня есть флешевый баннер, в котором не зашит getUrl(), и нужно, не пересобирая, сделать его ссылкой.

Игры со css-стилями и код вида:
<a href=...><object...>...</object></a>
ни к чему не приводят - флешка все равно поверх ссылки.

Единственный способ, который сработал у меня во всех браузерах - достаточно неуклюжий, но задачу решает. А состоит он в том, чтобы разместить ссылку в виде блока поверх флешки. Использовать можно как абсолютное позиционирование, так и отрицательные margin-ы.

Флеш-элементы в html всегда располагаются выше всех (по оси z). Нам нужно от этого избавиться - давно известное кроссбраузерное решение: добавить параметр wmode со значением opaque и прописать аналогичный аттрибут тегу embed:

<object...>
   ...
   <param name="wmode" value="opaque">
   <embed wmode="opaque".../>
</object>

Кстати, этот способ также решает проблему выпадающего меню - с ним меню будет выпадать поверх флешевого блока.

Итак, добавим div-контейнер и в нём позиционируем абсолютно наши элементы, указав нужные z-индексы:

<style type="text/css">
   .banner {
      position:absolute;
      left: 0; top: 0;
      z-index:1;
   }
   .link {
      position:absolute;
      left: 0; top: 0;
      z-index:2;
      width: ???; height: ???;
   }
   .container {
      position: relative;
      width: ???; height: ???;
   }
</style>

<div class="container">
   <object... class="banner">
      ...
      <param name="wmode" value="opaque">
      <embed wmode="opaque".../>
   </object>
   <a href="..." class="link"></a>
</div>

Вместо вопросов здесь должны стоять размеры баннера.

Если вам достаточно браузера Safari - дальше можно не читать, в нём все уже работает. В остальных браузерах ссылка все так же не фурычит. Последний шаг на пути к успеху - добавить нашему ссылочному боксу прозрачный фон. Например так:

.link {
   ...
   background: url('n.gif') repeat;
}

Интересно, что наличие картинки n.gif не обязательно. Достаточно будет только вышеприведенного кода. Правда, хорошим тоном будет сделать прозрачный гифик, чтобы не было лишнего 404-го ответа от сервера.

Вот и все! Теперь у нас есть полноценный баннер :)

Комментарии

Да вы извращенец, уважаемый

Полно вам пустословить, милейший!
Предложите решение поизящней..

Спасибо, помогло

Спасибо, полезный материал. Почти готовое решение. Хвалю.

Супер!
Долго искал данное решение.

Спасибо!

Почти всё получилось..ток с эксплорером как всегда проблемы=((

достаточно
background: none;
читай css лучше)

>> Флеш-элементы в html всегда располагаются выше всех (по оси z).
смысл такой же, но - неверно.

Флеш-элемент такого не существует понятия. Есть тег object/embed. Располагается в браузере он РОВНО там где вы его написали. на том же уровне по Z оси.

Реальная причина кроется в способе работы флеш-плеера, а именно то, как он рисует графику на экран. А делает он это следующим образом: он берет браузерский graphic surface (это то что вы видите глазами - графическое полотно, куда браузер помещает отрендеренный html) и в координаты, где расположен object/embed напрямую рендерит свою картинку, с частотой N FPS (обычно делают 20-30). Т.к. браузер рендерит контент только 1 раз после ресайза или изменений в DOM модели, то флеш уже через 1/20-30 секунды замещает на графическом полотне html-изображение своим. При этом, этом, очевидно, вообще никак не учитываются никакие z-index и прочие правила наложений браузеров. Вы можете это понаблюдать - если поверх большой флеши (чтобы тормозило побольше) поместить html контент и ресайзить браузер постоянно - вы увидите как этот контент проклевывается из-под флеша, мигает (это те моменты когда браузер отрендерил html и засунул на полотно, а флеш еще не успел новый кадр туда записать) - возможно не на всех браузерах это видно (зависит от его механизма работы с этим).

Когда вы говорите wmode=opaque, то стиль работы меняется. Флеш плеер не просто кладет свой кадр на полотно, а уже учитывает z-index и прочее, и если есть чтото над ним, он берет эту прямоугольную область и накладывает на свой кадр. При этом естессно, производительность ухудшается (но не особо сильно).

Самый тормознутый режим это wmode=transparent. Когда плеер берет все что снизу, накладывает себя (высчитывая прозрачность еще себя самого), а потом накладывает все что сверху. Т.е. при этом режиме еще видно html под флешом (если в нем графика есть прозрачная конечно).

Однако при wmode=opaque|transparent есть офигенный баг - при этом во флешку, если там есть textinput'ы, не введешь нормально больше русских букв)

Этот баг есть как в 9-м так и в 10-м плеере.

Очень познавательно, спасибо

<object...>
...
<param name="wmode" value="opaque">
<embed wmode="opaque".../>
</object>
Вот за это, ЧЕЛОВЕЧЕСКОЕ ВАМ ОГРОМНЕЙШЕЕ СПАСИБО!!!!!!!!!

вы развернуто мыслите, хорошо! и спасибо!

<div class="code">

<pre><object onmouseup="location.href='http://yandex.ru/';" title="....
и меню родное флеша по правой кнопке работает.
только курсор меняться не хочет на pointer :)</pre>
</div>

хоть бы бб какойнить повесили в комменты, пока дошло что тэги мешают ... :)

spasibo!

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Разрешаю теги: <a> <em> <strong> <pre> <ul> <ol> <li>
  • Строки и параграфы переносятся автоматически.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.

Подробнее о форматировании

Image CAPTCHA
Регистр символов учитывается.