How can I make an Upvote/Downvote button?

前端 未结 2 885
半阙折子戏
半阙折子戏 2020-12-24 02:34

This is just for the styling, I\'m trying to make an upvote/downvote the same way that it\'s done on SO and Reddit, from what I can see they use arrow images as backgrounds

相关标签:
2条回答
  • 2020-12-24 02:50

    You can do it by using two simple images ... design two images in some image editors like Photoshop, if u don't have MSPaint...

    CSS code is

    #voting{
       width:30px;
       height:40px;
    }
    .upvote{
       width:30px;
       height: 20px;
       cursor: pointer;
    }
    .downvote{
       width:30px;
       height: 20px;
       background: url('downvote.jpg') 0 0 no-repeat;
       cursor: pointer;
    }
    

    HTML code :

    <div id="voting">
        <div class="upvote"></div>
        <div class="downvote"></div>
    </div>
    
    0 讨论(0)
  • 2020-12-24 03:01

    You could do it by adding a different picture to the background, one for every state of the button. There is however a cleaner, easier, more modern way of achieving this result: Sprites.

    A sprite is an image that is saved as a part of a larger image. One of the biggest advantages of using sprites is the reduction of round-trips to the server for all the images to just one request for the Sprites. The element to display a picture has the image as background. The background is moved relative to the element so the element displays only part of the image. Like when you move a photo-frame over a poster (or in this case: moving the poster under the frame)

    At SO they make an image that contains all the states for the button. They give the element for the button (a span in this case) a fixed width and height and add the background to it with CSS. Then toggle a class for the state (on or off) with javascript on the click event. Now the only thing you have to do in CSS is change the position of the background with CSS classes:

    for (const btn of document.querySelectorAll('.vote')) {
      btn.addEventListener('click', event => {
        event.target.classList.toggle('on');
      });
    }
    .vote {
      display: inline-block;
      overflow: hidden;
      width: 40px;
      height: 25px;
      cursor: pointer;
      background: url('http://i.stack.imgur.com/iqN2k.png');
      background-position: 0 -25px;
    } 
    
    
    .vote.on {
      background-position: 0 2px;
    }
    Click to vote: <span class="vote"> </span>

    You can easily add more states to the sprites like 'hover' and 'active' just the same way. SO even puts all the images for the whole page in a single image. You can verify this with firebug or the Chrome developer tools. Look for 'sprites.png'.

    0 讨论(0)
提交回复
热议问题