将一个 div 调整为小于其声明大小的尺寸?

13

有没有一种方法可以将div的大小调整为小于声明的高度和宽度?

我正在制作一个应用程序,在该应用程序中,用户可以调整div的大小并保存它。但是,当我稍后加载它并将其设置为用户上次设置的大小时,他们可以使div变得更大,但不能使其变得更小。

这是一个示例div:

.cls {
  border: solid 1px;
  width: 100px;
  height: 100px;
  resize: both;
  overflow: auto;   
}​

http://jsfiddle.net/FNXnD/

这个问题与之相同,但使用了GWT,并且似乎没有一个好的解决方案。


重新加载后,您如何设置其大小?您是设置元素的宽度/高度属性,还是设置元素的CSS?您不能简单地将保存的尺寸添加到元素的内联CSS中吗?即 <div style='width: "userSavedX"px; height: "userSavedY"px;'>blah, blah<div>(其中"userSavedX"和"userSavedY"被替换为数字) - enhzflep
1
我正在使用jQuery的.css()设置大小,它会将样式添加到内联中。问题是一旦设置了大小,我就无法拖动调整元素的大小为比设置的大小更小。 - chustar
6个回答

9
如果您想使用CSS3 UI调整大小功能,则取决于您的浏览器是否允许您将其缩小或放大超过声明的宽度或高度。在此链接中有详细信息。
浏览器可能会限制调整大小范围,例如在原始格式大小和足够大以包含所有元素内容之间。
例如,在Firefox中,您可以将其调整为小于声明的宽度或高度,而在Chrome中则不行。

2
又一个无用的CSS规范,万岁! - JCraine
Chrome 61+支持缩小可调整大小的元素。 - ZachB

4

我想对接受答案中Pfft所说的内容进行轻微修改。

如果您使用:active伪类而不是:hover,当您悬停在元素上时,它不会出现闪烁。那种闪烁真的很烦人。

div:active {
  width: 0;
  height: 0;
}

使用 :active,当单击元素时,它将被调整为高度:0,宽度:0,因此将显示一个小点,其中显示了1像素的边框,但是一旦用户开始调整大小,您会得到完全符合调整大小要求的内容。在每次后续调整大小时,没有任何故障,它完美地工作。
我发现这比使用hover要少烦人得多。感谢Pfft提供的上述回答,正是我正在寻找的,并引导我找到了自己略微改变的解决方案!
这是它的jsfiddle:http://jsfiddle.net/kronenbear/v4Lq5o09/1/

问题在于任何内部元素都无法接收点击事件,因为它们的父元素大小为0且未显示。 - atfornes

2

您请求一个解决方案来解决问题,或者至少想知道如何解决。我为您提供了一个简单的解决方案,可能需要一些工作;请注意这是一个解决方案,因此可能会包含一些问题。

.cls {
    width: 100px;
    height: 100px;
    resize: both;
    overflow: auto;
    border: 1px dotted #000;
}

.cls:hover {
    width: 1px;
    height: 1px;
}

更新的 fiddle:http://jsfiddle.net/FNXnD/1/

  • 注意:Chrome 和 Safari 可能会在将来的版本中更改 CSS3 的 resize 功能。

1
鼠标悬停时,div 闪烁! - Ashraf Bashir

1
或者您可以使用jQuery-UI来创建可调整大小的窗口。
我解决了在尝试使用jQuery ui resizable小部件与具有滚动溢出的div时遇到的一些问题。问题在于调整大小的手柄位于滚动条内部。
为了解决这个问题,我创建了三个嵌套在一起的div。
第一个是包装器,用于设置div的初始大小。
第二个是用于手柄的,其大小应设置为其父div(包装器div)的100%。您将需要调整z-index以将它们定位在最终滚动条上方。
第二个div还应包含可拖动的手柄div和窗口div,其中包含所有窗口内容。
可拖动的手柄div(.draggable)和窗口div(.window)都需要相对定位。这样它们就可以正确地彼此定位,而可拖动的手柄也不会覆盖您的滚动条。
.window div应缩放为父div的100%,就像之前的div一样。这个div将具有滚动溢出。现在,因为这等于100%的handles div,所以当您使用jQuery ui调整handles div的大小时,它也会调整此div的大小。
将可拖动的 div 的宽度设置为 100%,高度可以根据需要设定,但是增加的高度会将窗口 div 推下去,然后您需要给手柄 div 添加相同数量的 padding-bottom 以修复此问题。 您还需要将 handles div 的 overflow 设置为 visible。
在完成所有这些操作之后,添加所需的样式即可。很难解释,但我希望这有意义。以下是所有代码,并希望它能更好地解释。这绝对可以让您缩小窗口、移动 div,并且还可以使用滚动溢出与 div。
HTML:
<!DOCtype html>
<html lang="en">
<head>
    <title>Adjustable Window</title>
    <meta charset="utf-8">
    <link rel="stylesheet" type="text/css" href="../css/adjWindow.css">
    <link rel="stylesheet" type="text/css" href="../jquery-ui-1.11.4/jquery-ui.min.css">
    <script type="text/javascript" src="../js/jquery.min.js"></script>
    <script type="text/javascript" src="../jquery-ui-1.11.4/jquery-ui.min.js"></script>
    <script type="text/javascript" src="../js/adjWin.js"></script>
</head>
<body id="top">
   <div class="winWrap">
        <div class="handles">
            <div class="draggable"><p>Window Title</p></div>
            <div class="window">
                <div class="windowContent">
                </div>
            </div>
        </div>
    </div>
</body>
</html>

CSS

.winWrap {
    position: relative;
    width: 500px;
    height: 500px;
}
.draggable {
    position: relative;
    width: 100%;
    height: 20px;
    box-shadow: inset 0px 0px 6px rgba(0,0,0,0.9);
    background-color: rgba(255,255,255,0.5);
    text-align: center;
    z-index: 1;
}
.draggable p {
    padding: 2px;
    margin: 0px;
    cursor: default;
}
.handles {
    position: relative;
    width: 100%;
    height: 100%;
    padding-bottom: 20px;
    overflow: visible;
    box-shadow: 20px 15px 20px rgba(0,0,0,0.4);
    z-index: 1;
}
.window {
    position: relative;
    width: 100%;
    height: 100%;
    overflow: scroll;
    background-color: rgba(0,0,0,0.1);
    box-shadow: inset 0px 0px 10px rgba(0,0,0,0.7);
}
.windowContent{
    position: absolute;
}

使用可调整大小的小部件时,建议使用minHeight和minWidth选项,否则您的窗口将能够调整大小到几乎为零,并可能导致一些烦人的副作用,例如使div变得非常小,需要重新加载页面以单击调整大小的手柄。在我看来,这样做也更加专业。

对于可拖动的小部件,您需要针对要移动的整个div的包装器进行定位,然后将其句柄设置为我们放置在window div中的可拖动div。

/*global $, jQuery, alert*/
$(document).ready(function () {
    'use strict';
    $('.handles').resizable({minHeight: 100, minWidth: 100});
    $('.winWrap').draggable({handle: '.draggable'});
});

0
$('.cls').css('height', 200);
$(".cls").mouseup( function(){
var height = $(".cls").height();
var width = $(".cls").width();
if(height>=200){
$('.cls').css('height', 200);
}
if(width>=100){
$('.cls').css('width', 100);  
}
var
newdimensions="newheight="+height+"&"+"newwidth="+width;
});

这并不会在设置宽度/高度后使项目可调整大小。另外,我没有使用php或mysql。 - chustar
你说要保存它,所以我回答说将其存储在数据库中,因为没有数据库就无法保存。而且你说要保持div的宽度/高度小于声明的高度和宽度。你在CSS和JavaScript中声明了200像素的高度和100像素的宽度。 - Heart
我编辑了我的 JavaScript 并添加了一个功能,即用户不能更改高度和宽度,这两个参数应小于等于 200 像素和 100 像素。 - Heart
用户不能将高度和宽度更改为超过声明的高度和宽度。但是用户可以将其调整为小于声明的高度和宽度。 - Heart

-1
在 JavaScript 中使用 jQuery:
//get the current heigt and the width of the element
var h = $('.cls').height();
var w = $('.cls').width();
// i don'T know how you provide your nes size, but once you have in i a variable, you can just do
if(your_h > h) $('.cls').height(your_h);
if(your_w > w) $('.cls').width(your_w);

假设您的尺寸以PX为单位。

如果没有指定参数,Height()和width()将返回px大小。如果提供值,则会设置高度和宽度。如果您没有明确指定测量单位,默认情况下使用px。

在第二部分中,它只是检查新大小(your_x)是否大于原始大小,如果是,则调整大小,否则将忽略。

是的,jQuery将覆盖您的CSS规范;) 无论任何人,都可以使用更大或更小的值


谢谢,但这并不允许将项目调整为小于其设置尺寸的大小。 - chustar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接