音效素材网提供各类素材,打造精品素材网站!

站内导航 站长工具 投稿中心 手机访问

音效素材

纯 CSS 实现拖拽效果的代码
日期:2021-09-05 09:27:52   来源:脚本之家

发挥你的想象,CSS也能实现拖拽效果。

一、拖拽效果示例

这是移动端很常见的一个效果,可以按住拖来拖去,比如下面的 起点中文网 [1] 触屏版:

纯 CSS 实现拖拽效果的代码

这类效果用JS可以很容易实现,无非就是多了一些计算,多考虑了一些临界场景,然后代码量也多了一些。不过,经过我的一番脑洞,发现CSS也能几乎实现这一效果,接着往下看。

二、CSS实现原理

在传统 web 中,页面滚动是一个很常见交互,操作上就是 利用鼠标滚轮或者直接拖动滚动条 。但是,移动端可不一样, 直接用手指拖动页面就可以滚动了。 通常页面是要么垂直方向滚动,要么水平方向滚动, 如果两个方向都可以滚动呢? 例如

.dragbox{
  width: 300px;
  height: 300px;
  overflow: auto
}
.dragcon{
  width: 500px;
  height: 500px;
}

只需要内部元素宽高都大于容器就实现两个方向的滚动了(记得设置 overflow:auto ),示意如下

纯 CSS 实现拖拽效果的代码

一般情况下,鼠标滚轮只能同时滚动一个方向(按住 Shift 可以滚动另一方向),但是移动端可以 直接拖着内容任意滚动 ,如下所示

现在,在内容中间添加一个元素,跟随内容区域一起滚动

纯 CSS 实现拖拽效果的代码

接下来,把后面的文本隐藏起来

纯 CSS 实现拖拽效果的代码

是不是有点 拖拽 的味道了?原理就是这么简单!

三、CSS实现细节

首先确定拖拽目标与拖拽容器的尺寸关系,假设拖拽目标的尺寸是 w * h ,那么很容易得出的尺寸关系为: 内部尺寸是容器的2倍减去拖拽目标的尺寸

.dragbox{
  width: 100%;
  height: 100%;
}
.dragcon{
  width: calc(200% - w);
  height: calc(200% - h);
}

用一张动图描述如下(中间的橙色块块表示拖拽目标)

纯 CSS 实现拖拽效果的代码

四、CSS实现布局

接下来需要把这个特性加入到页面当中,这里列举了两种布局

1. fixed 定位

现在直接把刚才的布局添加到页面上,并添加 fixed 定位

<body>
  ...页面上的其他元素
  <div class=“dragbox”>
    <div class=“dragcon”></div>
    <div class=“ball”></div> <!--拖拽元素-->
  </div>
</body>

关键样式如下

.dragbox{
  position: fixed;
  left: 0;
  top: 0;
  right: 0;
  bottom: 0;
  overflow: auto
}

层级示意关系如下

纯 CSS 实现拖拽效果的代码

这样一来, dragbox 肯定把页面原有的部分遮挡了,所以还需要添加 pointer-events: none; 同时在拖拽时添加 pointer-events: all

.dragbox{
  /*...*/
  pointer-events: none;
}
.ball{
  /*...*/
  pointer-events: all;
}
.dragbox.active{
  /*...*/
  pointer-events: all;
}

借助 JS 可以在按下时触发外层容器滚动

ball.addEventListener('touchstart',(ev)=>{
   dragbox.classList.add('active');
})
document.addEventListener('touchend',()=>{
   dragbox.classList.remove('active');
})

实际效果如下

纯 CSS 实现拖拽效果的代码

完整代码可访问https://codepen.io/xboxyan/pen/PobwxBK(PC访问请打开移动端模式)

也可直接扫描以下二维码

纯 CSS 实现拖拽效果的代码

1. absolute 定位 + 层级

前面一种布局由于 fixed 定位层级的影响,不得不借助 JS 来动态改变容器的状态,有没有什么办法可以实现 既可以拖拽,又不影响原有页面 呢?下面来看这一种布局,用到了 ab s olute 定位

这里需要对原有页面包裹一层 div 容器,如下

<body>
  <div class=“dragbox”>
    <div class=“dragcon”></div>
    <div class=“ball”></div>
  </div>
  <div class=“body”> <!--单独用一层实现页面滚动-->
    ...页面上的其他元素
  </div>
</body>

关键样式如下

.dragbox{
  position: absolute;
  width: 100%;
  height: 100%;
  overflow: auto;
}
.body{
  position: relative;
  height: 100%;
  overflow: auto;
}
.ball{
  position: relative;
  z-index: 10;  /*拖拽目标的层级设置高一点*/
}

现在层级关系就变成了这样

纯 CSS 实现拖拽效果的代码

这里原先页面内容在层级上处于 dragbox拖拽目标 之间,所以在拖拽时也不会影响到原有页面的滚动, 无需任何 JS 处理

纯 CSS 实现拖拽效果的代码

完整代码可访问https://codepen.io/xboxyan/pen/bGBNQxL(PC访问请打开移动端模式)

也可直接扫描以下二维码

纯 CSS 实现拖拽效果的代码

提示:上面两种布局方式,第一种方式适应性更好,不影响现有项目;第二种体验更好,但是会使用 div 作为页面滚动容器,会对页面结构做一定的改动,可以根据实际情况自行选择。

五、CSS实现其他功能

1. 吸附功能

很多时候,在拖拽结束时需要让它自动吸附在边缘,就如同文章开头的示意图一样。那么,通过吸附,可以联想到什么属性呢?

答案就是 CSS Scroll Snap [2]

<body>
  ...页面上的其他元素
  <div class=“dragbox”>
    <div class=“dragcon”>A</div>
    <div class=“dragcon”>B</div>
    <div class=“ball”></div>
  </div>
</body>

下面是关键样式

.dragbox{
  ...
  scroll-snap-type: x mandatory;
}
.dragcon{
  scroll-snap-align: start;
}

实际效果如下

纯 CSS 实现拖拽效果的代码

完整代码可访问https://codepen.io/xboxyan/pen/XWNJyPw(PC访问请打开移动端模式)

也可直接扫描以下二维码

1. 设置初始位置

默认情况下,拖拽目标是唯有右下角的,如何位于左下角呢?很简单,这里拖拽是滚动容器实现的,所以只 需要改变 scrollLeft 或者 scrollTop 即可

dragbox.scrollLeft = 999;
dragbox.scrollTop = 999;

除此之外,也可以采用纯 HTML 方式实现, 利用元素的 autofocus 自动聚焦到可视范围的特性

<div class=“dragcon">
  ...
  <button class="pos" autofocus></button> <!--添加一个自动聚焦的元素-->
</div>

比如你希望初始位置在 左上角 ,那么添加一个 右下角 的自动聚焦元素就可以了(当然还需要设置透明度等隐藏起来)~

1. 设置边界

现在拖拽目标的边界是屏幕边缘,有时候可能需要留一些间距,这种需要在 CSS 就很容易了,可以改变 left/top/right/bottompaddingborder ... 很多方式

.dragbox{
  left: 10px;
  top: 10px;
  right: 10px;
  bottom: 10px;
  /*rect: 10px;*/
}
.dragbox{
  padding: 10px;
}

六、说明和小结

关于兼容性本来以为是没什么问题的,实测下来 ios 问题多多,主要是 safari 滚动容器的问题。例如,有些低版本 ios 滚动不顺畅,需要添加

-webkit-overflow-scrolling:touc h , 才能实现平滑滚动和自动吸附,但是又会导致层级问题,有些文档上描述设置该属性会创建一个原生的滚动容器,层级最高。还有第一种 fixed 布局,如果默认情况下设置 pointer-events: none touchstart 之后设置成 auto ,这个在 ios 上滚动竟然失效了,但是反转过来就可以了(demo中已兼容ios)。

优点嘛,继承 CSS 的灵活性,几乎零成本,容易复用,同时利用了原生滚动,也不会有卡顿。

不过也有少许局限,如果 拖拽目标的尺寸是不固定的 ,可能需要借助 JS 来获取了。当然相比较而言,这还是一个性价比极高的实现方式。

现在回头看看,其实也没有用到什么非常生僻的属性(scroll-snap 可能算一个,不过毕竟是辅助功能),主要还是常见的效果,然后通过联想和发散,根据平日的积累,充分挖掘原生的能力,最终完成所需要的交互,然后就有了本文。

感谢阅读,希望能对日后的工作有所启发。

References

[1] 起点中文网:  https://m.qidian.com/

[2] CSS Scroll Snap:  https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_Scroll_Snap

到此这篇关于纯 CSS 实现拖拽效果的代码的文章就介绍到这了,更多相关CSS 实现拖拽效果内容请搜索以前的文章或继续浏览下面的相关文章,希望大家以后多多支持!

    您感兴趣的教程

    在docker中安装mysql详解

    本篇文章主要介绍了在docker中安装mysql详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编...

    详解 安装 docker mysql

    win10中文输入法仅在桌面显示怎么办?

    win10中文输入法仅在桌面显示怎么办?

    win10系统使用搜狗,QQ输入法只有在显示桌面的时候才出来,在使用其他程序输入框里面却只能输入字母数字,win10中...

    win10 中文输入法

    一分钟掌握linux系统目录结构

    这篇文章主要介绍了linux系统目录结构,通过结构图和多张表格了解linux系统目录结构,感兴趣的小伙伴们可以参考一...

    结构 目录 系统 linux

    PHP程序员玩转Linux系列 Linux和Windows安装

    这篇文章主要为大家详细介绍了PHP程序员玩转Linux系列文章,Linux和Windows安装nginx教程,具有一定的参考价值,感兴趣...

    玩转 程序员 安装 系列 PHP

    win10怎么安装杜比音效Doby V4.1 win10安装杜

    第四代杜比®家庭影院®技术包含了一整套协同工作的技术,让PC 发出清晰的环绕声同时第四代杜比家庭影院技术...

    win10杜比音效

    纯CSS实现iOS风格打开关闭选择框功能

    这篇文章主要介绍了纯CSS实现iOS风格打开关闭选择框,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作...

    css ios c

    Win7如何给C盘扩容 Win7系统电脑C盘扩容的办法

    Win7如何给C盘扩容 Win7系统电脑C盘扩容的

    Win7给电脑C盘扩容的办法大家知道吗?当系统分区C盘空间不足时,就需要给它扩容了,如果不管,C盘没有足够的空间...

    Win7 C盘 扩容

    百度推广竞品词的投放策略

    SEM是基于关键词搜索的营销活动。作为推广人员,我们所做的工作,就是打理成千上万的关键词,关注它们的质量度...

    百度推广 竞品词

    Visual Studio Code(vscode) git的使用教程

    这篇文章主要介绍了详解Visual Studio Code(vscode) git的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。...

    教程 Studio Visual Code git

    七牛云储存创始人分享七牛的创立故事与

    这篇文章主要介绍了七牛云储存创始人分享七牛的创立故事与对Go语言的应用,七牛选用Go语言这门新兴的编程语言进行...

    七牛 Go语言

    Win10预览版Mobile 10547即将发布 9月19日上午

    微软副总裁Gabriel Aul的Twitter透露了 Win10 Mobile预览版10536即将发布,他表示该版本已进入内部慢速版阶段,发布时间目...

    Win10 预览版

    HTML标签meta总结,HTML5 head meta 属性整理

    移动前端开发中添加一些webkit专属的HTML5头部标签,帮助浏览器更好解析HTML代码,更好地将移动web前端页面表现出来...

    移动端html5模拟长按事件的实现方法

    这篇文章主要介绍了移动端html5模拟长按事件的实现方法的相关资料,小编觉得挺不错的,现在分享给大家,也给大家...

    移动端 html5 长按

    HTML常用meta大全(推荐)

    这篇文章主要介绍了HTML常用meta大全(推荐),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参...

    cdr怎么把图片转换成位图? cdr图片转换为位图的教程

    cdr怎么把图片转换成位图? cdr图片转换为

    cdr怎么把图片转换成位图?cdr中插入的图片想要转换成位图,该怎么转换呢?下面我们就来看看cdr图片转换为位图的...

    cdr 图片 位图

    win10系统怎么录屏?win10系统自带录屏详细教程

    win10系统怎么录屏?win10系统自带录屏详细

    当我们是使用win10系统的时候,想要录制电脑上的画面,这时候有人会想到下个第三方软件,其实可以用电脑上的自带...

    win10 系统自带录屏 详细教程

    + 更多教程 +
    教程标签
    HTMLCSSDreamweaverFrontpage