50

We have this group project and I was assigned to make a certain iframe resizable. I've been reading lots of forum posts since last week, and I found out that iframe itself can't be resizable.

Is there a way to make my iframe resizable?

jpyams
  • 4,030
  • 9
  • 41
  • 66
amielopez
  • 509
  • 1
  • 5
  • 7

8 Answers8

63

This can be done in pure CSS, like so:

iframe {
  height: 300px;
  width: 300px;
  resize: both;
  overflow: auto;
}

Set the height and width to the minimum size you want, it only seems to grow, not shrink.

Live example: https://jsfiddle.net/xpeLja5t/

This technique has good support in all major browsers except IE.

Vincent Scheib
  • 17,142
  • 9
  • 61
  • 77
Nicole Sullivan
  • 783
  • 6
  • 7
  • 10
    Does this solution still work? I have no luck with it. – Haru May 31 '16 at 02:40
  • @AndrewThreadgill This solution worked for me in Chrome 51. Are you seeing something different than what is presented in Nicole's support link? – AllInOne Jun 17 '16 at 17:07
  • I believe it is because I am using an external site in my iframe. – Haru Jun 17 '16 at 19:21
  • 4
    I tested with an `iframe[srcdoc]` created via [iframify](https://github.com/edenspiekermann/iframify): works with Chr 54 (where it can grow but not shrink, +1) but not Fx 49 :( Related [request feature on Bugzilla@Mozilla](https://bugzilla.mozilla.org/show_bug.cgi?id=680823) – FelipeAls Nov 09 '16 at 09:25
  • 3
    This works for Chrome and Safari. Does not work for Internet Explorer, Edge or Firefox (even though Firefox does support the resize property). – Ollie Williams Nov 01 '18 at 15:56
  • There's an open bug for Firefox about this https://bugzilla.mozilla.org/show_bug.cgi?id=680823 – Alex from Jitbit Feb 01 '19 at 22:20
  • 1
    Thanks to the new flexbox-feature [there now is a pure-CSS-solution](https://stackoverflow.com/a/60803488/490291) which works for Firefox and Chrome. – Tino Mar 22 '20 at 18:47
18

It took more than 1 hour to find something which led me to a working solution:

  • Pure CSS as it should be
  • For all modern browsers with full flexbox support, like Firefox, Chrome, etc.
  • Does not work for older browsers like IE10 and below, though

.resizer { display:flex; margin:0; padding:0; resize:both; overflow:hidden }
.resizer > .resized { flex-grow:1; margin:0; padding:0; border:0 }

.ugly { background:red; border:4px dashed black; }
<div class="resizer ugly">
  <iframe class="resized" src="https://wikipedia.org/"></iframe>
</div>

In Chrome this solution still has some issues at my side. Use Run code snippet and then Full Page (so it does not seem to work if the IFRAME is embedded in other IFRAMEs). Also the resize handle (in the right bottom corner) is shown a bit subtle, and resizing often stops to follow the mouse.

In Firefox you can resize the iframe now using pure CSS, too.

Wikipedia was the only URL I found which has no CSP against iframe-embedding yet. If they ever add one, the iframe becomes empty and your Browser's console will log the CSP error. In this case, please update my answer with some working URL. Thanks.

Tino
  • 9,583
  • 5
  • 55
  • 60
  • Thank you, this really works. Is there something similar for draggability? – user185953 Jan 19 '21 at 16:01
  • @user185953 IMHO not this easy. AFAICS dragging needs JavaScript (to receive the drag). As `IFRAME`s are interactive and receive all mouse events (like drag), you need something outside the `IFRAME`'s control (some additional drag-`DIV`). From JavaScript, drags of this drag-`DIV` then can be applied to the the resizer-`DIV` accordingly to simulate dragging. If the drag-`DIV` is made to (transparently) cover the whole `IFRAME` and is (in z-order) in front of the `IFRAME`, it can receive all the mouse events before the `IFRAME` (but you cannot interact with the `IFRAME` in that situation). – Tino Jan 21 '21 at 11:33
13

These steps will make an iframe resizable:

  1. Create a div for resizing. eg:

    <div class="resizable"></div>
    
  2. Apply the style tag for style of div.

    .ui-resizable-helper {
        border: 1px dotted gray;
    }
    .resizable {
        display: block;
        width: 400px;
        height: 400px;
        padding: 30px;
        border: 2px solid gray;
        overflow: hidden;
        position: relative;
    }
    iframe {
        width: 100%;
        height: 100%;
    }
    
  3. Include jQuery & jQuery UI

    <link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/start/jquery-ui.css"rel="stylesheet" />
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
    <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script>
    
  4. Execute Resizable

    $(function () {
        $(".resizable").resizable({
            animate: true,
            animateEasing: 'swing',
            animateDuration: 500
        });
    });
    
AbyxDev
  • 1,363
  • 16
  • 30
kuldeep raj
  • 163
  • 2
10

With jQuery UI...

HTML:

<div class="resizable" style="width: 200px; height: 200px;">
    <iframe src="http://www.example.com/" style="width: 100%; height: 100%;"></iframe>
</div>

JavaScript:

$(".resizable").resizable({
    start: function(event, ui) {
        ui.element.append($("<div/>", {
            id: "iframe-barrier",
            css: {
                position: "absolute",
                top: 0,
                right: 0,
                bottom: 0,
                left: 0,
                "z-index": 10
        }
        }));
    },
    stop: function(event, ui) {
        $("#iframe-barrier", ui.element).remove();
    },
    resize: function(event, ui) {
        $("iframe", ui.element).width(ui.size.width).height(ui.size.height);
    }
});

jsFiddle: http://jsfiddle.net/B5vHQ/97/

Explanation:

Since jQuery UI's resizable plugin won't work on an iframe directly, wrap the iframe in a div and resize the div instead. The resize event in the code above ensures that the iframe resizes to match the div.

There's an additional problem with this method, however - iframes don't pass mouse movement events to their parent element. To work around that, the start and stop events cover the iframe up with another element during the resize, so that the resizable plugin can track mouse movement correctly.

For some reason, giving the wrapper div an explicit size is necessary for the resizing to work. In most cases, that means that the iframe needs the same size set, so thatit matches the size of the div right from the start.

Vincent Scheib
  • 17,142
  • 9
  • 61
  • 77
Brilliand
  • 13,404
  • 6
  • 46
  • 58
  • 1
    +1 cant believe this is the only barrier solution and it didnt have any votes! this is a big deal for not "losing" track of the mouse when dragging too quickly over another iframe. thanks @Brilliand! – mothmonsterman Dec 17 '15 at 21:49
  • 1
    @happytimeharry I didn't actually solve the problem for multiple iframes interfering with each other - the barrier in my answer only prevents the one iframe from interfering with its own resizing. – Brilliand Jul 17 '17 at 17:28
7

In case you haven't found the solution yet, I've had success with:

Jquery:

$("#my-div-frame-wrapper").resizable({
    alsoResize : '#myframe'
});

HTML:

<div id="my-div-frame-wrapper">
    <iframe id="myframe"></iframe>
</div>

I hope it helps

KyleMit
  • 30,350
  • 66
  • 462
  • 664
Sthe
  • 2,575
  • 2
  • 31
  • 48
3

I found your solution:

HTML:

<div id="resizable" class="ui-widget-content" 
     style="border-style:solid; height:400px; width:400px">
    <h3 class="ui-widget-header">Resizable</h3>
    <iframe src="test.aspx" id="myfr" scrolling="no"
            frameborder="0" marginheight="0" marginwidth="0" >
        Your Browser Do not Support Iframe
    </iframe>
</div>

JQUERY:

$(function() {
    $("#resizable").resizable();

    $("#resizable").resizable({
        resize: function(event, ui) {
            $("#myfr").css({ "height": ui.size.height,"width":ui.size.width});
        }
    });
});
KyleMit
  • 30,350
  • 66
  • 462
  • 664
Mayur Borad
  • 1,295
  • 9
  • 23
2

The best solution I've found is to set the width and height of the iframe to 100% and put the iframe within a div tag. This is the basic solution you see with tools like CKEditor.

For an example, I have some jQuery dialogs that do just that on the Utah's Disclosures Site. If you click on a report or statement of or, you'll see a dialog that pops up with an iframe in it. Hope it helps.

uadrive
  • 1,249
  • 14
  • 23
0

very easy,

first -

add jquery and jquery-ui -

<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
<script src="http://code.jquery.com/ui/1.10.4/jquery-ui.js"></script>

then -

<script>
$(function() {
$( "#resizable" ).resizable();
});
</script>

last -

<div id="resizable" class="ui-widget-content">
<h3 class="ui-widget-header">Resizable</h3>
</div>

Its done!

<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>jQuery UI Resizable - Default functionality</title>
<link rel="stylesheet" href="http://code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css">
<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
<script src="http://code.jquery.com/ui/1.10.4/jquery-ui.js"></script>
<style>
#resizable { width: 150px; height: 150px; padding: 0.5em; }
#resizable h3 { text-align: center; margin: 0; }
</style>
<script>
$(function() {
$( "#resizable" ).resizable();
});
</script>
</head>
<body>
<div id="resizable" class="ui-widget-content">
<h3 class="ui-widget-header">Resizable</h3>
</div>
</body>
</html>

form http://jqueryui.com/resizable/

Vibhaas
  • 804
  • 7
  • 8