将 "Dialog" 小部件的宽度设置为 Vaadin 14 中页面的百分比

Set width of "Dialog" widget to a percentage of the page in Vaadin 14

在 Vaadin 14 中,当通过 px (CSS virtual "pixels") 指定宽度和高度时,Dialog 小部件可以正确打开。

Dialog dialog = new Dialog();
dialog.setCloseOnEsc( true );
dialog.setCloseOnOutsideClick( true );
dialog.add( new Label( "whatever" ) );
dialog.setWidth( "500px" );                //   width
dialog.setHeight( "700px" );               //   height

不幸的是,将 500px 更改为 80%:

dialog.setWidth( "80%" );                  //   width as percentage (%)
dialog.setHeight( "700px" );               //   height

我希望对话框现在占据浏览器的大部分 windows 宽度。我的看法恰恰相反。导致对话框的宽度大约 仅为 window 的三分之一 而不是 80%。并且宽度是固定的,不会随着用户调整浏览器大小而改变window.

➥ 如何让 Dialog 填充大部分但不是全部浏览器 window,并根据用户 grows/shrinks 和 window 动态调整大小' s width/height?


例子

这是一个完整的示例应用程序,它基于 Vaadin.com 网站提供的 "plain Java Servlet" 入门项目。

package work.basil.example.dialog_by_percent;

import com.vaadin.flow.component.button.Button;
import com.vaadin.flow.component.dialog.Dialog;
import com.vaadin.flow.component.html.Label;
import com.vaadin.flow.component.notification.Notification;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.router.Route;
import com.vaadin.flow.server.PWA;

/**
 * The main view contains a button and a click listener.
 */
@Route ( "" )
@PWA ( name = "Project Base for Vaadin", shortName = "Project Base" )
public class MainView extends VerticalLayout
{

    public MainView ( )
    {
        Button buttonPx = new Button( "Dialog by px" ,
                event -> this.dialogByPx()
        );

        Button buttonPercentage = new Button( "Dialog by px" ,
                event -> this.dialogByPercentage()
        );

        add( buttonPx , buttonPercentage );
    }

    private void dialogByPx ( )
    {
        Dialog dialog = new Dialog();
        dialog.setCloseOnEsc( true );
        dialog.setCloseOnOutsideClick( true );
        dialog.add( new Label( "px" ) );
        dialog.setWidth( "500px" );                //   width
        dialog.setHeight( "700px" );               //   height
        dialog.open();
    }

    private void dialogByPercentage ( )
    {
        Dialog dialog = new Dialog();
        dialog.setCloseOnEsc( true );
        dialog.setCloseOnOutsideClick( true );
        dialog.add( new Label( "percentage (%)" ) );
        dialog.setWidth( "80%" );                  //   width
        dialog.setHeight( "700px" );               //   height
        dialog.open();
    }
}

当运行.

dialog.setWidth( "500px" )

dialog.setWidth( "80%" )

How can I get a Dialog to fill most but not all of the browser window, and be dynamic resized as the user grows/shrinks the window's width/height?

通过使用 CSS 将 width/height 设置为 vaadin-dialog-overlayoverlay 部分。

更长的版本


您看到的行为是样式应用于 flow-component-renderer 内的 div 的结果,而不是人们预期的 overlay 部分。相关门票为:

如果您在 DevTools 中检查具有固定宽度的对话框,您会注意到对话框本身实际上更宽。

正确(我的意思是它是正确的,但不是预期的)方法是通过 css 使用来设置对话框的 overlay 部分的样式:

[part="overlay"]{
    width:80%;
}

@CssImport(
    value= "./styles/dialogOverlay.css", 
    themeFor = "vaadin-dialog-overlay"
)

之后,宽度达到了预期的 80%。我希望上面的截图能更好地说明问题: