Mudblazor - 在拖放区域内单击

Posted

技术标签:

【中文标题】Mudblazor - 在拖放区域内单击【英文标题】:Mudblazor - Click inside the zone of the drag and drop 【发布时间】:2021-11-25 03:51:24 【问题描述】:

我正在为 Blazor WebAssembly 使用一个名为 Mudblazor 的 CSS 框架。

我在拖放区域内添加了一个按钮,该按钮将删除已上传的每个图像。但是当我点击删除按钮时,我只会启动文件管理器。

问题是实际拖放区域设置为 position: absolute none。

有没有办法解决这个问题?

这个样子的例子。无法单击删除按钮。当我尝试点击删除按钮时会出现文件管理器。

CSS:

 .drag-drop-zone 
    display: flex;
    align-items: center;
    justify-content: center;
    transition: all .4s;
    /*        min-height: 400px;
*/ border: 3px dotted;
    min-height: 100px;
    border: 2px dashed rgb(0, 135, 247);


.drag-drop-input 
    position: absolute;
    width: 100%;
    height: 90%;
    opacity: 0;
    cursor: pointer;
    z-index: 2;


.drag-enter 
    box-shadow: var(--mud-elevation-10);


.list 
    padding: 2em;
    min-width: 100%;

剃须刀

<MudList Style="padding:2em;width:100%;" Dense="true">
@foreach (var file in fileNames)

    <MudListItem @key="@file">
        <MudChip Color="Color.Dark"
                 Style="width:60px; overflow:hidden;"
                 Text="@(file.Split(".").Last())" />
        @file <MudButton Color="Color.Error" OnClick="() => Remove(file)" Style="position:unset;">Remove</MudButton>
    </MudListItem>

删除方法:

    void Remove(string file)

    var ret = fileNames.FirstOrDefault(x => x.Contains(file));
    if (ret != null)
    
        fileNames.Remove(ret);
    

【问题讨论】:

忘记提及 Mudblazor 的链接:mudblazor.com 【参考方案1】:

我在使用 MudBlazor 主页的示例代码时遇到了同样的问题 https://mudblazor.com/components/fileupload#drag-and-drop-example

正如 Memetican 所说,.drag-drop-input 似乎覆盖了其他内容。我不知道我在做什么,所以我不会给出解释,但position: absolute; 部分引起了我的兴趣。阅读它here 导致我将其从absolute 更改为static。连同示例代码中的一些其他细微更改,我有以下似乎正在工作的内容

@page "/tools/csvimport"
@inject ISnackbar Snackbar
<style>
    .drag-drop-zone 
        display: flex;
        align-items: center;
        justify-content: center;
        transition: all .4s;
        height: 100%;
    

    .drag-drop-input 
        position: static;
        width: 100%;
        height: 100%;
        opacity: 0;
        cursor: pointer;
        z-index: 2;
    

    .drag-enter 
        box-shadow: var(--mud-elevation-10);
    

    .list 
        padding: 2em;
        min-width: 100%;
    
</style>

<MudGrid Justify="Justify.Center" Spacing="4">

    <MudItem xs="12" sm="12" md="6">
        <MudPaper @ondragenter="@(()=>_dragEnterStyle="drag-enter")"
                  @ondragleave="@(()=>_dragEnterStyle=null)"
                  @ondragend="@(()=>_dragEnterStyle=null)"
                  Class=@("drag-drop-zone "+ _dragEnterStyle)
                  MinHeight="200px">

            <InputFile OnChange="OnInputFileChanged" class="drag-drop-input" />

            @if (file is null)
            
                <MudText Typo="Typo.h6">Drag file here, or click to browse your files</MudText>
            
            else
            
                <MudChip Color="Color.Info">@file.Name</MudChip>
            


        </MudPaper>
        <MudGrid Justify="Justify.Center" Spacing="4" Class="mt-4">
            <MudItem>
                <MudButton OnClick="Upload" Disabled="@(file is null)" Color="Color.Primary" Variant="Variant.Filled">Upload</MudButton>
            </MudItem>
            <MudItem>
                <MudButton OnClick="@(() => file = null)" Disabled="@(file is null)" Color="Color.Error" Variant="Variant.Filled">Clear</MudButton>
            </MudItem>
        </MudGrid>
    </MudItem>

</MudGrid>
@code 
    string _dragEnterStyle;
    IBrowserFile file;

    void OnInputFileChanged(InputFileChangeEventArgs e)
    
        file = e.File;
    
    void Upload()
    
        //Upload the files here
        Snackbar.Configuration.PositionClass = Defaults.Classes.Position.TopCenter;
        Snackbar.Add("TODO: Upload " + file.Name, Severity.Normal);
    

【讨论】:

【参考方案2】:

我认为您遗漏了放置目标的代码,因为您的大多数 CSS 样式都没有被引用。

但是,您的放置目标似乎位于文件列表的顶部。请注意 CSS 中的 z-index...

.drag-drop-input 
    position: absolute;
    width: 100%;
    height: 90%;
    opacity: 0;
    cursor: pointer;
    z-index: 2; /* <== here */

这将创建一个玻璃窗格类型的效果。您可以看到您的文件列表和删除按钮,因为您有 opacity: 0; - 但是您无法与它们交互,因为您的放置目标在 z 顺序中位于它们上方。

html 页面想象成一堆重叠的矩形。鼠标交互只命中最顶层。

解决方案 1:(可行) 删除该 z-index,或将文件列表和按钮的 z-index 设置为高于放置目标。这应该可行,但是如果用户尝试将文件直接拖放到您的文件列表或删除按钮上,它可能会在某些浏览器上产生不良行为。

解决方案 2:(推荐)将文件列表和 删除 按钮移到放置目标之外。设计您的放置目标以完成其一项功能 - 接受文件放置和调用文件上传操作的鼠标单击。

【讨论】:

以上是关于Mudblazor - 在拖放区域内单击的主要内容,如果未能解决你的问题,请参考以下文章

Firefox 在拖放幽灵预览中不显示图像

拖放完成或取消时在拖放源中触发的事件

JavaFX在拖放完成后获取拖放目标文件夹

android在拖放时滚动

在拖放期间重绘

jquery html在拖放时复制