一步步教你实现纯CSS的柱形图

本文通过使用CSS样式和HTML结构,逐步演示如何实现一个简单的柱状图表。从基本的列表布局到复杂的背景图像叠加,详细介绍了每一步的具体操作。

CSS在处理排版之强大,没有做不到,只有想不到。下面我们将一同实现一个柱状图。

先打好一个具体的框架。我们利用无序列表做整体,里面的东西我们根本选择内联无素span,strong,em来填充。

<ul class="chart"> <li><em>使命召唤</em><span>: </span><strong>35%</strong></li> <li><em>机器战争</em><span>: </span><strong>40%</strong></li> <li><em>CS</em><span>: </span><strong>87%</strong></li> <li><em>光环</em><span>: </span><strong>45%</strong></li> <li><em>半条命</em><span>: </span><strong>23%</strong></li> </ul>

运行代码


    <ul class="chart">
      <li><em>使命召唤</em><span>: </span><strong>35%</strong></li>
      <li><em>机器战争</em><span>:</span><strong>40%</strong></li>
      <li><em>CS</em><span>:</span><strong>87%</strong></li>
      <li><em>光环</em><span>:</span><strong>45%</strong></li>
      <li><em>半条命</em><span>:</span><strong>23%</strong></li>
    </ul>

解释一下,ul里面的每一个li就代表我们要统计的内容,span为柱身,em为统计项的名字,strong为统计数值。我们可以添加一些背景颜色来区分他们。


   .chart {
        list-style: none;
        font-family: '宋体';
        font-size: 14px;
        border: 1px solid #ccc;
        margin: 0;
        padding: 5px;
        background:#F2F1D7;
      }

      .chart li {
        width:400px;
        background:#DDF3FF;
      }
<style type="text/css"> .chart { list-style: none; font-family: '宋体'; font-size: 14px; border: 1px solid #ccc; margin: 0; padding: 5px; background:#F2F1D7; } .chart li { width:400px; background:#DDF3FF; } </style> <ul class="chart"> <li><em>使命召唤</em><span >: </span><strong>35%</strong></li> <li><em>机器战争</em><span >: </span><strong>40%</strong></li> <li><em>CS</em><span >: </span><strong>87%</strong></li> <li><em>光环</em><span >: </span><strong>45%</strong></li> <li><em>半条命</em><span >: </span><strong>23%</strong></li> </ul>

运行代码

但怎样把li弄成柱状呢?我们首先把li弄成并排显示,要达到这种效果,我们有两个方法:1、把li的display变成inline,2、把li变成浮动元素。估量一翻,选择了后者,因为内联元素的盒子模型是难以控制的,margin与padding的计算会变得很复杂。既然选择后者,我们必须面对一个情况,就是浮动溢出了。对策是父元素也变成浮动元素。浮动容器会向内收缩,自适应子元素的高度与宽度。也就是说,我们专注于li的设计就可以了!为了让li表现得像柱子, 我们让它的高比宽长很多,同时为了让大家好辩认每个li的范围,我先给它们加上边框!


      .chart {
        list-style: none;
        font-family: '宋体';
        font-size: 14px;
        border: 1px solid #ccc;
        margin: 0;
        padding: 5px;
        background:#F2F1D7;
        float:left;
      }

      .chart li {
        width:70px;
        height:300px;
        float:left;
        background:#DDF3FF;
        border:1px solid red;
      }
<style type="text/css"> .chart { list-style: none; font-family: '宋体'; font-size: 14px; border: 1px solid #ccc; margin: 0; padding: 5px; background:#F2F1D7; float:left; } .chart li { width:70px; height:300px; float:left; background:#DDF3FF; border:1px solid red; } </style> <script type="text/javascript"> </script> <title>非法修改button的onclick事件</title> </head> <body> <ul class="chart"> <li><em>使命召唤</em><span ></span><strong>35%</strong></li> <li><em>机器战争</em><span ></span><strong>40%</strong></li> <li><em>CS</em><span ></span><strong>87%</strong></li> <li><em>光环</em><span ></span><strong>45%</strong></li> <li><em>半条命</em><span ></span><strong>23%</strong></li> </ul>

运行代码

接着我们要差开li元素里面的内容,由于它们都是内联元素,因此给他们设高与宽是没有意义,我们得把他们伪装成块元素。这时它们就会各自独占一行。由于我们把span中的冒号删除了,里面为空,span就表现为不占空间,我们可以给它们塞点东西进去,我塞的是&#30;,当然你们在textarea中是看不到的,要利用火狐的查看元素功能才行。(你们自己可以查一下&#30;,&#32;,&#160;,&emsp;与&ensp;的区别!)


      .chart {
        list-style: none;
        font-family: '宋体';
        font-size: 14px;
        border: 1px solid #ccc;
        margin: 0;
        padding: 5px;
        background:#F2F1D7;
        float:left;
      }

      .chart li {
        width:70px;
        height:300px;
        float:left;
        background:#DDF3FF;
        border:1px solid red;
      }
      .chart li em ,
      .chart li span ,
      .chart li strong {
         display:block;
      }
  • 使命召唤35%
  • 机器战争40%
  • CS87%
  • 光环45%
  • 半条命23%

运行代码

接着我们把柱子占的空间突现出来,并把相关的东西居中对齐一下。


      .chart {
        list-style: none;
        font-family: '宋体';
        font-size: 14px;
        border: 1px solid #ccc;
        margin: 0;
        padding: 5px;
        background:#F2F1D7;
        float:left;
      }

      .chart li {
        width:70px;
        height:300px;
        float:left;
        background:#DDF3FF;
        border:1px solid red;
      }
      .chart li em {
        display:block;
        height:20px;
        text-align:center;
      }
      .chart li span {
        display:block;
        background:#F1FAFA;
        height:260px;
      }
      .chart li strong {
        display:block;
        height:20px;
        text-align:center;
      }
<style type="text/css"> .chart { list-style: none; font-family: '宋体'; font-size: 14px; border: 1px solid #ccc; margin: 0; padding: 5px; background:#F2F1D7; float:left; } .chart li { width:70px; height:300px; float:left; background:#DDF3FF; border:1px solid red; } .chart li em { display:block; height:20px; text-align:center; } .chart li span { display:block; background:#F1FAFA; height:260px; } .chart li strong { display:block; height:20px; text-align:center; } </style> <ul class="chart"> <li><em>使命召唤</em><span></span><strong>35%</strong></li> <li><em>机器战争</em><span></span><strong>40%</strong></li> <li><em>CS</em><span></span><strong>87%</strong></li> <li><em>光环</em><span></span><strong>45%</strong></li> <li><em>半条命</em><span></span><strong>23%</strong></li> </ul>

运行代码

然后我们为li元素添加一张图片,它就是传说的圆柱了,然后用span为作罩遮层,li所在项目的统计是多少,我们就露出多少,为了方便计算,我们把span的高度重设为100px,li的高度相应改为140px。em与strong设置与li相同的背景颜色,遮住柱子的最上面与最下面。


  .chart {
        list-style: none;
        font-family: '宋体';
        font-size: 14px;
        border: 1px solid #ccc;
        margin: 0;
        padding: 5px;
        background:#F2F1D7;
        float:left;
      }
      .chart li {
        width:70px;
        height:140px;
        float:left;
        border:1px solid red;
        background:#DDF3FF url(http://images.cnblogs.com/cnblogs_com/rubylouvre/202680/o_pillar.gif) center center repeat-y;
      }
      .chart li em,  .chart li span,.chart li strong {
        display:block;
        height:20px;
        text-align:center;
      }
      .chart li em,  .chart li strong{
        background: #DDF3FF;
      }
      .chart li span {
        height:100px;
      }
<style type="text/css"> .chart { list-style: none; font-family: '宋体'; font-size: 14px; border: 1px solid #ccc; margin: 0; padding: 5px; background:#F2F1D7; float:left; } .chart li { width:70px; height:140px; float:left; border:1px solid red; background:#DDF3FF url(http://images.cnblogs.com/cnblogs_com/rubylouvre/202680/o_pillar.gif) center center repeat-y; } .chart li em, .chart li span,.chart li strong { display:block; height:20px; text-align:center; } .chart li em, .chart li strong{ background: #DDF3FF; } .chart li span { height:100px; } </style> <ul class="chart"> <li><em>使命召唤</em><span></span><strong>35%</strong></li> <li><em>机器战争</em><span></span><strong>40%</strong></li> <li><em>CS</em><span></span><strong>87%</strong></li> <li><em>光环</em><span></span><strong>45%</strong></li> <li><em>半条命</em><span></span><strong>23%</strong></li> </ul>

运行代码

接着我们在span弄一张背景图片,颜色与li元素的一样,统计数字为多少,我们就向上移多少!为了方便,我们用内联样式设置这个backgroundPositionY数值。最后去掉li元素的边框便大功告成了!


       .chart {
        list-style: none;
        font-family: '宋体';
        font-size: 14px;
        border: 1px solid #ccc;
        margin: 0;
        padding: 5px;
        background:#F2F1D7;
        float:left;
      }
      .chart li {
        width:70px;
        height:140px;
        float:left;
        background:#DDF3FF url(http://images.cnblogs.com/cnblogs_com/rubylouvre/202680/o_pillar.gif) center center repeat-y;
      }
      .chart li em,  .chart li span,.chart li strong {
        display:block;
        height:20px;
        text-align:center;
        background: #DDF3FF;
      }
      .chart li span {
        height:100px;
        background:transparent url(http://images.cnblogs.com/cnblogs_com/rubylouvre/202680/o_mask.jpg)  no-repeat;
      }

   <ul class="chart">
      <li><em>使命召唤</em><span style="background-position: center -35px"></span><strong>35%</strong></li>
      <li><em>机器战争</em><span style="background-position: center -40px"></span><strong>40%</strong></li>
      <li><em>CS</em><span style="background-position: center -87px"></span><strong>87%</strong></li>
      <li><em>光环</em><span style="background-position: center -45px"></span><strong>45%</strong></li>
      <li><em>半条命</em><span style="background-position: center -23px"></span><strong>23%</strong></li>
    </ul>
<style type="text/css"> .chart { list-style: none; font-family: '宋体'; font-size: 14px; border: 1px solid #ccc; margin: 0; padding: 5px; background:#F2F1D7; float:left; } .chart li { width:70px; height:140px; float:left; background:#DDF3FF url(http://images.cnblogs.com/cnblogs_com/rubylouvre/202680/o_pillar.gif) center center repeat-y; } .chart li em, .chart li span,.chart li strong { display:block; height:20px; text-align:center; } .chart li em, .chart li strong{ background: #DDF3FF; } .chart li span { height:100px; background:transparent url(http://images.cnblogs.com/cnblogs_com/rubylouvre/202680/o_mask.jpg) no-repeat; } </style> <ul class="chart"> <li><em>使命召唤</em><span style="background-position: center -35px"></span><strong>35%</strong></li> <li><em>机器战争</em><span style="background-position: center -40px"></span><strong>40%</strong></li> <li><em>CS</em><span style="background-position: center -87px"></span><strong>87%</strong></li> <li><em>光环</em><span style="background-position: center -45px"></span><strong>45%</strong></li> <li><em>半条命</em><span style="background-position: center -23px"></span><strong>23%</strong></li> </ul>

运行代码

=======================华丽的分界线,与题目无关===========================

<head> <script type="text/javascript"> var dataSet = { "最终幻想":95, "白骑士":20, "星之海样":84, "北欧女神":77, "勇者斗恶龙":90, "异度装甲":100, "圣剑传说":68, "影之心":72, "传说系列":85, "失落奥德赛":92, "光明之风":40 } var markPollarChart= function(parent,dataset){ var p = document.createElement("div"), builder = []; builder.push("<ul class='chart'>"); for(var i in dataset){ builder.push("<li><em>") ; builder.push(i) ; builder.push("</em><span style='background-position: center -") ; builder.push(dataset[i]) ; builder.push("px'></span><strong>") ; builder.push(dataset[i]) ; builder.push("%</strong></li>") ; } builder.push("</ul>"); p.innerHTML = builder.join(''); parent.insertBefore(p,null); } window.onload = function(){ markPollarChart(document.getElementsByTagName("body")[0],dataSet); } </script> <style type="text/css"> .chart { list-style: none; font-family: '宋体'; font-size: 14px; border: 1px solid #ccc; margin: 0; padding: 5px; background:#F2F1D7; float:left; } .chart li { width:75px; height:140px; float:left; background:#DDF3FF url(http://images.cnblogs.com/cnblogs_com/rubylouvre/202680/o_pillar.gif) center center repeat-y; } .chart li em, .chart li span,.chart li strong { display:block; height:20px; text-align:center; } .chart li em, .chart li strong{ background: #DDF3FF; } .chart li span { height:100px; background:transparent url(http://images.cnblogs.com/cnblogs_com/rubylouvre/202680/o_mask.jpg) no-repeat; } </style> <head> <body> </body>

运行代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值