我正在 Office UI Fabric 的帮助下开发响应式设计自定义页面布局。这是我正在为 Office 365 中的 SharePoint 开发的解决方案 (WSP) 的一部分。
问题 问题是当一个库被添加到一个具有响应式布局的页面时,拖放上传器区域被错误地放置。它不遵循 Office UI Fabrics 或 Bootstrap 应用的规则。
- 问:那么如何将拖放上传器区域应用到正确的区域,即。在 SharePoint 的响应式页面布局内的文档库顶部?
部分解决问题的解决方案
- StackExchange SharePoint 网站上有一篇文章,但它只能部分解决问题。简短描述它建议在 DOM 中的 #s4-workspace 元素下方应用 html-div 元素(下面的片段)。这里也有描述。 如果页面上只有一个库需要修复,此修复程序会产生奇迹
<div class="ms-dnd-dropbox" id="ms-dnd-dropbox" style="display:none;">
<span class="ms-attractMode ms-noWrap" id="ms-dnd-dropboxText"
style="line-height: 324px;">Drop here...</span>
</div>
- 添加 CSS 属性。我注意到很有可能
left
从 DOM 中的 .ms-dnd-dropbox 元素继承属性。这会将保管箱区域相对于保管箱区域正确水平对齐。然而,同样需要修复的 top 属性不能通过相同的技术应用。为什么?没有把握。
以正确的水平对齐放置 Dropbox 区域:
.parentDivClass > .ms-dnd-dropbox{
left: inherit !important;
}
将保管箱区域放置在正确的水平对齐中,并具有一些外观不错的功能
.ms-dnd-dropbox{
left: inherit !important;
top: inherit !important;
position: relative !important;
}
或者
.ms-dnd-dropbox{
left: inherit !important;
top: inherit !important;
position: absolute !important;
}
- 在 JavaScript 的帮助下,可以操作保管箱区域。代码如下。然而,这很好用,除了 sharepoint dragdrop.js 实际上比这个脚本执行得更快。即使两个脚本都使用 eventhandler
dragenter
。结果是,如果用户快速将文档拖到窗口中的 Dropbox 区域,首先会被错误地放置,然后,当文档window
随着 Dropbox 区域移动时,会非常正确地放置。这里唯一的问题是,由于 sharepoint 脚本在我看到的dragenter
事件之前执行,所以保管箱区域放置得不好。我的想法可能有一些错误,但如果是这种情况,请解释为什么会发生这种情况。
这种方式也仅在响应式布局处于“多列视图”时才有效,一旦对于较小的设备,列彼此下方下降,放置在最右边列中的所有库将被放置在正确位置下方约 1000 像素处。然而,这可能是可以接受的,因为很难想象为什么要将拖放功能应用于小型设备。
var topCalculation = 0;
var calculationsArray = [];
var oldValuesArray = [];
$(window).resize(function () {
if (calculationsArray.length > 0) {
calculationsArray = [];
var i = 0;
$(".ms-dnd-dropbox").each(function(i){
$(this).css("top", oldValuesArray[i]);
});
}
});
$(window).on("dragenter", function () {
alert(calculationsArray.length);
if (calculationsArray.length === 0) {
$(".ms-dnd-dropbox").each(function (e) {
topCalculation = $(this).position().top;
oldValuesArray.push(topCalculation);
topCalculation = (topCalculation - 120);
calculationsArray.push(topCalculation);
$(this).css("top", topCalculation);
});
} else {
var i = 0;
$(".ms-dnd-dropbox").each(function () {
$(this).css("top", calculationsArray[i]);
i++
});
}
});
.ms-dnd-dropbox {
position: absolute;
height: 100px;
width: 100px;
}
<div class="ms-dnd-dropbox" style="left: 101px; top: 150px; background-color: red;"></div>
<div class="ms-dnd-dropbox" style="left: 202px; top: 250px; background-color: blue;"></div>
<div class="ms-dnd-dropbox" style="left: 203px; top: 450px; background-color: green;"></div>