D3.js 交互式操作

摘要:
与图表的交互是指当事件发生时,一个或多个听众在图形元素上做出相应的响应。用户通常使用三种工具进行交互:鼠标、键盘和触摸屏。常见的鼠标事件包括:click:当鼠标单击一个元素时,相当于mousedown和mouseup被组合在一起。当一个事件被监听时,D3将把当前事件保存到D3.event对象中,该对象存储当前事件的各种参数。请仔细参考。

与图表的交互,指在图形元素上设置一个或多个监听器,当事件发生时,做出相应的反应。

一、什么是交互

  交互,指的是用户输入了某种指令,程序接受到指令之后必须做出某种响应。对可视化图表来说,交互能使图表更加生动,能表现更多内容。

  例如,拖动图表中某些图形、鼠标滑到图形上出现提示框、用触屏放大或缩小图形等等。

  用户用于交互的工具一般有三种:鼠标、键盘、触屏。

二、如何添加交互

  对某一元素添加交互操作十分简单,代码如下:

var circle = svg.append("circle");

circle.on("click", function(){
    //在这里添加交互内容
});

  这段代码在 SVG 中添加了一个圆,然后添加了一个监听器,是通过 on() 添加的。在 D3 中,每一个选择集都有 on() 函数,用于添加事件监听器。

  on() 的第一个参数是监听的事件,第二个参数是监听到事件后响应的内容,第二个参数是一个函数。

  鼠标常用的事件有:

    • click:鼠标单击某元素时,相当于 mousedown 和 mouseup 组合在一起。
    • mouseover:光标放在某元素上。
    • mouseout:光标从某元素上移出来时。
    • mousemove:鼠标被移动的时候。
    • mousedown:鼠标按钮被按下。
    • mouseup:鼠标按钮被松开。
    • dblclick:鼠标双击。

  键盘常用的事件有三个:

    • keydown:当用户按下任意键时触发,按住不放会重复触发此事件。该事件不会区分字母的大小写,例如“A”和“a”被视为一致。
    • keypress:当用户按下字符键(大小写字母、数字、加号、等号、回车等)时触发,按住不放会重复触发此事件。该事件区分字母的大小写。
    • keyup:当用户释放键时触发,不区分字母的大小写。

  触屏常用的事件有三个:

    • touchstart:当触摸点被放在触摸屏上时。
    • touchmove:当触摸点在触摸屏上移动时。
    • touchend:当触摸点从触摸屏上拿开时。

  当某个事件被监听到时,D3 会把当前的事件存到 d3.event 对象,里面保存了当前事件的各种参数,请大家好好参详。如果需要监听到事件后立刻输出该事件,可以添加一行代码:

circle.on("click", function(){
    console.log(d3.event);
});

三、带有交互的柱形图

<html>  
<head>  
    <meta charset="utf-8">  
    <title>交互式操作</title>  
</head> 

<style>
    .axis path,
    .axis line{
        fill: none;
        stroke: black;
        shape-rendering: crispEdges;
    }

    .axis text {
        font-family: sans-serif;
        font-size: 11px;
    }

    .MyRect {

    }

    .MyText {
        fill: white;
        text-anchor: middle;
    }
</style>

<body>  
    <script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>  
    <script>

    //画布大小
    var width = 400;
    var height = 400;

    //在 body 里添加一个 SVG 画布    
    var svg = d3.select("body")
        .append("svg")
        .attr("width", width)
        .attr("height", height);

    //画布周边的空白
    var padding = {left:30, right:30, top:20, bottom:20};

    //定义一个数组
    var dataset = [10, 20, 30, 40, 33, 24, 12, 5];
        
    //x轴的比例尺
    var xScale = d3.scale.ordinal()
        .domain(d3.range(dataset.length))
        .rangeRoundBands([0, width - padding.left - padding.right]);

    //y轴的比例尺
    var yScale = d3.scale.linear()
        .domain([0,d3.max(dataset)])
        .range([height - padding.top - padding.bottom, 0]);

    //定义x轴
    var xAxis = d3.svg.axis()
        .scale(xScale)
        .orient("bottom");
        
    //定义y轴
    var yAxis = d3.svg.axis()
        .scale(yScale)
        .orient("left");

    //矩形之间的空白
    var rectPadding = 4;

    //添加矩形元素
    var rects = svg.selectAll(".MyRect")
        .data(dataset)
        .enter()
        .append("rect")
        .attr("class","MyRect")
        .attr("transform","translate(" + padding.left + "," + padding.top + ")")
        .attr("x", function(d,i){
            return xScale(i) + rectPadding/2;
        } )
        .attr("y",function(d){
            return yScale(d);
        })
        .attr("width", xScale.rangeBand() - rectPadding )
        .attr("height", function(d){
            return height - padding.top - padding.bottom - yScale(d);
        })
        .attr("fill","steelblue")        //填充颜色不要写在CSS里
        .on("mouseover",function(d,i){
            d3.select(this)
                .attr("fill","yellow");
        })
        .on("mouseout",function(d,i){
            d3.select(this)
                .transition()
                .duration(500)
                .attr("fill","steelblue");
        });

    //添加文字元素
    var texts = svg.selectAll(".MyText")
        .data(dataset)
        .enter()
        .append("text")
        .attr("class","MyText")
        .attr("transform","translate(" + padding.left + "," + padding.top + ")")
        .attr("x", function(d,i){
            return xScale(i) + rectPadding/2;
        } )
        .attr("y",function(d){
            return yScale(d);
        })
        .attr("dx",function(){
            return (xScale.rangeBand() - rectPadding)/2;
        })
        .attr("dy",function(d){
            return 20;
        })
        .text(function(d){
            return d;
        });

    //添加x轴
    svg.append("g")
        .attr("class","axis")
        .attr("transform","translate(" + padding.left + "," + (height - padding.bottom) + ")")
        .call(xAxis); 
        
    //添加y轴
    svg.append("g")
        .attr("class","axis")
        .attr("transform","translate(" + padding.left + "," + padding.top + ")")
        .call(yAxis);

</script>  
</body>  
</html>  

  这段代码添加了鼠标移入(mouseover),鼠标移出(mouseout)两个事件的监听器。监听器函数中都使用了 d3.select(this),表示选择当前的元素,this 是当前的元素,要改变响应事件的元素时这么写就好。

  mouseover 监听器函数的内容为:将当前元素变为黄色

  mouseout 监听器函数的内容为:缓慢地将元素变为原来的颜色(蓝色)

免责声明:文章转载自《D3.js 交互式操作》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇navicat 快捷键Spark应用程序运行的日志存在哪里(转)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Canvas:橡皮筋线条绘制

Canvas:橡皮筋线条绘制 效果演示 实现要点 事件监听 【说明】: 在Canvas中检测鼠标事件是非常简单的,可以在canvas中添加一个事件监听器,当事件发生时,浏览器就会调用这个监听器。 我们可以使用绑定事件属性: canvas.onmousedown = function(e) { //..... }   此外,也可以使用更为通用的...

微信小程序小方块

第一步:配置animation.wxml文件(相当于html显示的页面) <import src="http://t.zoukankan.com/common/header.wxml" /> <import src="http://t.zoukankan.com/common/footer.wxml" /> <view cl...

CSS 公共样式摘自万能的度娘

global.css | reset.css(格式化样式) common.css(公共组件样式) layout.css(当前页面样式) 清除全站所有页面的浏览器默认样式,保证在初始样式在所有浏览器下一致。 common.css(公共组件样式) 一般一个网站所有页面头部、底部样式都是一致的,而且很长时间不会有大的改变,改变的大概就是产品、运营的经常需要添加、...

什么是盒模型?

  css盒模型是在网页设计中经常用到的css技术所使用的一种思维模型!   在网页中,css盒模型主要4个部分组成,有Content(内容)-Margin(外边距)-Border(边框)-Padding(内边距)       在网页中,一个元素占有空间的大小由几个部分构成,其中包括元素的内容,元素的补白,元素的边框,元素的边界四个部分。这四个部分占有的空...

JavaScript中DOM操作之获取元素占位

宽度,高度,margin,padding,border1.可以通过标签样式来获取获取到的结果是属性值有px单位 window.getComputedStyle(oDiv).height 2.其他方式offsetHeight   offsetWidth宽/高+padding+borderclientHeight   clientWidth高/宽+paddin...

原生js和vue之间的数据通讯--EventEmitter

有个小项目在原来原生的框架编写,但是不想写原生,就引入了vue 然后有个需求要和原生的js进行交互通讯,于是就可以用node.js EventEmitter 具体做法: 先引入文件<script src="http://t.zoukankan.com/js/eventEmitter.js"></script>, 初始化, 然后在vu...