详解HTML中的拖拽案例和难点分析

拖拽入门

拖拽是一种常见的交互行为,在HTML中通过使用拖拽相关的属性和事件可以实现元素的拖拽功能。下面我会详细解释HTML中拖拽的相关属性,以及提供一个例子来说明。

在HTML中,拖拽功能涉及以下几个主要的属性和事件:

  1. draggable属性:该属性用于定义元素是否可拖拽。将draggable属性设置为"true"表示元素可拖拽,设置为"false"表示元素不可拖拽。默认情况下,元素是不可拖拽的。

  2. ondragstart事件:该事件在拖拽开始时触发,通常用于设置被拖拽元素的数据传输。通过该事件,可以使用dataTransfer对象来设置拖拽数据。

  3. ondragover事件:该事件在拖拽元素经过可放置区域时触发。通常需要使用event.preventDefault()方法来阻止默认的拖拽行为。

  4. ondrop事件:该事件在拖拽元素被释放到可放置区域时触发。在该事件中,可以获取拖拽数据并执行相应的操作。

下面是一个示例,演示了如何使用HTML的拖拽功能:

<!DOCTYPE html>
<html>
<head><style>.dropzone {width: 200px;height: 200px;border: 2px dashed #ccc;padding: 20px;}.draggable {width: 100px;height: 100px;background-color: #f1f1f1;border: 1px solid #999;cursor: move;}</style>
</head>
<body><div class="dropzone" ondragover="event.preventDefault()" ondrop="drop(event)"><div class="draggable" draggable="true" ondragstart="drag(event)"></div></div><script>function drag(event) {event.dataTransfer.setData("text/plain", event.target.id);}function drop(event) {event.preventDefault();var data = event.dataTransfer.getData("text/plain");event.target.appendChild(document.getElementById(data));}</script>
</body>
</html>

在上述示例中,我们创建了一个可放置区域(.dropzone)和一个可拖拽元素(.draggable)。在.draggable元素上,我们设置了draggable属性为"true",并定义了ondragstart事件来设置拖拽数据。在.dropzone元素上,我们定义了ondragover事件来阻止默认的拖拽行为,并定义了ondrop事件来处理拖拽元素被放置的操作。

通过这个示例,当我们拖拽.draggable元素时,它会跟随鼠标移动。当释放鼠标按钮时,它会被放置到.dropzone元素中。

拖拽难点

当涉及到HTML中的拖拽功能时,可能会遇到一些难点。以下是一些常见的难点,并提供了具体的例子来说明。

1、拖拽元素的位置处理

在拖拽过程中,通常需要使拖拽元素跟随鼠标移动。这涉及到计算鼠标位置和相应地更新元素的位置。下面是一个例子:

<div id="draggable" draggable="true" style="position: absolute; top: 0; left: 0;">Drag me</div><script>var draggableElement = document.getElementById("draggable");var offsetX, offsetY;draggableElement.addEventListener("dragstart", function(event) {offsetX = event.offsetX;offsetY = event.offsetY;});draggableElement.addEventListener("drag", function(event) {var x = event.clientX - offsetX;var y = event.clientY - offsetY;draggableElement.style.left = x + "px";draggableElement.style.top = y + "px";});
</script>

在上述示例中,当拖拽开始时,我们记录了鼠标在拖拽元素内的偏移值(offsetX和offsetY)。然后,在拖拽过程中,通过计算当前鼠标位置和偏移值,更新拖拽元素的left和top样式属性,使其跟随鼠标移动。

2、拖拽过程中的样式变化

为了提供视觉反馈,可以在拖拽过程中更改拖拽元素的样式。例如,改变其透明度、添加阴影效果或改变背景颜色等。下面是一个例子:

<div id="draggable" draggable="true">Drag me</div><script>var draggableElement = document.getElementById("draggable");draggableElement.addEventListener("dragstart", function(event) {draggableElement.style.opacity = "0.5";draggableElement.style.backgroundColor = "red";});draggableElement.addEventListener("dragend", function(event) {draggableElement.style.opacity = "1";draggableElement.style.backgroundColor = "initial";});
</script>

在上述示例中,当拖拽开始时,我们通过修改opacity和backgroundColor属性来改变拖拽元素的透明度和背景颜色。当拖拽结束时,我们还原了元素的初始样式。

3、拖拽数据的传输

有时,在拖拽过程中需要传输一些数据。这可以通过使用dataTransfer对象来实现。下面是一个例子:

<div id="draggable" draggable="true">Drag me</div>
<div id="dropzone">Drop here</div><script>var draggableElement = document.getElementById("draggable");var dropzoneElement = document.getElementById("dropzone");draggableElement.addEventListener("dragstart", function(event) {event.dataTransfer.setData("text/plain", "Hello, world!");});dropzoneElement.addEventListener("dragover", function(event) {event.preventDefault();});dropzoneElement.addEventListener("drop", function(event) {event.preventDefault();var data = event.dataTransfer.getData("text/plain");console.log(data);});
</script>

在上述示例中,当拖拽开始时,我们使用event.dataTransfer.setData()方法设置了拖拽数据为"Hello, world!"。在drop事件中,我们使用event.dataTransfer.getData()方法获取拖拽数据并进行操作。

这些是HTML中拖拽功能可能遇到的一些难点。通过理解和应用相关的属性和事件,可以克服这些难点,并创建出丰富的拖拽交互效果。

丰富的拖拽效果

当涉及到拖拽交互时,有许多丰富的效果可以实现,以下是一些常见的例子:

1、拖拽排序

允许用户通过拖拽重新排序列表中的项。例如,您可以实现一个可以拖拽排序的任务列表或图片库。

<ul id="sortable-list"><li draggable="true">Item 1</li><li draggable="true">Item 2</li><li draggable="true">Item 3</li><li draggable="true">Item 4</li>
</ul>
var sortableList = document.getElementById("sortable-list");sortableList.addEventListener("dragstart", function(event) {event.dataTransfer.setData("text/plain", event.target.id);
});sortableList.addEventListener("dragover", function(event) {event.preventDefault();var target = event.target;if (target.tagName === "LI") {event.dataTransfer.dropEffect = "move";target.classList.add("dragover");}
});sortableList.addEventListener("dragleave", function(event) {var target = event.target;if (target.tagName === "LI") {target.classList.remove("dragover");}
});sortableList.addEventListener("drop", function(event) {event.preventDefault();var target = event.target;if (target.tagName === "LI") {var draggedItemId = event.dataTransfer.getData("text/plain");var draggedItem = document.getElementById(draggedItemId);// Reorder the itemsif (draggedItem && draggedItem !== target) {var parent = target.parentNode;var targetIndex = Array.prototype.indexOf.call(parent.children, target);var draggedIndex = Array.prototype.indexOf.call(parent.children, draggedItem);if (targetIndex > draggedIndex) {parent.insertBefore(draggedItem, target);} else {parent.insertBefore(draggedItem, target.nextSibling);}}target.classList.remove("dragover");}
});
li {cursor: move;
}li.dragover {background-color: lightgray;
}

在上述代码中,我们创建了一个可以拖拽排序的列表。当拖拽开始时,我们使用event.dataTransfer.setData()方法设置拖拽数据为被拖拽元素的ID。在dragover事件中,我们阻止默认行为,并根据鼠标位置和目标元素来确定放置效果,并添加相应的样式。在drop事件中,我们获取拖拽数据并重新排序列表项。

2、拖拽放大缩小

通过拖拽元素的边缘或角落,实现对元素的放大或缩小效果。这在图片编辑器或地图应用程序中很常见。

<div id="resizable-element" draggable="true" style="width: 200px; height: 200px; background-color: lightblue;"></div>
var resizableElement = document.getElementById("resizable-element");
var initialWidth, initialHeight;resizableElement.addEventListener("dragstart", function(event) {initialWidth = parseFloat(getComputedStyle(resizableElement).width);initialHeight = parseFloat(getComputedStyle(resizableElement).height);
});resizableElement.addEventListener("drag", function(event) {var deltaX = event.clientX - event.screenX;var deltaY = event.clientY - event.screenY;var newWidth = initialWidth + deltaX;var newHeight = initialHeight + deltaY;resizableElement.style.width = newWidth + "px";resizableElement.style.height = newHeight + "px";
});

在上述代码中,我们创建了一个可拖拽放大缩小的元素。在拖拽开始时,我们记录了元素的初始宽度和高度。在拖拽过程中,我们根据鼠标移动的距离调整元素的宽度和高度。

3、拖拽放置到容器

允许用户将拖拽元素放置到指定的容器中。例如,您可以创建一个可拖拽的购物车,用户可以将商品拖放到购物车中。

<div id="draggable-element" draggable="true">Drag me</div>
<div id="dropzone">Drop here</div>
var draggableElement = document.getElementById("draggable-element");
var dropzone = document.getElementById("dropzone");draggableElement.addEventListener("dragstart", function(event) {event.dataTransfer.setData("text/plain", event.target.id);
});dropzone.addEventListener("dragover", function(event) {event.preventDefault();event.dataTransfer.dropEffect = "move";dropzone.classList.add("dragover");
});dropzone.addEventListener("dragleave", function(event) {var dropzone = document.getElementById("dropzone");dropzone.classList.remove("dragover");
});dropzone.addEventListener("drop", function(event) {event.preventDefault();var draggedItemId = event.dataTransfer.getData("text/plain");var draggedItem = document.getElementById(draggedItemId);dropzone.appendChild(draggedItem);dropzone.classList.remove("dragover");
});
#dropzone {width: 200px;height: 200px;background-color: lightgray;
}#dropzone.dragover {background-color: lightblue;
}

在上述代码中,我们创建了一个可拖拽的元素和一个放置区域。在拖拽开始时,我们使用event.dataTransfer.setData()方法设置拖拽数据为被拖拽元素的ID。在dragover事件中,我们阻止默认行为,并添加相应的样式来指示可以放置。在drop事件中,我们获取拖拽数据并将被拖拽元素放置到放置区域中。

4、拖拽改变布局

通过拖拽元素的边缘或分隔线,实现改变布局的效果。例如,您可以创建一个可拖拽的面板,用户可以调整面板的大小或重新排列面板的位置。

<div id="panel1" draggable="true">Panel 1</div>
<div id="panel2" draggable="true">Panel 2</div>
<div id="panel3" draggable="true">Panel 3</div>
var panels = document.querySelectorAll("[draggable=true]");
var initialX, initialY;panels.forEach(function(panel) {panel.addEventListener("dragstart", function(event) {initialX = event.clientX;initialY = event.clientY;});panel.addEventListener("drag", function(event) {var deltaX = event.clientX - initialX;var deltaY = event.clientY - initialY;var newX = panel.offsetLeft + deltaX;var newY = panel.offsetTop + deltaY;panel.style.left = newX + "px";panel.style.top = newY + "px";initialX = event.clientX;initialY = event.clientY;});
});
div {position: absolute;background-color: lightblue;width: 200px;height: 200px;cursor: move;
}

在上述代码中,我们创建了可拖拽的面板。在拖拽开始时,我们记录了鼠标的初始位置。在拖拽过程中,我们根据鼠标移动的距离调整面板的位置,并更新初始位置。

5、拖拽文件上传

允许用户将文件拖拽到指定区域进行上传。这在文件管理器或图片上传功能中常见。

<div id="dropzone">Drop files here</div>
var dropzone = document.getElementById("dropzone");dropzone.addEventListener("dragover", function(event) {event.preventDefault();event.dataTransfer.dropEffect = "copy";dropzone.classList.add("dragover");
});dropzone.addEventListener("dragleave", function(event) {dropzone.classList.remove("dragover");
});dropzone.addEventListener("drop", function(event) {event.preventDefault();var files = event.dataTransfer.files;// Handle the dropped filesfor (var i = 0; i < files.length; i++) {var file = files[i];console.log("File name: " + file.name);console.log("File size: " + file.size + " bytes");console.log("File type: " + file.type);// Perform file upload or any other desired operation}dropzone.classList.remove("dragover");
});

在上述代码中,我们创建了一个可拖拽文件上传的区域。在dragover事件中,我们阻止默认行为,并设置拖放效果为复制,并添加相应的样式。在drop事件中,我们获取拖拽的文件列表,并可以在控制台中打印文件的名称、大小和类型等信息。您可以根据需求执行文件上传或其他操作。

6、拖拽切换视图

通过拖拽元素或手势,实现切换不同视图或页面的效果。这常见于图片浏览器或轮播图组件。

<div id="view1" draggable="true">View 1</div>
<div id="view2" draggable="true">View 2</div>
<div id="container"></div>
var view1 = document.getElementById("view1");
var view2 = document.getElementById("view2");
var container = document.getElementById("container");view1.addEventListener("dragstart", function(event) {event.dataTransfer.setData("text/plain", "view1");
});view2.addEventListener("dragstart", function(event) {event.dataTransfer.setData("text/plain", "view2");
});container.addEventListener("dragover", function(event) {event.preventDefault();event.dataTransfer.dropEffect = "move";container.classList.add("dragover");
});container.addEventListener("dragleave", function(event) {container.classList.remove("dragover");
});container.addEventListener("drop", function(event) {event.preventDefault();var draggedView = event.dataTransfer.getData("text/plain");// Switch views based on the dragged viewif (draggedView === "view1") {// Switch to View 1container.innerHTML = view1.outerHTML;} else if (draggedView === "view2") {// Switch to View 2container.innerHTML = view2.outerHTML;}container.classList.remove("dragover");
});

在上述代码中,我们创建了两个可拖拽的视图和一个容器。在拖拽开始时,我们使用event.dataTransfer.setData()方法设置拖拽数据为视图的标识符(例如"view1"和"view2")。在容器上的dragover事件中,我们阻止默认行为,并设置拖放效果为移动,并添加相应的样式。在drop事件中,我们获取拖拽数据并根据拖拽的视图切换容器的内容。

7、拖拽画布

通过拖拽画布或拖动手势,在一个大的画布或地图上进行导航。这在地图应用程序或可缩放的图像编辑器中常见。

<!DOCTYPE html>
<html>
<head><style>#canvas {width: 500px;height: 500px;border: 1px solid black;overflow: hidden;cursor: move;}</style>
</head>
<body><div id="canvas"><!-- 在这里放置地图或其他内容 --></div><script>var canvas = document.getElementById("canvas");var isDragging = false;var startX;var startY;canvas.addEventListener("mousedown", function(event) {isDragging = true;startX = event.clientX;startY = event.clientY;});canvas.addEventListener("mousemove", function(event) {if (isDragging) {var deltaX = event.clientX - startX;var deltaY = event.clientY - startY;canvas.scrollLeft -= deltaX;canvas.scrollTop -= deltaY;startX = event.clientX;startY = event.clientY;}});canvas.addEventListener("mouseup", function() {isDragging = false;});</script>
</body>
</html>

上述代码创建了一个带有固定大小的画布(<div id="canvas">),允许您通过拖拽鼠标来导航画布内容。当鼠标按下时记录起始位置,然后在鼠标移动期间根据鼠标的移动距离调整画布的滚动位置。当释放鼠标按钮时停止拖拽。您可以在<div id="canvas">中放置地图或其他可导航内容。

8、拖拽复制

通过拖拽元素并按下特定键(如Ctrl或Option/Alt),实现元素的复制效果。这在创建副本或拖拽创建新对象的应用中常见。

<!DOCTYPE html>
<html>
<head><style>.draggable {width: 100px;height: 100px;background-color: lightblue;margin: 10px;cursor: move;}.droppable {width: 200px;height: 200px;background-color: lightgray;}</style>
</head>
<body><div class="draggable" draggable="true">Drag Me</div><div class="droppable"></div><script>var draggable = document.querySelector(".draggable");var droppable = document.querySelector(".droppable");draggable.addEventListener("dragstart", function(event) {event.dataTransfer.setData("text/plain", "dragging");});droppable.addEventListener("dragover", function(event) {event.preventDefault();event.dataTransfer.dropEffect = "copy";droppable.classList.add("dragover");});droppable.addEventListener("dragleave", function() {droppable.classList.remove("dragover");});droppable.addEventListener("drop", function(event) {event.preventDefault();var data = event.dataTransfer.getData("text/plain");if (data === "dragging") {var clone = draggable.cloneNode(true);droppable.appendChild(clone);}droppable.classList.remove("dragover");});</script>
</body>
</html>

上述代码创建了一个可拖拽的元素(.draggable)和一个可放置的容器(.droppable)。当您拖拽元素时,按住鼠标并移动时,将显示拖动的效果。当您将拖拽元素放置到.droppable容器中时,会创建元素的副本。您可以按住Ctrl键(Windows / Linux)或Option/Alt键(Mac)来实现复制效果。

请注意,这只是一个基本的示例,您可以根据自己的需求进行修改和扩展。在实际应用中,您可能需要处理更复杂的逻辑和界面交互,并根据需要调整样式和布

<!DOCTYPE html>
<html><head><style>.draggable {width:100px;height:100px;background-color:lightblue;margin:10px;cursor:move;}Copy .droppable {width:200px;height:200px;background-color:lightgray;}</style></head><body><div class="draggable" draggable="true">拖拽我</div><div class="droppable"></div><script>var draggable = document.querySelector(".draggable");var droppable = document.querySelector(".droppable");draggable.addEventListener("dragstart",function(event) {event.dataTransfer.setData("text/plain", "dragging");});droppable.addEventListener("dragover",function(event) {event.preventDefault();event.dataTransfer.dropEffect = "copy";droppable.classList.add("dragover");});droppable.addEventListener("dragleave",function() {droppable.classList.remove("dragover");});droppable.addEventListener("drop",function(event) {event.preventDefault();var data = event.dataTransfer.getData("text/plain");if (data === "dragging") {var clone = draggable.cloneNode(true);droppable.appendChild(clone);}droppable.classList.remove("dragover");});</script></body></html>

上面的代码创建了一个可拖拽的元素(.draggable)和一个可放置的容器(.droppable)。通过设置draggable属性为true,使元素可拖拽。当您拖拽元素时,按住鼠标并移动时,会显示拖动的效果。当您将拖拽元素放置到.droppable容器中时,会创建元素的副本。这个示例还演示了通过按下特定键(Ctrl键)来实现元素的复制效果。

这些只是一些常见的拖拽交互效果的例子。实际上,您可以根据具体需求和 kreativity 进一步创造各种各样的交互效果。通过组合使用HTML中的拖拽属性和事件,结合JavaScript和CSS的强大功能,您可以实现非常丰富和多样化的拖拽交互体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/44797.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue中实现自动匹配搜索框内容 关键字高亮文字显示

实现效果如下: 1.首先需要给输入框进行双向绑定 2.拿到搜索的结果去渲染页面 将返回的结果和搜索的关键字进行比对 如果相同的 就变红 上代码 html部分 //输入框<div class"search"><div class"shuru"><input type"请输入要查询的…

Springboot + Vue ElementUI 实现MySQLPostgresql可视化

一、功能展示&#xff1a; PostgreSQL教程--实现类似于MySQL的show create table功能实现见末尾 效果如图&#xff1a; DB连接配置维护&#xff1a; Schema功能&#xff1a;集成Screw生成文档&#xff0c;导出库的表结构&#xff0c;导出表结构和数据 表对象操作&#xff1a;…

【Java】使用Apache POI识别PPT中的图片和文字,以及对应的大小、坐标、颜色、字体等

本文介绍如何使用Apache POI识别PPT中的图片和文字&#xff0c;获取图片的数据、大小、尺寸、坐标&#xff0c;以及获取文字的字体、大小、颜色、坐标。 官方文档&#xff1a;https://poi.apache.org/components/slideshow/xslf-cookbook.html 官方文档和网上的资料介绍的很少…

【Unity小技巧】Unity探究自制对象池和官方内置对象池(ObjectPool)的使用

文章目录 前言不使用对象池使用官方内置对象池应用 自制对象池总结源码参考完结 前言 对象池&#xff08;Object Pool&#xff09;是一种软件设计模式&#xff0c;用于管理和重用已创建的对象。在对象池中&#xff0c;一组预先创建的对象被维护在一个池中&#xff0c;并在需要时…

阿里云ECS服务器和轻量应用服务器区别?怎么选择?

阿里云轻量应用服务器和云服务器ECS有什么区别&#xff1f;ECS是专业级云服务器&#xff0c;轻量应用服务器是轻量级服务器&#xff0c;轻量服务器使用门槛更低&#xff0c;适合个人开发者或中小企业新手使用&#xff0c;可视化运维&#xff0c;云服务器ECS适合集群类、高可用、…

浅析DIX与DIF(T10 PI)

文章目录 概述DIF与DIX端到端数据保护 DIFDIF保护类型 SCSI设备支持DIFStandard INQUIRY DataExtended INQUIRY Data VPD pageSPT字段GRD_CHK、APP_CHK、REF_CHK字段 READ CAPACITY(16)响应信息 SCSI命令请求读命令请求写命令请求 DIF盘格式化相关参考 概述 DIF与DIX DIF&…

【机器学习6】数据预处理(三)——处理类别数据(有序数据和标称数据)

处理类别数据 &#x1f331;简要理解处理类别数据的重要性☘️类别数据的分类☘️方便研究——用pandas创建包含多种特征的数据集&#x1f340;映射有序特征&#x1f340;标称特征标签编码&#x1f340;标称特征的独热编码&#x1f331;独热编码的优缺点 &#x1f331;简要理解…

ListNode相关

目录 2. 链表相关题目 2.1 合并两个有序链表&#xff08;简单&#xff09;&#xff1a;递归 2.2 删除排序链表中的重复元素&#xff08;简单&#xff09;&#xff1a;一次遍历 2.3 两链表相加&#xff08;中等&#xff09;&#xff1a;递归 2.4 删除链表倒数第N个节点&…

MySQL 索引为什么使用 B+ 树,而不使用红黑树 / B 树 ?

面试官问 &#xff1a;索引为什么使用 B 树&#xff0c;而不使用 B 树&#xff0c;不使用红黑树呢 首先 B 树和 B 树 都是多叉搜索树&#xff0c;然后我们先来观察一下 B 树和 B 树的数据结构&#xff1a; B 树的数据结构实现 >> B 树的数据结构实现 >> 【B 树相…

2023国赛数学建模思路 - 案例:FPTree-频繁模式树算法

文章目录 算法介绍FP树表示法构建FP树实现代码 建模资料 ## 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 算法介绍 FP-Tree算法全称是FrequentPattern Tree算法&#xff0c;就是频繁模式树算法&#xff0c…

代码随想录算法训练营day39 | 62. 不同路径,63. 不同路径 II

目录 62. 不同路径 63. 不同路径 II 62. 不同路径 类型&#xff1a;动态规划 难度&#xff1a;medium 思路&#xff1a; 应用二维数组的动态规划&#xff0c;到达某个方格的方法数目&#xff0c;为这个方格的上一个方格和左一个方格的方法数目和。 需要先初始化第一行和第一…

a元素使用

a元素 超链接元素&#xff0c;href属性中指定的网址如果不是以https或者http开头的&#xff0c;那么都是一个相对网址&#xff0c;他的绝对路径目录是当前网址的绝对路径的目录部分 href – hyper(超级的) reference(引用) – 跳转地址&#xff0c;他可以跳转如下几个位置&…

08.SpringBoot请求相应

文章目录 1 请求1.1 Postman1.2 简单参数1.2.1 原始方式1.2.2 SpringBoot方式1.2.3 参数名不一致 1.3 实体参数1.3.1 简单实体对象1.3.2 复杂实体对象 1.4 数组集合参数1.4.1 数组1.4.2 集合 1.5 日期参数1.6 JSON参数1.7 路径参数 2 响应2.1 ResponseBody注解2.2 统一响应结果…

GAN!生成对抗网络GAN全维度介绍与实战

目录 一、引言1.1 生成对抗网络简介1.2 应用领域概览1.3 GAN的重要性 二、理论基础2.1 生成对抗网络的工作原理2.1.1 生成器生成过程 2.1.2 判别器判别过程 2.1.3 训练过程训练代码示例 2.1.4 平衡与收敛 2.2 数学背景2.2.1 损失函数生成器损失判别器损失 2.2.2 优化方法优化代…

收集的一些比较好的git网址

1、民间故事 https://github.com/folkstory/lingqiu/blob/master/%E4%BC%A0%E8%AF%B4%E9%83%A8%E5%88%86/%E4%BA%BA%E7%89%A9%E4%BC%A0%E8%AF%B4/%E2%80%9C%E6%B5%B7%E5%BA%95%E6%8D%9E%E6%9C%88%E2%80%9D%E7%9A%84%E6%AD%A6%E4%B8%BE.md 2、童话故事 https://gutenberg.org/c…

12. Docker可视化工具

目录 1、前言 2、Docker UI 2.1、部署Docker UI 2.2、管理容器 3、Portainer 3.1、部署Portainer 3.2、管理容器 3.3、添加远程Docker 4、Shipyard 1、前言 Docker 提供了命令行工具来管理 Docker 的镜像和运行 Docker 的容器。我们也可以使用图形工具来管理 Docker。…

【华为OD机试】GPU算力【2023 B卷|100分】

【华为OD机试】-真题 !!点这里!! 【华为OD机试】真题考点分类 !!点这里 !! 题目解析 为了充分发挥GPU算力,需要尽可能多的将任务交给GPU执行,现在有一个任务数组, 数组元素表示在这1秒内新增的任务个数且每秒都有新增任务。 假设GPU最多一次执行n个任务,一次执行耗时…

计算之魂思考题1.4赛跑问题

一、问题 假设由25名短跑者争夺比赛前三名&#xff0c;赛场上有5条赛道&#xff0c;一次可以有5名选手同时比赛。比赛不计时&#xff0c;只看相应名次。假设选手发挥稳定&#xff0c;也就是说如果约翰比张三跑得快&#xff0c;张三比凯莉跑得快&#xff0c;那么约翰一定比凯莉…

Three.js之几何体、高光材质、渲染器设置、gui

参考资料 阵列立方体和相机适配体验Threejs常见几何体简介…gui.js库(可视化改变三维场景) 知识点 注&#xff1a;基于Three.jsv0.155.0 长方体&#xff1a;oxGeometry球体&#xff1a;SphereGeometry圆柱&#xff1a;CylinderGeometry矩形平面&#xff1a;PlaneGeometry圆…

C# 观察者模式

一、概述 观察者模式是一种常用的设计模式&#xff0c;它属于行为型模式。在C#中&#xff0c;观察者模式通过定义一种一对多的依赖关系&#xff0c;使得当一个对象的状态发生变化时&#xff0c;所有依赖于它的对象都会得到通知并自动更新。这种模式可以实现松耦合&#xff0c;…