使用javascript更改条形宽度

时间:2015-08-30 05:27:18

标签: javascript jquery html css css3

我需要一些改变条宽的帮助。我正在创建一个简单的水平条形图,需要更改条形的宽度取决于数据的百分比。 jsfiddle链接http://jsfiddle.net/kmc3ohab/2/

提前致谢

var data = {
    "box1": {
        "bar1": "80%",
        "bar2": "60%",
        "bar3": "40%",
        "bar4": "50%",
        "total": "60%",
    },
};

$(document).ready(function() {
    $(".score-text").html(data.box1.total);
    $(".data").text(data.box1.bar1);
    $(".data").text(data.box1.bar2);
    $(".data").text(data.box1.bar3);
    $(".data").text(data.box1.bar4);
});

    
body {
	background: #efefef;
	width: 100%;
	margin: 0px;
	text-align: center;
}

h2 {
	font-family: 'Noto Sans', serif;
	color: #b71f38;
	font-weight: 300;
	margin: 0px;
}

h3 {
	font-family: 'Noto Sans', serif;
	color: #444444;
	font-weight: 200;
	margin: 0px;
}

#colLeft {
	width: 50%;
	float: left;
}

#colRight {
	width: 50%;
	float: right;
}

#row {
	background: #e2e2e2;
	width: auto;
	height: 230px;
	margin: 15px;
	border-radius: 5px;
}

#insideColLeft {
	width: 30%;
	float: left;
}

#insideColRight {
	width: 69%;
	float: right;
	padding-top: 8px;
	padding-right: 5px;
}

.circle {
	margin-left: auto;
	margin-right: auto;
	border-radius: 50%;
	width: 150px;
	position: relative;
	background: #b71f38;
}

.circle:before {
	content: "";
	display: block;
	padding-top: 100%;
}

.circle-inner {
	position: absolute;
	top: 0;
	left: 0;
	bottom: 0;
	right: 0;
	text-align: center;
}

.score-text {
	margin: auto;
	position: absolute;
	top: 0;
	left: 0;
	bottom: 0;
	right: 0;
	height: 1em;
	line-height: 1em;
	font-size: 30px;
	font-family: 'Fjalla One', sans-serif;
	color: #ffffff;
}

.date {
	font-family: 'Fjalla One', sans-serif;
	text-align: center;
	color: #333333;
}

ul.graph {
	margin: 0;
	padding: 0;
	list-style-type: none;
}
	
ul.graph li {
	margin: 10px;
	height: 25px;
	background: #ccc;
	color: #fff;
}
	
ul.graph li.data {
	background: #f4ebb8;
}
	
<div id="row">
      <h2>Title</h2>
      <h3>Subtitle</h3>
      <div id="insideColLeft">
        <div class="circle">
          <div class="circle-inner">
            <div class="score-text">
            </div>
          </div>
        </div>
        
      </div>
      <div id="insideColRight">
        <ul class="graph">
          <li class="data">bar 1</li>
          <li class="data">bar 2</li>
          <li class="data">bar 3</li>
          <li class="data">bar 4</li>
        </ul>
      </div>
    </div>

如果我有超过1个数据集怎么办?我如何循环遍历每个数据?此外,如果我需要从本地csv文件加载数据。 js小提琴已更新http://jsfiddle.net/kmc3ohab/6/

1 个答案:

答案 0 :(得分:1)

试试这个:http://jsfiddle.net/kmc3ohab/5/

$(document).ready(function() {
    $(".score-text").html(data.box1.total);
    $(".data").each(function( index, value ) {
        width = eval('data.box1.bar' + (index+1));
        value.innerText = width;
        value.style.width = width;
    });
});

您的问题的基本答案是在每个条形元素上设置style.width。扩展了您的解决方案:

  • 在循环中完成所有事情。注意:如果条形值存储在数组中会更好,所以您不需要使用eval()。
  • 正确设置条形图上的文字和循环条形图的宽度。

编辑有关多个条形部分的新问题。

显示多个部分实际上取决于您如何阅读csv文件。理想情况下,数据存储在数组中,在读取后看起来像这样:

var data =
[
    {
        title: "Title 1",
        subTitle: "SubTitle 1",
        bars :
        [
           { name: "bar1", value: "80%" },
           { name: "bar2", value: "40%" },
           { name: "bar3", value: "50%" },
           { name: "bar4", value: "60%" }
        ],
        total: "60%"
    },
    {
        title: "Title 2",
        subTitle: "SubTitle 2",
        bars :
        [
           { name: "bar1", value: "80%" },
           { name: "bar2", value: "60%" },
           { name: "bar3", value: "40%" },
           { name: "bar4", value: "50%" }
        ],
        total: "80%"
    }
];

你循环遍历这样的部分列表:

data.foreach(function(item) {
    ...
});

但真正的问题是你将如何生成HTML?使用document.write()?如果正在读取的数据量是动态的,并且您正在动态创建HTML,则在创建HTML时更容易设置属性。

AngularJS在这里使用ng-repeat是更好的解决方案。然后,您只需为您的部分定义一次HTML。您谈到读取本地csv文件。这是否意味着这不是服务器托管的HTML文件?即便如此,仍然可以使用Angular和托管文件的CDN。