标签:round char 不同 end html orm isp min 事先
首先做出一个动态的柱形图(这儿用的d3.js的版本是v3,用v4的话有些函数会发生变化)
效果图:

代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>histogramTransitionEvent</title>
<style>
.axis path,
.axis line{
fill: none;
stroke: black;
shape-rendering: crispEdges;
}
.axis text {
font-family: sans-serif;
font-size: 11px;
}
.MyText {
fill: white;
text-anchor: middle;
}
</style>
</head>
<body>
<script src="d3.js"></script>
<script>
//添加svg画布
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()
// 使用了d3.scale.ordinal() 它支持范围分档。与定量比例尺(如d3.scale.linear())返回连续的范围值不同,序数比例尺使用的是离散范围值,也就是输出值是事先就确定好的。
// 映射范围时,可以使用range(),也可以使用rangeBands()。后者接收一个最小值和一个最大值,然后根据输入值域的长度自动将其切分成相等的块或“档”。0.2也就是档间距为每一档宽度的20%。
.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("width",xScale.rangeBand()-rectPadding)
.attr("y",function(d){
var min = yScale.domain()[0];
return yScale(min);
})
.attr("height", function(d){
return 0;
})
.transition()
.delay(function(d,i){
return i * 200;
})
.duration(2000)
.ease("bounce")
.attr("y",function(d){
return yScale(d);
})
.attr("height",function(d){
return height-padding.top-padding.bottom-yScale(d);
})//console.log(width-padding.left-padding.right);
//添加文字元素
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){
var min = yScale.domain()[0];
// console.log(yScale(min));
return yScale(min);
})
.transition()
.delay(function(d,i){
return i*200;
})
.duration(2000)
.ease("bounce")
.attr("y",function(d){
return yScale(d);
})
.attr("dx",function(){
return (xScale.rangeBand()-rectPadding)/2;
})
.attr("dy",function(){
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事件。
做法:
1.去掉style样式中的.MyText类,直接在添加矩形的时候添加颜色属性
2.在添加矩形的时候添加事件
... //添加矩形和文字元素 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("width",xScale.rangeBand()-rectPadding) .attr("y",function(d){ var min = yScale.domain()[0]; return yScale(min); }) .attr("height", function(d){ return 0; }) .transition() .delay(function(d,i){ return i * 200; }) .duration(2000) .ease("bounce") .attr("y",function(d){ return yScale(d); }) .attr("height",function(d){ return height-padding.top-padding.bottom-yScale(d); }) .attr("fill","steelblue") //添加事件 .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"); }); ...
但是这样会报错,会显示on不是一个函数
后来知道应该把on事件放在transition()之前,但是为啥这么做可以现在还不知道
... //添加矩形和文字元素 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("width",xScale.rangeBand()-rectPadding) //添加事件在 transition()之前 .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"); }) .attr("y",function(d){ var min = yScale.domain()[0]; return yScale(min); }) .attr("height", function(d){ return 0; }) .transition() .delay(function(d,i){ return i * 200; }) .duration(2000) .ease("bounce") .attr("y",function(d){ return yScale(d); }) .attr("height",function(d){ return height-padding.top-padding.bottom-yScale(d); }) .attr("fill","steelblue"); ...
最终效果图:

这里面矩形图的教程来源:http://d3.decembercafe.org/pages/lessons/9.html
标签:round char 不同 end html orm isp min 事先
原文地址:http://www.cnblogs.com/weiyangoo/p/7273732.html