如何确定 HTML 用户输入的高度和宽度并告诉 gridster 相应地适应?

Posted

技术标签:

【中文标题】如何确定 HTML 用户输入的高度和宽度并告诉 gridster 相应地适应?【英文标题】:How to determine the height and width of HTML user input and tell gridster to fit accordingly? 【发布时间】:2015-06-29 22:52:27 【问题描述】:

我目前正在将 Gridster.js (http://gridster.net/) 与 CKEditor 结合使用。

一旦用户使用 CKEditor 保存他们的内容,该内容就会被放入小部件中。然而,小部件不会自动调整大小以适应内容,虽然用户可以自己调整大小,但用户群在按下保存的那一刻为他们完成会更方便。

我尝试了一些东西,但没有任何效果。我无法获取当前内容的大小,然后分别调整网格大小。

在我的代码中,我有两个值可以使用。 gridster 元素 (widget),以及将放入其中的值 (contents)。我必须确定contents 的高度。成功完成此操作后,我将能够确定获取 x 和 y 值的代码是否有效。

我当前的代码如下所示:

// Initialization of the gridster element.
// The base dimensions are relevant to understand how we 
// calculate the multipliers, later on.
gridster = $(".gridster > ul").gridster(
    widget_margins: [10, 10],
    widget_base_dimensions: [100, 50],
    draggable: 
        handle: 'header'
    ,
    resize: 
        enabled: true,
        max_size: [20, 10],
        min_size: [2, 1]
    
).data('gridster');

以及处理保存和调整大小的 javascript 类(相关部分):

// Saves the content from CKEditor to the gridster widget
this.save = function (data) 
    var lastContents = this.default_html + data + '</div>';

    $(this.editor).removeClass('gs-w-new');
    this.resize_widget(this.editor, lastContents);
    $(this.editor).html(lastContents);
    this.modal.modal('hide');
;

/* @TODO: resize_widget function */
// if the new content from ckeditor is larger than the 
// original size of the widget, we need to make it larger.
this.resize_widget = function(widgetId, contents) 

    var element = $('<div>')
        .addClass('fake-div-gs-w-resize')
        /*
        .fake-div-gs-w-resize 
            position: absolute;
            display: none;
            height: auto;
            width: auto;
            white-space: nowrap;
        
        */
        .css('display', 'block')
        .html(contents);

    var widget = $(widgetId);

    var elementWidth = $(element).width(), // I am expecting this to return the width of the content, but it returns 0.
        elementHeight = $(element).height(), // As you might imagine, this also returns 0.
        width = widget.width(),
        height = widget.height();

    $(element).css('display', 'none');

    console.log(widgetId, widget, width, height, elementWidth, elementHeight);

    // this code never gets past here, because elementHeight,Width returns 0.
    if (elementHeight > height || elementWidth > width) 

        var width_multiplier = 100, // data-x = 1 === width_multiplier px
            height_multiplier = 50; // from "widget_base_dimensions: [100, 50],"

        var x = Math.round(width / width_multiplier),
            y = Math.round(height / height_multiplier),
            eX = Math.ceil(elementWidth / width_multiplier),
            eY = Math.ceil(elementHeight / height_multiplier);

        console.log("setting to x:" + eX + ", y:" + eY + " with width:" + width + ", height:" + height);

        if (eX >= x && eY >= y)
            gridster.resize_widget(widget, eX, eY);
    

;

虽然我对确定尺寸的逻辑并不完全有信心;这个问题的主要焦点是确定 HTML 内容的大小,因为我从其他 SO 帖子中收集的内容似乎对我的情况没有帮助。

【问题讨论】:

我猜你调用 resize_widget 函数太早了!尝试在 this.save 方法结束后调用 this.resize_widget,就像回调一样!或者只是尝试将该线移低.. 【参考方案1】:

您需要将元素实际添加到 DOM,width()height() 函数才能工作。在您的示例中,该元素未添加到文档中。

以这个 JS Fiddle 为例 https://jsfiddle.net/y1yf1zzp/10/

【讨论】:

很有趣,非常感谢。这似乎工作得很好。【参考方案2】:

我遇到了同样的挑战,即出现在新图块内的动态内容导致溢出并出现在图块边界之外。我们将磁贴内容的“.scrollHeight”与 Zartus 的代码结合使用:

var contentHeight = $widgit.firstChild.scrollHeight;
var tileHeight = $widgit.firstChild.clientHeight;

【讨论】:

以上是关于如何确定 HTML 用户输入的高度和宽度并告诉 gridster 相应地适应?的主要内容,如果未能解决你的问题,请参考以下文章

前端基础:viewports理解、页面各种宽度理解

如何获取对象的高度和宽度?

Excel设置单元格的宽度、高度

如何在 HTML 中以毫米为单位给出表格的宽度和高度

Excel设置单元格的宽度、高度

两个宽度确定,高度根据内容自动伸缩的div,如何让高度相等。因为要做背景,边框等,两边齐了好看点。