• 图片拖动验证效果(源码)


    JS案例·图片拖动验证

    🌟效果展示  

    🌟前置知识

    CSS sprite 精灵图

    🌟 代码实现

    页面搭建

     距离计算

    逻辑部分 

    随机生成背景图片

     计算拖动图块和空缺图块的位置

    绑定事件

     🌟写在最后


    🌟效果展示  

    🌟前置知识

    CSS sprite 精灵图

    CSS Sprite,我们一般叫他雪碧图或精灵图,它是一种图像拼合技术。该方法是将小图标和背景图像合并到一张图片上,然后利用 css 的背景定位来显示需要显示的图片部分。

    精灵图的使用有以下几个优点:

    • 减少图片的字节。
    • 减少网页的http请求,从而大大的提高页面的性能。
    • 解决了网页设计师在图片命名上的困扰,只需对一张集合的图片上命名就可以了,不需要对每一个小元素进行命名,从而提高了网页的制作效率。
    • 更换风格方便,只需要在一张或少张图片上修改图片的颜色或样式,整个网页的风格就可以改变。维护起来更加方便。

    第一个值是调左右的,当你需要将背景图向右调的时候用正值,向左则为负值 同理将背景图上下调动的时候上是用负值,下是正值 

    我们通过设置 background-position 属性,来调整背景图的位置

     再例如:

    如果想要下面的图形,就可以调整第二个参数,例如:

     

    🌟 代码实现

    页面搭建

    先完成HTML结构

    以及CSS样式代码

    1. /* 整体容器的样式 */
    2. .container {
    3. width: 280px;
    4. height: 400px;
    5. margin: 100px auto;
    6. }
    7. /* 上方的图片不好看切换一张的样式 */
    8. .container .changeImg {
    9. text-align: center;
    10. position: relative;
    11. font-size: 16px;
    12. color: rgb(126, 57, 218);
    13. font-weight: bolder;
    14. cursor: pointer;
    15. user-select: none;
    16. }
    17. /* 前面的图标 */
    18. .changeImg::before {
    19. content: '';
    20. display: block;
    21. position: absolute;
    22. left: 10%;
    23. top: calc(50% - 13px);
    24. width: 26px;
    25. height: 26px;
    26. background: url('../img/sx.png') no-repeat;
    27. background-size: cover;
    28. background-position: center;
    29. }
    30. /* img 容器整体样式,包含标题 + 图片 + 滑条 */
    31. .imgContainer {
    32. height: 320px;
    33. box-sizing: border-box;
    34. padding: 15px;
    35. border: 1px solid #adadad;
    36. box-shadow: 0px 0px 2px #adadad;
    37. /* 设置盒子阴影 */
    38. border-radius: 15px;
    39. /* 设置圆角 */
    40. }
    41. /* 上方标题 */
    42. .imgContainer h3 {
    43. text-align: center;
    44. margin: 0;
    45. margin-bottom: 10px;
    46. }
    47. /* 中间的图片 */
    48. .imgContainer .imgBox {
    49. width: 100%;
    50. height: 200px;
    51. background-repeat: no-repeat;
    52. position: relative;
    53. }
    54. /* 可以拖动的图片 */
    55. .imgBox .imgBlock {
    56. width: 50px;
    57. height: 50px;
    58. position: absolute;
    59. z-index: 10;
    60. opacity: 0;
    61. }
    62. /* 图片缺口 */
    63. .imgBox .imgGap {
    64. width: 50px;
    65. height: 50px;
    66. position: absolute;
    67. background-color: white;
    68. box-shadow: 0px 0px 3px #adadad;
    69. /* 设置盒子阴影 */
    70. }
    71. /* 滑动条 */
    72. .slider {
    73. width: 100%;
    74. height: 30px;
    75. margin: auto;
    76. margin-top: 15px;
    77. background-color: #ddd;
    78. border-radius: 10px;
    79. position: relative;
    80. text-align: center;
    81. line-height: 30px;
    82. font-size: 14px;
    83. font-weight: 200;
    84. }
    85. /* 滑动条的按钮 */
    86. .slider button {
    87. position: absolute;
    88. top: -5px;
    89. left: -2px;
    90. background: white url('../img/yz.png') no-repeat;
    91. background-size: 100%;
    92. border-radius: 50%;
    93. border: 0;
    94. width: 40px;
    95. height: 40px;
    96. cursor: pointer;
    97. z-index: 20;
    98. }
    99. /* 滑动条文字的样式 */
    100. .slider span {
    101. transition: all .5s;
    102. }

    在完成HTML和CSS后得到如图效果:

     距离计算

    图片验证核心其实就是按钮的拖动,也就是位置的计算:

    逻辑部分 

    随机生成背景图片

    先拿到需要的DOM节点,方便后续操作

     接下来就是随机生成验证图片,我这里图片就是放在本地

     图片容器以及拖动的图片块设置对应的背景图

     计算拖动图块和空缺图块的位置

     空缺图块可以设置的最大 top 值 = 盒子容器的高度 - 空缺图块的高度

      let heightRange = imgBox.offsetHeight - imgBlock.offsetHeight;

    空缺图块可以设置的最大 left 值 = 盒子容器的宽度的一半 - 空缺图块的宽度

    let widthRange = imgBox.offsetWidth / 2 - imgBlock.offsetWidth; 

    接下来就是随机生成 left top

    生成图片缺口及拖动图片的位置

    绑定事件

    为整个滑动条添加鼠标移动效果

    设置鼠标抬起事件

     

     🌟写在最后

    完整源码及图片素材免费下载地址:点击免费下载

    本专栏将持续更新原生JS案例,提供一些工作中也能用上的一些小案例,详细讲解分析,提神JS开发水平与开发思路的积累,如果文中出现有瑕疵的地方各位通过评论或者私信联系我,我们一起进步,有兴趣的伙伴可以订阅一下:点击关注JS经典案例专栏 

  • 相关阅读:
    描述低轨星座的特点和通信挑战,以及它们在5G和B5G中的作用。
    React中函数式组件与类组件有何不同?
    Java之MyBatis
    [附源码]计算机毕业设计葡萄酒销售管理系统论文Springboot程序
    Acwing 算法基础课 c++模板整理(附python语法基础题)
    云原生 | Kubernetes - 国内镜像部署Helm
    Python中list的操作4-4
    微信公众号消息接入(普通消息+模板消息)
    Tomcat一机多实例部署
    单脉冲测角-和差比幅法
  • 原文地址:https://blog.csdn.net/G_ing/article/details/132863692