Изменения:
- Исправлен баг в IE 5.5
Полезные советы, на основе практического опыта
z-index устанавливается в -1. Либо, IFRAME добавляется в DOM, позиционируется непосредственно под необходимым элементом и делается равным ему по размеру.
overflow:auto или overflow:scroll весьма проблематично. Второй вариант не имеет данных недостатков, т.к. IFRAME ни коим образом не связан с элементом, который он "прикрывает". Однако, существует проблема изменения позиции или размера элемента, которым IFRAME постоянно должен соответствовать.
@import* html).* html div.some-layer, * html #someLayer {...}behaviorelement._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'+newDate().valueOf(),/* устанавливаем свойство "layer" для ссылки на данный слой */this.iframe.layer =this,/* создаём функцию обновления (важно для IE 6.0) */this.iframe.func =newFunction("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