
背景
<p>鼠标拖拽元素移动,算是一个稍微有点点复杂的交互。 <p>而在本文,我们就将打破常规,向大家介绍一种超强的仅仅使用纯 CSS 就能够实现的鼠标点击拖拽效果。【推荐学习:css视频教程】 <p>在之前的这篇文章中 -- 不可思议的纯 CSS 实现鼠标跟随,我们介绍了非常多有意思的纯 CSS 的鼠标跟随效果,像是这样: <p>
鼠标点击拖拽跟随效果
<p>OK,什么意思呢?我们先来看一个最最简单的效果示意图,实现点击一个元素,能够拖动元素进行移动的效果: <p>
- <p>首先拖拽元素过程,可以任意将元素进行移动
- <p>然后放置元素,让元素停留在另外一个地方
resize
属性。以及,配合通过构建一种巧妙的布局,去解决可能会遇到的各种难题。
使用 resize,构建可拖拽改变大小的元素
<p>首先,我们利用resize
属性来实现一个可改变大小的元素。
<p>什么是 resize
呢?根据 MDN -- resize:该 CSS 属性允许你控制一个元素的可调整大小性。
<p>其 CSS 语法如下所示:
{ /* Keyword values */ resize: none; resize: both; resize: horizontal; resize: vertical; resize: block; resize: inline; }<p>简单解释一下:
-
resize: none
:元素不能被用户缩放 -
resize: both
:允许用户在水平和垂直方向上调整元素的大小 -
resize: horizontal
:允许用户在水平方向上调整元素的大小 -
resize: vertical
:允许用户在垂直方向上调整元素的大小 -
resize: block
:根据书写模式(writing-mode)和方向值(direction),元素显示允许用户在块方向上(block)水平或垂直调整元素大小的机制。 -
resize: inline
:根据书写模式(writing-mode)和方向值(direction),元素显示一种机制,允许用户在内联方向上(inline)水平方向或垂直方向调整元素的大小。
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. A aut qui labore rerum placeat similique hic consequatur tempore doloribus aliquid alias, nobis voluptates. Perferendis, voluptate placeat esse soluta deleniti id!</p>
p { width: 200px; height: 200px; resize: horizontal; overflow: scroll; }<p>这里,我们设置了一个长宽为
200px
的 <p>
为横向可拖拽改变宽度。效果如下:
<p>
-
resize
的生效,需要配合overflow: scroll
,当然,准确的说法是,overflow
不是visible
,或者可以直接作用于替换元素譬如图像、<video>
及<iframe>
、<textarea>
等 - 我们可以通过
resize
的horizontal
、vertical
、both
来设置横向拖动、纵向拖动、横向纵向皆可拖动。 - 可以配合容器的
max-width
、min-width
、max-height
、min-height
限制可拖拽改变的一个范围
resize
还有所疑惑,或者想了解更多 resize 的有趣用法,可以看看我的这篇文章:CSS 奇思妙想 | 使用 resize 实现强大的图片拖拽切换预览功能。
将 resize 应用到本文实例中
<p>OK,接下来,我们将 resize 实际运用到我们本文的例子中去,首先,我们先简单实现一个 DIV:<div class="g-resize"></div>
.g-resize { width: 100px; height: 100px; border: 1px solid deeppink; }<p>如下,非常普通,没有什么特别的: <p>

resize: both
以及 overflow: scroll
,此时,这个元素的大小就通过元素右下角的 ICON 进行拖动改变。
<p>简单修改下我们的 CSS 代码:
.g-resize { width: 100px; height: 100px; border: 1px solid deeppink; resize: both; overflow: scroll; }<p>这样,我们就得到了一个灵活可以拖动的元素: <p>

<div class="g-resize"></div>
.g-resize { position: relative; width: 20px; height: 20px; resize: both; overflow: scroll; } .g-resize::before { content: ""; position: absolute; bottom: 0; right: 0; width: 20px; height: 20px; border-radius: 50%; background: deeppink; }<p>我们利用元素的伪元素实现了一个小球,放置在容器的右下角看看效果: <p>

resize: both
的边框隐藏呢?那么效果就会是这样:
<p>
resize
的元素的这个 ICON:
<p>
::-webkit-resizer
,设置这个 ICON 的隐藏。
<p>根据 MDN - ::-webkit-resizer,它属于整体的滚动条伪类样式家族中的一员。
<p>其中 ::-webkit-resizer
可以控制出现在某些元素底角的可拖动调整大小的滑块的样式。
<p>所以,这里我就利用这个伪类:
.g-resize { position: relative; width: 20px; height: 20px; resize: both; overflow: scroll; } .g-resize::before { content: ""; position: absolute; bottom: 0; right: 0; width: 20px; height: 20px; border-radius: 50%; background: deeppink; } .g-resize::-webkit-resizer { background-color: transparent; }<p>这样,这里的核心在于利用了
.g-resize::-webkit-resizer
中的 background-color: transparent
,将滑块的颜色设置为了透明色。我们就得到了与文章一开始,一模一样的效果:
<p>
解决溢出被裁剪问题
<p>当然,这里有个很致命的问题,如果需要移动的内容,远比设置了resize
的容器要大,或者其初始位置不在该容器内,超出了的部分因为设置了 overflow: scroll
,将无法看到。
<p>因此上述方案存在比较大的缺陷。
<p>举个例子,假设我们需要被拖动的元素不再是一个有这样一个简单的结构:
<div class="g-content"></div>
.g-content { width: 100px; height: 100px; background: black; pointer-event: none; &::before { content: ""; position: absolute; width: 20px; height: 20px; background: yellow; border-radius: 50%; }<p>而像是这样,是一个更为复杂的布局内容展示(当然下面展示的也比较简单,实际中可以想象成任意复杂结构内容): <p>

g-resize
中:
<p>那么就会因为设置了<div class="g-content"></div>
overflow: scroll
的原因,将完全看不到,只剩下一小块:
<p>
<p>解释一下上述代码,其中:<div class="g-resize"></div> <div class="g-content"></div>
- <p>
g-container
设置为绝对定位加上display: inline-block
,这样其盒子大小就可以由内部正常流式布局盒子的大小撑开 - <p>
g-resize
设置为position: relative 并且
设置resize
,负责提供一个可拖动大小元素,在这个元素的变化过程中,就能动态改变父容器的高宽 - <p>
g-content
实际内容盒子,通过position: absolute
定位到容器的右下角即可
.g-container { position: absolute; display: inline-block; } .g-resize { content: ""; position: relative; width: 20px; height: 20px; border-radius: 50%; resize: both; overflow: scroll; z-index: 1; } .g-content { position: absolute; bottom: -80px; right: -80px; width: 100px; height: 100px; background: black; pointer-event: none; &::before { content: ""; position: absolute; width: 20px; height: 20px; background: yellow; border-radius: 50%; transition: .3s; } } .g-container:hover .g-content::before { transform: scale(1.1); box-shadow: -2px 2px 4px -4px #333, -4px 4px 8px -4px #333; } .g-resize::-webkit-resizer { background-color: transparent; }<p>下图中,你看到的所有元素,都只是
g-content
呈现出来的元素,整个效果就是这样:
<p>
- <p>红色边框表示整个
g-container
的大小 - <p>用蓝色矩形表示设置了
g-resize
元素的大小 - <p>关掉
::-webkit-resizer
的透明设置,展示出 resize 框的可拖拽 ICON
.g-container { border: 3px solid red; } .g-resize { content: ""; background: blue; resize: both; overflow: scroll; } .g-resize::-webkit-resizer { // background-color: transparent; }<p>看看这个图,整个原理基本就比较清晰的浮现了出来: <p>

<p>完整的原理代码,你可以戳这里:CodePen Demo -- Pure CSS Auto Drag Demo
实际应用
<p>OK,用了比较大篇幅对原理进行了描述。下面我们举一个实际的应用场景。使用上述技巧制作的可拖动便签贴。灵感来自 -- scottkellum。 <p>代码也不多,如果你了解了上面的内容,下面的代码将非常好理解:<p>完整的 CSS 代码如下:<div class="g-resize"></div>Lorem ipsum dolor sit amet consectetur?
body { position: relative; padding: 10px; background: url("背景图"); background-size: cover; } .g-container { position: absolute; display: inline-block; } .g-resize { content: ""; position: relative; width: 20px; height: 20px; resize: both; overflow: scroll; z-index: 1; } .g-content { position: absolute; bottom: -160px; right: -180px; color: rgba(#000, 0.8); background-image: linear-gradient( 160deg, rgb(255, 222, 30) 50%, rgb(255, 250, 80) ); width: 200px; height: 180px; pointer-event: none; text-align: center; font-family: "marker felt", "comic sans ms", sans-serif; font-size: 24px; line-height: 1.3; padding: 1em; box-sizing: border-box; &:before { content: ""; position: absolute; width: 20px; height: 20px; top: 0; left: 0; border-radius: 50%; background-image: radial-gradient( at 60% 30%, #f99, red 20%, rgb(180, 8, 0) ); background-position: 20% 10%; cursor: pointer; pointer-events: none; transform: scale(0.8); box-shadow: -5px 10px 3px -8.5px #000, -1px 7px 12px -5px #000; transition: all 0.3s ease; transform: scale(0.8); } } .g-container:hover .g-content::before { transform: scale(0.9); box-shadow: -5px 10px 6px -8.5px #000, -1px 7px 16px -4px #000; } .g-resize::-webkit-resizer { background-color: transparent; }<p>我们通过上述的技巧,实现了一个仅仅使用 CSS 实现的自由拖拽的便签贴。我们可以自由的将其拖拽到任意地方。看看效果: <p>

contenteditable
。
<p>contenteditable
是一个 HTML TAG 的属性,表示元素是否可被用户编辑。如果可以,浏览器会修改元素的部件以允许编辑。
<p>简单修改一下 DOM 结构:
<p>此时,元素不仅可以被拖动,甚至可以被重写,感受一下: <p><div class="g-resize"></div>Lorem ipsum dolor sit amet consectetur?

最后
<p>基于resize
这个 CSS 属性,其实还有很多有意思的用法。譬如我之前使用了 Resize 实现了一个图片切换预览的功能:CSS 奇思妙想 | 使用 resize 实现强大的图片拖拽切换预览功能 可以一并看看,相信能碰撞出更多火花。
<p>原文地址:https://www.cnblogs.com/coco1s/p/16774696.html<p>(学习视频分享:web前端)
<p>作者:ChokCoco
以上是巧用纯CSS实现鼠标点击拖拽效果,让交互更加生动!的详细内容。更多信息请关注PHP中文网其他相关文章!

具有CSS的自定义光标很棒,但是我们可以将JavaScript提升到一个新的水平。使用JavaScript,我们可以在光标状态之间过渡,将动态文本放置在光标中,应用复杂的动画并应用过滤器。

互动CSS动画和元素相互启动的元素在2025年似乎更合理。虽然不需要在CSS中实施乒乓球,但CSS的灵活性和力量的增加,可以怀疑Lee&Aver Lee&Aver Lee有一天将是一场

有关利用CSS背景滤波器属性来样式用户界面的提示和技巧。您将学习如何在多个元素之间进行背景过滤器,并将它们与其他CSS图形效果集成在一起以创建精心设计的设计。

好吧,事实证明,SVG的内置动画功能从未按计划进行弃用。当然,CSS和JavaScript具有承载负载的能力,但是很高兴知道Smil并没有像以前那样死在水中

是的,让#039;跳上文字包装:Safari Technology Preview In Pretty Landing!但是请注意,它与在铬浏览器中的工作方式不同。

此CSS-tricks更新了,重点介绍了年鉴,最近的播客出现,新的CSS计数器指南以及增加了几位新作者,这些新作者贡献了有价值的内容。

在大多数情况下,人们展示了@Apply的@Apply功能,其中包括Tailwind的单个property实用程序之一(会改变单个CSS声明)。当以这种方式展示时,@Apply听起来似乎很有希望。如此明显


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

SublimeText3汉化版
中文版,非常好用

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),