Изменения:
- Убран звук "клика" при вставке IFRAME-а
- Улучшено быстродействие для страниц, на которых нет SELECT-ов
- Исправлен баг
Исходники: ie-iframe-substrate.1.0.1.src.ru.css (~4.5 KB)
Полезные советы, на основе практического опыта
z-index
устанавливается в -1
. Либо, IFRAME добавляется в DOM, позиционируется непосредственно под необходимым элементом и делается равным ему по размеру.
overflow
:auto
или overflow
:scroll
весьма проблематично. Второй вариант не имеет данных недостатков, т.к. IFRAME ни коим образом не связан с элементом, который он "прикрывает". Однако, существует проблема изменения позиции или размера элемента, которым IFRAME постоянно должен соответствовать.
@import
* html
).* html div
.some-layer
, * html
#someLayer
{...}
behavior
element._i
)iframe
.ie-substrate
)[Скачать этот код в виде файла: ie-iframe-substrate.1.0.0.src.ru.css]/** * Селектор слоёв (позиционированных элементов), * которым нужно создать "IFRAME-подложку". */
* html div
.layer
{/* Скрываем от IE 7+ в "standards-compliant" режиме */
behavior
:expression(
/* Если документ загружен и распаршен */
document.readyState=='complete'
? (/* и браузер не IE 7+ (в "quirks" режиме) */
parseFloat(navigator.appVersion.split('MSIE'
)[1
])<7
/* и "IFRAME-подложка" ещё не создана */
&&this
.iframe==null
? (/* создаём IFRAME и вставляем его прямо перед данным элементом (слоем) */
this
.iframe =this
.parentNode.insertBefore( document.createElement('iframe'
),this
),/* устанавливаем свойство "src" (важно для HTTPS соединения) */
this
.iframe.src ='javascript:false'
,/* устанавливаем свойство "id" (для функции обновления) */
this
.iframe.id ='_ie_sub'
+new
Date
().valueOf(),/* устанавливаем свойство "layer" для ссылки на данный слой */
this
.iframe.layer =this
,/* создаём функцию обновления (важно для IE 6.0) */
this
.iframe.func =new
Function
("var iframe = document.getElementById('"
+this
.iframe.id +"'); iframe.allowTransparency=true; iframe.allowTransparency=false;"
),/* устанавливаем соответствующее имя класса */
this
.iframe.className ='ie-substrate'
,/* сбрасываем ссылку на IFRAME и устанавливаем флажок */
this
.iframe =true
,/* отключаем "behavior" для данного элемента */
this
.style.behavior ='none'
/* иначе - отключаем "behavior" для данного элемента */
) :this
.style.behavior ='none'
/* иначе - ничего не делаем */
) :null
)
; }/** * Стили для "IFRAME-подложки" */
iframe
.ie-substrate
{position
:absolute
;/* Делаем IFRAME прозрачным */
filter
:Mask()
;/* Отслеживаем позицию и размеры "прикрываемого" слоя */
behavior
:expression(
/* Если IFRAME в DOM-е (т.е. не удален) */
this
.parentNode ? (/* Если "прикрываемый" слой в DOM-е (т.е. не удален) */
this
.layer.parentNode ? (/* и IFRAME вставлен в DOM-е перед "прикрываемым" слоем */
this
.nextSibling==this
.layer ? (/* перехватываем свойства "прикрываемого" слоя */
this
.style.pixelWidth =this
.layer.offsetWidth,this
.style.pixelHeight =this
.layer.offsetHeight,this
.style.pixelLeft =this
.layer.offsetLeft,this
.style.pixelTop =this
.layer.offsetTop,this
.offsetTop>0
? (/* только если IFRAME виден */
this
.style.zIndex =this
.layer.currentStyle.zIndex,this
.style.visibility =this
.layer.currentStyle.visibility,this
.style.display =this
.layer.currentStyle.display ) :null
/* иначе */
) : (/* вставляем IFRAME перед "прикрываемым" слоем в DOM-е */
this
.layer.parentNode.insertBefore(this
,this
.layer) )/* иначе */
) : (/* удаляем IFRAME */
this
.removeNode(true
) )/* иначе - ничего не делаем */
) :null
)
;/* Обновляем IFRAME-ы периодически, чтобы решить проблему в IE 6.0 * (SELECT-ы всё ещё могут перекрывать слои после скроллинга). */
refresh
:e\xpression(
/* Скрываем от IE 5.5 */
/* Если IFRAME виден */
this
.offsetTop>0
? (/* включить обновление */
this
.timer ?null
:this
.timer = window.setInterval(this
.func,300
)/* иначе */
) : (/* выключить обновление */
this
.timer ?this
.timer = window.clearInterval(this
.timer) :null
))
; }
vertical-align
отличным от top