Skip to content Skip to sidebar Skip to footer

Creating A Dynamic Tank Level/meter Using Html And Css

I am currently having problems creating a 'tank gauging system' within my project. I am using MVC and the by using the following markup, I have achieved this: by using: #container

Solution 1:

If you just need to fill the tank, you may use a much simpler stucture to build the tank with two HTML elements, border-radius and a pseudo element.

Then you can use JS to change the height of the green area according to the value entered in the custom data attribute data-amount of the .tk div :

DEMO (change the value of the custom data attribute data-amount in the .tk div to change the height of the liquid).

var amount = $('.tk').attr('data-amount'),
    height = amount * 80/100 + 20;

$('.lq').css({height : height + '%'});
.tk{ /*Liquid Section*/position:relative;
    width:40%; 
    height:130px;
    padding-top:50px;
    margin: 0 auto;
    background:rgba(56,56,56,0.8);
    border-radius: 100%/40px;
    border-bottom:3px solid #000;
    text-align:center;
    z-index:1;
    overflow:hidden;

}
.tk:after, .lq{
    content:'';
    position:absolute;
    top:0; left:0;
    width:100%;
    height:20%;
    z-index:-1;
}
.lq{
    background:rgba(128,128,128,0.99);
    height:80%;
    top:-2px;
    border-radius:100%/40px;
    border-bottom:3px solid #000;
}
.tk:after{
    height:20%;
    border:1px solid #000;
    border-radius:100%; /*makes circle at top*/
}
<scriptsrc="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script><divclass="tk"data-amount="40">
    40%
    <divclass="lq"></div></div>

Solution 2:

Although @web-tiki answer is perfectly good and accepted, I thought I must add another option for simple use-cases.

The following might not have been available or widely adopted at the time of the question, as it involves the HTMl5 tag </meter>

If the pseudo-3d effect is not a must, you could use the not-so-known HTML5 built in <meter>element. I have used it occasionally in the past.

basic syntax :

<meter id="fuel" name="fuel-so-so"
       min="0" max="100"
       low="33" high="66" optimum="80"
       value="50">
    at 50/100
</mete

It is basically designed for such tasks, The only thing that you need to do is to rotate it 90 ( or 270 ) degrees. and for that you could use CSS. ( Fiddle )

It is also easily styled. other examples here and here.

of course it will not produce the same exact effect out-of-the-box ( like the accepted answer ) but I think it is still an option worth mentioning for future users who will bump into this question. ( and with some transparent-png overlay, it can actually be exactly the same.. )

For the JS part, a simple document.getElementById('fuel').setAttribute('value', myValue);should do the trick.

Another somewhat related SO question with nice fiddle to demonstrate dynamic control : how to change <meter> values?

Solution 3:

I think I have achieved the requested, by playing around with positioning (absolute will respect the parent block element with position relative or absolute - so it is easier to just use bottom: 0 - also that makes the div to increase its height from botton to top automatically)

html

<divclass="tk"><h3class="text"></h3><divclass="lq"data-amount="69"><divclass="ring"></div></div></div>

css file:

.tk {
    position:relative;
    width:40%; 
    height:100px;
    padding-top:40px;
    margin: 0 auto;
    background:rgba(56,56,56,0.8);
    border-radius: 100%/40px;
    border-bottom:3px solid #000;
    text-align:center;
    z-index:1;
    overflow:hidden;
    }
    
.lq {
  position: absolute;
  background:rgba(128,128,128,0.99);
  width: 100%;
  height:0;
  bottom: 0;
  border-radius:100%/40px;
  border-bottom:3px solid #000;
}


.ring {
  position: absolute;
  border-radius:100%;
  top: 0;
  width: 100%;
  height:40%;
  content: '';
  border:1px solid #000;
}
    
.text {
  display: block;
  position:absolute;
  top: 45%;
  left: 45%;
  z-index: 1;
}

js file (with jquery):

var quantity = amount;
$(this).find('.lq').animate({'height' : parseInt(amount) + '%'},1000);
  $('.ring').css({height : 100 - amount + 10 + '%'});
  $('.text').text(quantity  + '%'); 
  });
  $('.text').each(function(){
    var $this = $(this);
     jQuery({ Counter: 0 }).animate({ Counter: $this.text() }, {
    duration: 1000,
    easing: 'swing',
    step: function () {
      $this.text(Math.ceil(this.Counter) + "%");
    }
  });
  });
});

https://jsfiddle.net/DimK10/oqfz56ys/72/

Post a Comment for "Creating A Dynamic Tank Level/meter Using Html And Css"