Как мне сделать div, закрывающий iframe, исчезающим при наведении курсора мыши, делая iframe интерактивным?

#html #css

#HTML #css

Вопрос:

Я работаю над наложением поверх полнокадрового iframe Google docs. Я хочу, чтобы верхняя часть документов была покрыта div шириной 100%, который исчезает при наведении курсора мыши, открывая параметры документов, которые становятся интерактивными.

У меня работает переход fade, но невидимый div блокирует нажатие на iframe. Если я использую pointer-events:none, изменяю z-index или display:none, я получаю неприятный эффект мерцания при перемещении курсора.

Есть ли обходной путь?

https://github.com/plasticplant/miscresearch/tree/master/miscresearch

 #background-site {
  position: absolute;
  width: 100%;
  height: 100%;
  z-index: 1;
}

#background-site iframe {
  width: 100%;
  height: 100%;
  border: none;
  overflow: scroll;
}

#header {
  position: absolute;
  width: 100%;
  z-index: 30;
  font-size: 55px;
  font-family: 'Sporting_Grotesque-Bold';
  padding: 5px;
  text-align: center;
  transition: 0.3s;
  background: white;
 }

  #header:hover {
  opacity: 0;
}
  
 <div id="header">
miscresearch
</div>

<div id="background-site"><iframe name="backgrnd" id="backgrnd" scrolling="yes" src="https://docs.google.com/document/d/16_jikyP9LfNibSOvM4XPeuB2jhf8YEYES1p8xhTBBDM/edit?usp=sharing"></iframe></div>

  

Комментарии:

1. поделитесь своим кодом, чтобы мы могли ответить!

2. Спасибо, Зишан, я добавил код.

Ответ №1:

Попробуйте это, должно сработать — я воспроизвел вашу проблему, используя некоторые divs, но это проясняет суть.

Сначала используйте стиль «pointer-event: none;», чтобы сделать div верхнего уровня доступным для выбора. Нижний div имеет события наведения курсора мыши и наведения курсора мыши, которые вызывают javascript для изменения непрозрачности наложения.

Вы можете попробовать применить функции наведения курсора мыши и вывода курсора мыши к div, содержащему iframe

 function hidefunc(){
  document.getElementById("test").style.opacity = '0';
}
function showfunc(){
  document.getElementById("test").style.opacity ="1"
}  
 #test{
  position:absolute;
  top:0px;
  width:300px;
  height:300px;
  background-color:#000000;
  transition: opacity .5s;
  pointer-events:none;
  z-index:2;
}
#base{
  position:absolute;
  top:0;
  z-index:0;
  height:50px;
  width:600px;
  background-color:red;
}  
 <div id="test">
</div>
<div onmouseover="hidefunc()" onmouseout="showfunc()" id="base">
  <a href="">Link</a>
</div>  

Комментарии:

1. Мне нравится ваше мышление, но, к сожалению, красный базовый div не обнаруживается под iframe

Ответ №2:

Возможно, использование z-index — лучший подход, потому что, когда вы выполняете display:none; on:hover, вы не зависаете ни на одном элементе, поэтому возникает неприятный эффект.

 #header:hover {
    opacity: 0;
    z-index: -1;
}
  

Комментарии:

1. Я пробовал это. К сожалению, он по-прежнему создает эффект мерцания.

2. Я сделал да, но он все еще слишком глючный / мерцающий, когда курсор перемещается для моего приложения.

Ответ №3:

Iframes имеют событие загрузки, которое срабатывает после их загрузки.
Просто создайте свой оверлей и удалите его, как только сработает событие onload iframe.

HTML:

 <div id="background-site" class="showOverlay">
    <iframe name="backgrnd" id="backgrnd" scrolling="yes" src="https://docs.google.com/document/d/16_jikyP9LfNibSOvM4XPeuB2jhf8YEYES1p8xhTBBDM/edit?usp=sharing"></iframe>
</div>
  

CSS:

 #background-site {
    position: relative;
}

#background-site.showOverlay:before {
    position: absolute;
    top: 0; left: 0; right: 0; bottom: 0;
    background-color: red;
    z-index: 2;
}
  

JS :

 document.getElementById("backgrnd").addEventListener("load", function() {
    document.getElementById("background-site").classList.remove('showOverlay')
});
  

Для текущего кода вы также можете использовать parentElement для достижения того же результата, поскольку событие запускается в iframe:

 document.getElementById("backgrnd").addEventListener("load", function(e) {
    e.target.parentElement.classList.remove('showOverlay')
});
  

Ответ №4:

Привет, у меня есть рабочее решение (см. Ниже).

К сожалению, для этого требуется (ванильный) JavaScript; Надеюсь, вы не возражаете. Я попробовал несколько CSS-решений, таких как анимация, и все, но безрезультатно.

В любом случае, хитрость заключается в использовании отдельных прослушивателей событий ввода и вывода мыши в iframe и оверлеях соответственно.

 document.getElementById("overlay").addEventListener("mouseover", overlayDisappear);
document.getElementById("theiframe").addEventListener("mouseout", overlayAppear);

function replaceAll(str, toFind, toReplace){
  return str.replace(new RegExp(toFind.toString(),"g"), toReplace.toString());
}

function overlayAppear(){
  //console.log("Appear", document.getElementById("overlay").className);
  document.getElementById("overlay").className = replaceAll( document.getElementById("overlay").className, "_disappear","_appear");  
}

function overlayDisappear(){
  //console.log("Disappear", document.getElementById("overlay").className);
  document.getElementById("overlay").className = replaceAll( document.getElementById("overlay").className, "_appear","_disappear");  
}  
 #theiframe, #overlay{
  width:200px;
  height:200px;
  
  position:fixed;
  top:0;
  left:0;
}

#theiframe{
  border: 2px solid black;
}

#overlay{
  background:red;
  transition:all 0.3s ease;
}

#overlay._appear{
  opacity:1;
  z-index:1;
}

#overlay._disappear{
  opacity:0;
  z-index:-1;
}

/*
#overlay:hover{
  animation-name: disappear;
  animation-duration: 0.3s;
  animation-fill-mode: forwards;
}

@keyframes disappear{
  0%   { opacity:1; }
  50%  { opacity:0.5; }
  99%  { opacity:0; z-index:1; }
  100% { opacity:0; z-index:-1; }
}*/  
 <iframe id="theiframe" src="https://samleo8.github.io/web"></iframe>
<div id="overlay" class="_appear"></div>  

Комментарии:

1. Это работает изначально, но поскольку iframe охватывает всю страницу, div больше не появится.

2. В противном случае событие mouse out никогда не сработает, если это целая страница