Alguns truques do elemento iframe

Bom dia amigos

Desafio


Faça algo semelhante ao Codepen Dashboard.

O resultado deve ser algo como isto:


Possível solução


O layout de uma seção pode ficar assim:
<section> <h3>Title</h3> <div class="viewport"> <iframe src="index.html" seamless scrolling="no"></iframe> </div> <div class="buttons"> <button onclick="window.open('index.html', '_blank')" title="fullscreen">demo</button> <button onclick="document.location='code.7z'" title="download">code</button> </div> </section> 

O que é interessante aqui?

Como cada bloco possui um título, podemos agrupá-lo na seção (de acordo com a especificação, a seção e o artigo devem ter cabeçalhos).

.viewport - um bloco contendo um quadro (a seguir denominamos apenas um bloco).

O atributo src refere-se ao conteúdo do quadro, que é substituído por uma "capa" usando JS (mais sobre isso posteriormente).

Sem costura especifica que o conteúdo do quadro deve ser exibido como se fosse parte de um documento (atualmente não é suportado).

Rolagem = "não" impede a exibição de barras de rolagem no quadro.

Window.open é uma maneira de abrir o conteúdo de um quadro ("_blank" em uma nova guia).

Document.location é uma maneira de baixar um arquivo.

Todo o HTML
 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width: device-width"> <title>Iframe</title> <link rel="stylesheet" href="style.css"> <script src="script.js" defer></script> </head> <body> <header> <h2>Title</h2> </header> <main> <section> <h3>Title</h3> <div class="viewport"> <iframe src="index.html" seamless scrolling="no"></iframe> </div> <div class="buttons"> <button onclick="window.open('index.html', '_blank')" title="fullscreen">demo</button> <button onclick="document.location='code.7z'" title="download">code</button> </div> </section> <section> <h3>Title</h3> <div class="viewport"> <iframe src="index.html" seamless scrolling="no"></iframe> </div> <div class="buttons"> <button onclick="window.open('index.html', '_blank')" title="fullscreen">demo</button> <button onclick="document.location='code.7z'" title="download">code</button> </div> </section> <section> <h3>Title</h3> <div class="viewport"> <iframe src="index.html" seamless scrolling="no"></iframe> </div> <div class="buttons"> <button onclick="window.open('index.html', '_blank')" title="fullscreen">demo</button> <button onclick="document.location='code.7z'" title="download">code</button> </div> </section> <section> <h3>Title</h3> <div class="viewport"> <iframe src="index.html" seamless scrolling="no"></iframe> </div> <div class="buttons"> <button onclick="window.open('index.html', '_blank')" title="fullscreen">demo</button> <button onclick="document.location='code.7z'" title="download">code</button> </div> </section> </main> <footer> <p>© All rights reserved.</p> </footer> </body></html> 


Número do problema 1. Insira o quadro no bloco


O tamanho padrão do iframe no Chrome é 304x154px.

Aplique os seguintes estilos à seção:
 section { margin: 1em; width: 300px; background: rgba(0, 0, 0, 0.15); border-radius: 5px; box-shadow: inset 0 0 50px rgba(0, 0, 0, 0.3); } 

Definir a largura da seção como 300px (+ meta name = "viewport" e display: flex no elemento pai) garante a mesma exibição de quadro em telas com resoluções diferentes.

Acontece assim:


E deve ser assim:


Como você pode ver, o problema é que o conteúdo é exibido no quadro em tamanho real e o próprio quadro vai um pouco além dos limites do bloco.

Uma maneira de resolver esse problema é dimensionar o iframe:
 /*       ""  , , 1024768px,     25%,   ,      - 0 0 (  ) */ iframe { width: 1024px; height: 768px; transform: scale(.25); transform-origin: 0 0; } 

Em seguida, determine o tamanho do bloco. Largura: 1024 * 0,25 = 256px, Altura: 768 * 0,25 = 192px.

Tudo CSS
 @import url("https://fonts.googleapis.com/css?family=Playfair+Display|Roboto&display=swap"); * { margin: 0; padding: 0; box-sizing: border-box; } body { min-height: 100vh; background: radial-gradient(circle, skyblue, steelblue) fixed; display: flex; flex-direction: column; font-family: "Playfair Display", serif; text-align: center; color: #222; } h2 { font-size: 2em; text-transform: uppercase; text-shadow: 1px 1px #ddd; user-select: none; } main { flex-grow: 1; display: inherit; flex-wrap: wrap; justify-content: space-evenly; align-content: space-evenly; } section { margin: 1em; width: 300px; background: rgba(0, 0, 0, 0.15); border-radius: 5px; box-shadow: inset 0 0 50px rgba(0, 0, 0, 0.3); } .viewport { margin: auto; width: 256px; height: 192px; overflow: hidden; } iframe { width: 1024px; height: 768px; transform: scale(.25); transform-origin: 0 0; } h3 { padding: 0.5em 0; font-size: 1em; letter-spacing: 2px; text-transform: uppercase; text-align: center; color: #ddd; text-shadow: 1px 1px 0 #222; user-select: none; } button { border: none; outline: none; margin: 0.75em 0; padding: 0.75em; width: 100px; background: linear-gradient(to bottom, skyblue, steelblue); font-family: inherit; font-weight: bold; letter-spacing: 2px; color: inherit; text-transform: uppercase; border-radius: 10px; box-shadow: 0 0 2px rgba(0, 0, 0, 0.4); cursor: pointer; transition: .2s; } button + button { margin-left: 1em; } button:active, button:checked, button:focus, button:hover { background: radial-gradient(steelblue, skyblue); color: #ddd; box-shadow: inset 0 0 2px rgba(0, 0, 0, .4); } 


Problema nº 2: exibindo conteúdo ao passar o mouse


Com um número significativo de quadros na página, especialmente com conteúdo dinâmico, obtemos um carregamento / recarregamento muito longos e atrasos constantes ao rolar.

Para resolver esse problema, desabilitamos o conteúdo dos quadros e o substituímos por uma imagem. A imagem deve ter um tamanho de 1024x768px. Para ser mais preciso, alteramos os endereços dos arquivos - o valor é src (no Codepen, esse problema é resolvido com uma breve animação do conteúdo do quadro). Quando você passa o mouse sobre um quadro específico, seu conteúdo deve ser exibido.

A solução poderia ser esta:
 //      let iframes = document.querySelectorAll("iframe") //   (         Nodelist,   ) for (let i = 0; i < iframes.length; i++){ let iframe = iframes[i], //    sr originalSrc = iframe.src //     iframe.src = "cover.jpg" //       iframe.addEventListener("mouseover", () => iframe.src = originalSrc) //  "" iframe.addEventListener("mouseout", () => iframe.src = "cover.jpg") } 

O resultado pode ser visto aqui .

Obrigado pela atenção. Tudo de bom.

Source: https://habr.com/ru/post/pt485304/


All Articles