Pretty much only with CSS transforms and box-shadow, JS is only used for the controls.
A Pen by Felix Rilling on CodePen.
| <!--The Main Thing--> | |
| <div id="wrapper"> | |
| <div class="phone view_1" id="phone_1"> | |
| <iframe src="https://codepen.io" id="frame_1"></iframe> | |
| </div> | |
| </div> | |
| <!--Controls etc.--> | |
| <div id="controls"> | |
| <div> | |
| <label for="iframeURL">URL:</label> | |
| <input type="text" id="iframeURL" placeholder="https://codepen.io" value="https://codepen.io" /> | |
| </div> | |
| <div> | |
| <label for="iframeWidth">Width:</label> | |
| <input type="number" id="iframeWidth" placeholder="400" value="400" /> | |
| </div> | |
| <div> | |
| <label for="iframeHeight">Height:</label> | |
| <input type="number" id="iframeHeight" placeholder="650" value="650" /> | |
| </div> | |
| <!--Idea by /u/aerosole--> | |
| <div> | |
| <label for="iframePerspective">Add perspective:</label> | |
| <input type="checkbox" id="iframePerspective" checked="true" /> | |
| </div> | |
| </div> | |
| <div id="views"> | |
| <button value="1">View 1 - Laying</button> | |
| <button value="2">View 2 - Side</button> | |
| <button value="3">View 3 - Front</button> | |
| </div> | |
| <div id="linkBack" style="position:absolute;right:0px;bottom:0px;background-color:#333;margin:0;width:60px;padding:5px"><a href="http://www.f-rilling.com/projects/" target="_blank" style="font-size:14px;text-decoration:none;color:#fff;padding:0 0 0 5px;font-family:sans-serif">My Site</a></div> |
Pretty much only with CSS transforms and box-shadow, JS is only used for the controls.
A Pen by Felix Rilling on CodePen.
| /*Only needed for the controls*/ | |
| var phone = document.getElementById("phone_1"), | |
| iframe = document.getElementById("frame_1"); | |
| /*View*/ | |
| function updateView(view) { | |
| if (view) { | |
| phone.className = "phone view_" + view; | |
| } | |
| } | |
| /*Controls*/ | |
| function updateIframe() { | |
| iframe.src = document.getElementById("iframeURL").value; | |
| phone.style.width = document.getElementById("iframeWidth").value + "px"; | |
| phone.style.height = document.getElementById("iframeHeight").value + "px"; | |
| /*Idea by /u/aerosole*/ | |
| document.getElementById("wrapper").style.perspective = ( | |
| document.getElementById("iframePerspective").checked ? "1000px" : "none" | |
| ); | |
| } | |
| updateIframe(); | |
| /*Events*/ | |
| document.getElementById("controls").addEventListener("change", function() { | |
| updateIframe(); | |
| }); | |
| document.getElementById("views").addEventListener("click", function(evt) { | |
| updateView(evt.target.value); | |
| }); |
| @import url(https://fonts.googleapis.com/css?family=Open+Sans:400,600,300); | |
| body { | |
| font-family: 'Open Sans', sans-serif; | |
| background-color: #FFFAF6; | |
| } | |
| /*Basic Phone styling*/ | |
| .phone { | |
| border: 40px solid #ddd; | |
| border-width: 55px 7px; | |
| border-radius: 40px; | |
| margin: 50px auto; | |
| overflow: hidden; | |
| transition: all 0.5s ease; | |
| } | |
| .phone iframe { | |
| border: 0; | |
| width: 100%; | |
| height: 100%; | |
| } | |
| /*Different Perspectives*/ | |
| .phone.view_1 { | |
| transform: rotateX(50deg) rotateY(0deg) rotateZ(-50deg); | |
| box-shadow: -3px 3px 0 #BBB, -6px 6px 0 #BBB, -9px 9px 0 #BBB, -12px 12px 0 #BBB, -14px 10px 20px #666; | |
| } | |
| .phone.view_2 { | |
| transform: rotateX(0deg) rotateY(-60deg) rotateZ(0deg); | |
| box-shadow: 5px 1px 0 #BBB, 9px 2px 0 #BBB, 12px 3px 0 #BBB, 15px 4px 0 #BBB, 0 7px 20px #999; | |
| } | |
| .phone.view_3 { | |
| transform: rotateX(0deg) rotateY(0deg) rotateZ(0deg); | |
| box-shadow: 0px 3px 0 #BBB, 0px 4px 0 #BBB, 0px 5px 0 #BBB, 0px 7px 0 #BBB, 0px 10px 20px #666; | |
| } | |
| /*Controls*/ | |
| #controls { | |
| position: absolute; | |
| top: 20px; | |
| left: 20px; | |
| font-size: 0.9em; | |
| color: #333; | |
| } | |
| #controls div { | |
| margin: 10px; | |
| } | |
| #controls div label { | |
| width: 120px; | |
| display: block; | |
| float: left; | |
| } | |
| #views { | |
| position: absolute; | |
| top: 20px; | |
| right: 20px; | |
| width: 200px; | |
| } | |
| #views button { | |
| width: 198px; | |
| border: 1px solid #bbb; | |
| background-color: #fff; | |
| height: 40px; | |
| margin: 10px 0; | |
| color: #666; | |
| transition: all 0.2s; | |
| } | |
| #views button:hover { | |
| color: #444; | |
| background-color: #eee; | |
| } | |
| @media (max-width:900px) { | |
| #wrapper { | |
| transform: scale(0.8, 0.8); | |
| } | |
| } | |
| @media (max-width:700px) { | |
| #wrapper { | |
| transform: scale(0.6, 0.6); | |
| } | |
| } | |
| @media (max-width:500px) { | |
| #wrapper { | |
| transform: scale(0.4, 0.4); | |
| } | |
| } |