zoom缩放案例

源码:https://github.com/HK-Kevin/d...;
demo:https://hk-kevin.github.io/d3...;

原理:通过zoom事件来重新绘制x轴scale,同时获得此时scale,在zoom事件的时候调用函数,将每个数据点的xScale重新绘制一遍。

   let data = [[{x: , y: }, {x: , y: }, {x: , y: }, {x: , y: }, {x: , y: }, {x: , y: }, {x: ,y: }, {x: , y: }, {x: , y: }, {x: , y: }, {x: , y: }]]
//定义图表数据
let svg = d3.select("svg"),
margin = {top :,right:,bottom:,left:}, //设值绘图区的布局
areaWidth = svg.attr("width") - margin.left-margin.right,//获得绘图区的宽高
areaHeight = svg.attr("height") - margin.top - margin.bottom, g = svg.append("g")//绘图区容器,所有的图形都放在这里面
.attr("transform",`translate(${margin.left},${margin.top})`)
.attr("width",areaWidth)
.attr("height",areaHeight) let xScale =d3.scaleLinear()//添加x的尺度,线性的尺度
.domain([,])
.range([,areaWidth]); let yScale = d3.scaleLinear()//添加x的尺度,线性的尺度
.domain([,])
.range([,areaHeight]) ; let xAxis = d3.axisBottom(xScale) ;//添加底部坐标轴 let yAxis = d3.axisLeft(yScale) ;//添加左部坐标轴 let line = d3.line() //线生成器,就是把data的数据通过x,y的尺度转化为此坐标轴对应的数据
.curve(d3.curveStepAfter)
.x(function(d){
return xScale(d.x)
})
.y(function (d) {
return yScale(d.y)
}); let t =d3.transition()//定义动画
.duration() //持续时间
.ease(d3.easeLinear)//动画type let xGrooup = g.append("g") //生成x轴
.attr("transform",`translate(,${areaHeight})`)
.call(xAxis) let yGroup = g.append("g")//生成y轴
.attr("transform",`translate(,)`)
.call(yAxis) g.append("clipPath") //添加一个剪切区,超出这个区的图形都不显示
.attr("id", "clip")
.append("rect")
.attr("width", areaWidth)
.attr("height", areaHeight); let updateLine = g.append("g") //enter 、update、exit
.attr("class","chart")
.selectAll("line")
.data(data) let enterLine = updateLine.enter();
let exitLine = updateLine.exit(); let path = enterLine.append("path")
.attr("clip-path", "url(#clip)")
.attr("class","line")
.attr("d",line)
.attr("fill","none")
.attr("stroke",)
.transition(t)
.attr("stroke-width",)
.attr("stroke","green") exitLine.remove(); let zoom = d3.zoom() //设置zoom参数
.scaleExtent([, ]) //放大倍数
.translateExtent([[,], [areaWidth, areaHeight]])//移动的范围
.extent([[, ], [width, height]])
//视窗 (左上方,右下方),默认最近父级元素的[0,0],[width,height]
.on("zoom", zoomed); //zoom事件,调用zoomed函数 let zoomRect = svg.append("rect") //设置缩放的区域,一般覆盖整个绘图区
.attr("width",areaWidth)
.attr("height",areaHeight)
.attr("fill","none")
.attr("pointer-events","all")
.call(zoom); function zoomed() {
let t = d3.event.transform.rescaleX(xScale) //获得缩放后的scale
xGrooup.call(xAxis.scale(t)) //重新设置x坐标轴的scale
g.select("path.line").attr("d", line.x(function(d){ //获取曲线,用新的x尺度来计算line
return t(d.x)}))
}

d3.js v4曲线图的拖拽功能实现Zoom的更多相关文章

  1. 通过 JS 实现简单的拖拽功能并且可以在特定元素上禁止拖拽

    前言 关于讲解 JS 的拖拽功能的文章数不胜数,我确实没有必要大费周章再写一篇重复的文章来吸引眼球.本文的重点是讲解如何在某些特定的元素上禁止拖拽.这是我在编写插件时遇到的问题,其实很多插件的拖拽功能 ...

  2. (Demo分享)利用JavaScript(JS)实现一个九宫格拖拽功能

    利用JavaScript(JS)实现一个九宫格拖拽功能   Demo实现了对任意方格进行拖拽,可以交换位置,其中Demo-1利用了勾股定理判断距离! Demo-1整体思路: 1.首先div实现自由移动 ...

  3. 关于 JS 拖拽功能的冲突问题及解决方法

    前言 我在之前写过关于 JS 拖拽的文章,实现方式和网上能搜到的方法大致相同,别无二致,但是在一次偶然的测试中发现,这种绑定事件的方式可能会和其它的拖拽事件产生冲突,由此产生了对于事件绑定的思考.本文 ...

  4. Js元素拖拽功能实现

    Js元素拖拽功能实现 需要解决的问题 最近项目遇到了一个问题,就是用户某个操作需要弹出一个自定义的内容输入框,但是有个缺点,当浏览太大的时候没办法点击确认和取消按钮,应为这个弹出框是采用绝对定位的,取 ...

  5. vuejs2.0使用Sortable.js实现的拖拽功能

    简介 在使用vue1.x之前的版本的时候,页面中的拖拽功能,我在项目中是直接用的jquery ui中的sortable.js,只是在拖拽完成后,在update的回调函数中又重新排序了存放数据的数组.但 ...

  6. vue2.0使用Sortable.js实现的拖拽功能

    简介 在使用vue1.x之前的版本的时候,页面中的拖拽功能,我在项目中是直接用的jQuery ui中的sortable.js,只是在拖拽完成后,在update的回调函数中又重新排序了存放数据的数组.但 ...

  7. js进阶 12-17 jquery实现鼠标左键按下拖拽功能

    js进阶 12-17 jquery实现鼠标左键按下拖拽功能 一.总结 一句话总结:监听的对象必须是文档,鼠标按下运行mousemove事件,鼠标松开取消mousemove事件的绑定,div的偏移的话是 ...

  8. vuejs2.0使用Sortable.js实现的拖拽功能( 转)

    文章目录   简介 实现效果 html主要代码 css代码 js代码 简介 在使用vue1.x之前的版本的时候,页面中的拖拽功能,我在项目中是直接用的jquery ui中的sortable.js,只是 ...

  9. 原生js拖拽功能制作滑动条实例教程

    拖拽属于前端常见的功能,很多效果都会用到js的拖拽功能.滑动条的核心功能也就是使用js拖拽滑块来修改位置.一个完整的滑动条包括 滑动条.滑动痕迹.滑块.文本 等元素,先把html代码写出来,如下所示: ...

随机推荐

  1. red hat重置密码

    步骤1:打开red hat 步骤2:看到如图画面时按e 进入到这个界面 步骤4:按e,看到如下画面后,选第二项,然后按e 步骤5:在“quiet"后面输入   空格single   后按b ...

  2. IdentityServer4源码解析_4_令牌发放接口

    目录 identityserver4源码解析_1_项目结构 identityserver4源码解析_2_元数据接口 identityserver4源码解析_3_认证接口 identityserver4 ...

  3. Slam笔记I

    视觉Slam笔记I 第二讲-三位空间刚体运动 点与坐标系: 基础概念: 坐标系:左手系和右手系.右手系更常用.定义坐标系时,会定义世界坐标系,相机坐标系,以及其他关心对象的坐标系.空间中任意一点可由空 ...

  4. 【codeforces】Codeforces Round #606 E. Two Fairs——图论

    题目链接 题意 给你一张无向图,求出有多少对点对(x, y)满足从点x到点y的所有路径必同时经过点a和点b 分析 单点 首先考虑假如点a和点b是同一个点的情况 我从任意的一点出发,把所有与点a/b相连 ...

  5. Spring Cloud 系列之 Netflix Zuul 服务网关

    什么是 Zuul Zuul 是从设备和网站到应用程序后端的所有请求的前门.作为边缘服务应用程序,Zuul 旨在实现动态路由,监视,弹性和安全性.Zuul 包含了对请求的路由和过滤两个最主要的功能. Z ...

  6. python之进程,线程

    什么是进程(process)? 程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程.程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述文本 ...

  7. 图的深度优先搜索dfs

    图的深度优先搜索: 1.将最初访问的顶点压入栈: 2.只要栈中仍有顶点,就循环进行下述操作: (1)访问栈顶部的顶点u: (2)从当前访问的顶点u 移动至顶点v 时,将v 压入栈.如果当前顶点u 不存 ...

  8. 使用SpringCloud将单体迁移至微服务

    使用SpringBoot构建单体项目有一段时间了,准备对一个老项目重构时引入SpringCloud微服务,以此奠定后台服务能够应对未知的业务需求. 现在SOA架构下的服务管理面临很多挑战,比如面临一个 ...

  9. JavaScript数组的基本操作

    数组的创建方式: 方式一:构造函数构建数组 var arr = new Array ( ); 如果传入的参数为一个数字,代表数组的长度,不包含内容 // 可以传入字符串和数字,用逗号隔开,作为数组中的 ...

  10. Ubuntu16.04下LAMP环境的安装与配置

    Ubuntu16.04下LAMP环境的安装与配置 最近做个实验需要用到Ubuntu环境的靶场,所以这里介绍下Ubuntu环境下LAMP的安装与配置,话不多说,我们gkd! 1.Apache2的安装 首 ...