JQuery और CSS का उपयोग करके नंबर को स्टार रेटिंग डिस्प्ले में बदलें


101

मैं jquery प्लगइन को देख रहा हूं और सोच रहा था कि 5.8618164 सितारों से भरे 4.8618164 सितारों में नंबर (जैसे 4.8618164) को चालू करने के लिए उस प्लगइन को कैसे अनुकूलित किया जाए। मूल रूप से नंबर 5 की व्याख्या करते हुए सितारों को 5-सितारा रेटिंग सिस्टम में भरे गए jQuery का उपयोग करके / जे एस / सीएसएस।

ध्यान दें कि यह केवल पहले से उपलब्ध नंबर से सितारों की रेटिंग प्रदर्शित / प्रदर्शित करेगा और नई रेटिंग प्रस्तुतियाँ स्वीकार नहीं करेगा।


जवाबों:


255

यहां आपके लिए एक समाधान है, केवल एक बहुत छोटी और सरल छवि का उपयोग करके और एक स्वचालित रूप से उत्पन्न अवधि तत्व:

सीएसएस

span.stars, span.stars span {
    display: block;
    background: url(stars.png) 0 -16px repeat-x;
    width: 80px;
    height: 16px;
}

span.stars span {
    background-position: 0 0;
}

छवि

वैकल्पिक शब्द
(स्रोत: ulmanen.fi )

नोट: है नहीं ऊपर छवि को hotlink! फ़ाइल को अपने सर्वर पर कॉपी करें और वहां से इसका उपयोग करें।

jQuery

$.fn.stars = function() {
    return $(this).each(function() {
        // Get the value
        var val = parseFloat($(this).html());
        // Make sure that the value is in 0 - 5 range, multiply to get width
        var size = Math.max(0, (Math.min(5, val))) * 16;
        // Create stars holder
        var $span = $('<span />').width(size);
        // Replace the numerical value with stars
        $(this).html($span);
    });
}

यदि आप सितारों को केवल आधा या चौथाई स्टार आकार तक सीमित करना चाहते हैं, तो var sizeपंक्ति से पहले इनमें से एक पंक्ति जोड़ें:

val = Math.round(val * 4) / 4; /* To round to nearest quarter */
val = Math.round(val * 2) / 2; /* To round to nearest half */

एचटीएमएल

<span class="stars">4.8618164</span>
<span class="stars">2.6545344</span>
<span class="stars">0.5355</span>
<span class="stars">8</span>

प्रयोग

$(function() {
    $('span.stars').stars();
});

उत्पादन

फ़ॉग्यू आइकन सेट से छवि (www.pinvoke.com)
(स्रोत: ulmanen.fi )

डेमो

http://www.ulmanen.fi/stuff/stars.php

यह संभवतः आपकी आवश्यकताओं के अनुरूप होगा। इस पद्धति के साथ आपको किसी भी तीन तिमाही या व्हाट्सएप स्टार चौड़ाई की गणना करने की आवश्यकता नहीं है, बस इसे एक फ्लोट दें और यह आपको आपके सितारे देगा।


तारों को कैसे प्रस्तुत किया जाता है, इस पर एक छोटा विवरण क्रम में हो सकता है।

स्क्रिप्ट दो ब्लॉक स्तर स्पैन तत्वों को बनाता है। दोनों स्पैनों को आमतौर पर 80px * 16px और एक बैकग्राउंड इमेज स्टार्स का आकार मिलता है। png स्पैन घोंसले के शिकार होते हैं, ताकि स्पैन की संरचना इस तरह दिखे:

<span class="stars">
    <span></span>
</span>

बाहरी अवधि एक हो जाता है background-positionकी 0 -16px। जो बाहरी फैलाव में ग्रे सितारों को दिखाई देता है। चूंकि बाहरी स्पैन की ऊंचाई 16px है और repeat-x, इसमें केवल 5 ग्रे स्टार दिखाई देंगे।

दूसरी ओर के आंतरिक स्पैन में एक है background-position, 0 0जो केवल पीले तारों को दिखाई देता है।

यह निश्चित रूप से दो अलग-अलग इमेजफाइल्स, star_yellow.png और star_gray.png के साथ काम करेगा। लेकिन जैसा कि तारों की एक निश्चित ऊंचाई है, हम उन्हें आसानी से एक छवि में जोड़ सकते हैं। यह सीएसएस स्प्राइट तकनीक का उपयोग करता है ।

अब, जैसा कि स्पैन नेस्टेड हैं, वे स्वचालित रूप से एक-दूसरे के ऊपर ओवरले होते हैं। डिफ़ॉल्ट स्थिति में, जब दोनों स्पैन की चौड़ाई 80px होती है, तो पीले तारे ग्रे तारों को पूरी तरह से अस्पष्ट कर देते हैं।

लेकिन जब हम आंतरिक स्पैन की चौड़ाई को समायोजित करते हैं, तो पीले तारों की चौड़ाई कम हो जाती है, ग्रे सितारों को प्रकट करते हैं।

सुगम्यता-वार, यह समझदारी होगी कि फ्लोट नंबर को आंतरिक स्पैन के अंदर छोड़ दिया जाए और इसे छिपा दिया text-indent: -9999pxजाए, ताकि CSS से बंद लोग कम से कम तारों के बजाय फ्लोटिंग पॉइंट नंबर देख सकें।

उम्मीद है कि कुछ समझ में आया।


अपडेटेड 2010/10/22

अब और भी अधिक कॉम्पैक्ट और कठिन समझना! एक लाइनर के लिए भी निचोड़ा जा सकता है:

$.fn.stars = function() {
    return $(this).each(function() {
        $(this).html($('<span />').width(Math.max(0, (Math.min(5, parseFloat($(this).html())))) * 16));
    });
}

@ ततु, फलेशिंग का कोई भी मौका यह कैसे काम करता है के साथ थोड़ा और बाहर । JQuery का मेरा ज्ञान पूरी तरह से प्राप्त करने के लिए सिर्फ एक बालक है। मुझे लगता है कि मैं समझता हूं कि सीएसएस एक्स दिशा और 16 * 5 = 80 बिट में दोहराने के साथ कैसे काम करता है और आप पीले-स्टार की छवि की चौड़ाई को कैसे समायोजित करते हैं, लेकिन आप एक दूसरे से शीर्ष पर दो छवियों को कैसे ओवरले कर रहे हैं एकल छवि जिसमें एक तारा दूसरे से ऊपर है? क्या -16px ग्रे स्टार को पीले रंग के समान स्तर तक लाता है?
पैक्सिडाब्लो

अपडेट के लिए धन्यवाद, @ ततु, जो अब मेरे लिए बहुत अधिक समझ में आता है। दुर्भाग्य से मैं आपको पहले ही एक +1 दे चुका हूं, इसलिए मैं इसे दोबारा नहीं कर सकता, लेकिन उम्मीद है कि स्पष्टीकरण आपको कुछ और (अच्छी तरह से अर्जित) प्रतिनिधि कमाएगा। चीयर्स।
पैक्सिडाब्लो

2
@paxdiablo और अन्य, समर्थन के लिए धन्यवाद। शायद मुझे यह एक उचित jQuery प्लगइन बनाना चाहिए क्योंकि यह तकनीक सबसे आश्चर्यचकित करने वाली प्रतीत होती है :)
Tatu Ulmanen

@ ततु, बहुत धन्यवाद। मौजूदा फाइव स्टार प्लगइन्स सभी को एक ऐसा रूप चाहिए, जो किसी रेटिंग को इनपुट करने के लिए ठीक हो, लेकिन किसी संख्या के प्रतिनिधित्व को बदलने के लिए ओवरकिल कर सकता है।
vfilby

7
या उससे भी छोटा: jsbin.com/IBIDalEn/2/edit (पीएस जेएस में अनावश्यक सामान हटा दिया गया, सीएसएस चयनकर्ताओं का उपयोग किया और उपयोग किया गया max-width)।
रोको सी। बुल्जन

30

यदि आपको केवल आधुनिक ब्राउज़रों का समर्थन करना है, तो आप इससे दूर हो सकते हैं:

  • कोई चित्र नहीं ;
  • ज्यादातर स्थिर सीएसएस;
  • लगभग कोई jQuery या जावास्क्रिप्ट नहीं;

आपको केवल संख्या को a class, उदा class='stars-score-50'

पहले "रेंडर" मार्कअप का एक डेमो:

body { font-size: 18px; }

.stars-container {
  position: relative;
  display: inline-block;
  color: transparent;
}

.stars-container:before {
  position: absolute;
  top: 0;
  left: 0;
  content: '★★★★★';
  color: lightgray;
}

.stars-container:after {
  position: absolute;
  top: 0;
  left: 0;
  content: '★★★★★';
  color: gold;
  overflow: hidden;
}

.stars-0:after { width: 0%; }
.stars-10:after { width: 10%; }
.stars-20:after { width: 20%; }
.stars-30:after { width: 30%; }
.stars-40:after { width: 40%; }
.stars-50:after { width: 50%; }
.stars-60:after { width: 60%; }
.stars-70:after { width: 70%; }
.stars-80:after { width: 80%; }
.stars-90:after { width: 90%; }
.stars-100:after { width: 100; }
Within block level elements:

<div><span class="stars-container stars-0">★★★★★</span></div>
<div><span class="stars-container stars-10">★★★★★</span></div>
<div><span class="stars-container stars-20">★★★★★</span></div>
<div><span class="stars-container stars-30">★★★★★</span></div>
<div><span class="stars-container stars-40">★★★★★</span></div>
<div><span class="stars-container stars-50">★★★★★</span></div>
<div><span class="stars-container stars-60">★★★★★</span></div>
<div><span class="stars-container stars-70">★★★★★</span></div>
<div><span class="stars-container stars-80">★★★★★</span></div>
<div><span class="stars-container stars-90">★★★★★</span></div>
<div><span class="stars-container stars-100">★★★★★</span></div>

<p>Or use it in a sentence: <span class="stars-container stars-70">★★★★★</span> (cool, huh?).</p>

फिर एक डेमो जो कोड के एक मूत का उपयोग करता है:

$(function() {
  function addScore(score, $domElement) {
    $("<span class='stars-container'>")
      .addClass("stars-" + score.toString())
      .text("★★★★★")
      .appendTo($domElement);
  }

  addScore(70, $("#fixture"));
});
body { font-size: 18px; }

.stars-container {
  position: relative;
  display: inline-block;
  color: transparent;
}

.stars-container:before {
  position: absolute;
  top: 0;
  left: 0;
  content: '★★★★★';
  color: lightgray;
}

.stars-container:after {
  position: absolute;
  top: 0;
  left: 0;
  content: '★★★★★';
  color: gold;
  overflow: hidden;
}

.stars-0:after { width: 0%; }
.stars-10:after { width: 10%; }
.stars-20:after { width: 20%; }
.stars-30:after { width: 30%; }
.stars-40:after { width: 40%; }
.stars-50:after { width: 50%; }
.stars-60:after { width: 60%; }
.stars-70:after { width: 70%; }
.stars-80:after { width: 80%; }
.stars-90:after { width: 90%; }
.stars-100:after { width: 100; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Generated: <div id="fixture"></div>

इस समाधान के सबसे बड़े स्तर हैं:

  1. सही चौड़ाई उत्पन्न करने के लिए आपको तत्व के अंदर तारों की आवश्यकता होती है;
  2. कोई शब्दार्थ मार्कअप नहीं है, जैसे आप तत्व के अंदर पाठ के रूप में स्कोर पसंद करेंगे;
  3. यह केवल उतने ही अंकों के लिए अनुमति देता है जितनी आपके पास कक्षाएं होंगी (क्योंकि हम एक छद्म तत्व पर सटीक सेट करने के लिए जावास्क्रिप्ट का उपयोग नहीं कर सकते हैंwidth )।

इसे ठीक करने के लिए ऊपर दिए गए समाधान को आसानी से घुमाया जा सकता है। :beforeऔर :afterबिट्स डोम में वास्तविक तत्व बनने के लिए (ताकि हम उस के लिए कुछ जे एस की जरूरत है) की जरूरत है।

उत्तरार्द्ध पाठक के लिए एक उत्कृष्टता के रूप में छोड़ दिया जाता है।


3
मैंने फ़्लोट्स के लिए समायोजित करने के लिए इस समाधान को बढ़ाया और गतिशील रूप से उत्पन्न स्कोर जो 100 के 10 वें हिस्से में फिट नहीं होते हैंकोडपेन । मुझे शुरू करने के लिए धन्यवाद: D
कैमेक

यह एक बहुत प्यारी स्क्रिप्ट है
निक डिव

1
सही समाधान। आपने मेरा दिन बना दिया । धन्यवाद @ जेरोइन ... पत्थरबाजी करते रहो।
प्रभु नंदन कुमार

22

इस jquery सहायक फ़ंक्शन / फ़ाइल का प्रयास करें

jquery.Rating.js

//ES5
$.fn.stars = function() {
    return $(this).each(function() {
        var rating = $(this).data("rating");
        var fullStar = new Array(Math.floor(rating + 1)).join('<i class="fas fa-star"></i>');
        var halfStar = ((rating%1) !== 0) ? '<i class="fas fa-star-half-alt"></i>': '';
        var noStar = new Array(Math.floor($(this).data("numStars") + 1 - rating)).join('<i class="far fa-star"></i>');
        $(this).html(fullStar + halfStar + noStar);
    });
}

//ES6
$.fn.stars = function() {
    return $(this).each(function() {
        const rating = $(this).data("rating");
        const numStars = $(this).data("numStars");
        const fullStar = '<i class="fas fa-star"></i>'.repeat(Math.floor(rating));
        const halfStar = (rating%1!== 0) ? '<i class="fas fa-star-half-alt"></i>': '';
        const noStar = '<i class="far fa-star"></i>'.repeat(Math.floor(numStars-rating));
        $(this).html(`${fullStar}${halfStar}${noStar}`);
    });
}

index.html

   <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Star Rating</title>
        <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.9.0/css/all.min.css" rel="stylesheet">
        <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
        <script src="js/jquery.Rating.js"></script>
        <script>
            $(function(){
                $('.stars').stars();
            });
        </script>
    </head>
    <body>

        <span class="stars" data-rating="3.5" data-num-stars="5" ></span>

    </body>
    </html>

स्क्रीनशॉट


बस ध्यान दें कि समापन </ script> टैग गायब है :)
Rob Stocki

7

क्यों न केवल एक स्टार की पांच अलग-अलग छवियां (खाली, क्वार्टर-फुल, हाफ-फुल, थ्री-क्वार्टर-फुल और फुल) हों, तो बस अपने डोम में छवियों को 4 से गुणा की गई रेटिंग के छंटनी या रौशन के आधार पर इंजेक्ट करें ( तिमाहियों के लिए एक पूर्ण अंक प्राप्त करने के लिए)?

उदाहरण के लिए, 4.8618164 को 4 से गुणा किया गया और 19 को गोल किया गया, जो चार और तीन चौथाई सितारे होंगे।

वैकल्पिक रूप से (यदि आप मेरी तरह आलसी हैं), तो बस एक छवि 21 से चुनी गई है (एक-चौथाई वेतन वृद्धि में 5 सितारों के माध्यम से) और उपरोक्त मान के आधार पर एकल छवि का चयन करें। तब यह केवल एक गणना है जिसके बाद DOM में एक छवि परिवर्तन होता है (पांच अलग-अलग छवियों को बदलने की कोशिश करने के बजाय)।


5

मैंने क्लाइंट-साइड रेंडर लैग से बचने के लिए पूरी तरह से JS-free जाना शुरू कर दिया। इसे पूरा करने के लिए, मैं इस तरह से HTML उत्पन्न करता हूं:

<span class="stars" title="{value as decimal}">
    <span style="width={value/5*100}%;"/>
</span>

अभिगम्यता के साथ मदद करने के लिए, मैं शीर्षक विशेषता में कच्ची रेटिंग मान भी जोड़ता हूं।


4

प्रोटोटाइप के बिना jquery का उपयोग करते हुए, js कोड को अपडेट करें

$( ".stars" ).each(function() { 
    // Get the value
    var val = $(this).data("rating");
    // Make sure that the value is in 0 - 5 range, multiply to get width
    var size = Math.max(0, (Math.min(5, val))) * 16;
    // Create stars holder
    var $span = $('<span />').width(size);
    // Replace the numerical value with stars
    $(this).html($span);
});

मैंने स्पैन में डेटा-रेटिंग के नाम से एक डेटा विशेषता भी जोड़ी।

<span class="stars" data-rating="4" ></span>

2

डेमो

आप इसे केवल 2 छवियों के साथ कर सकते हैं। 1 खाली तारे, 1 भरे हुए तारे।

ओवरले छवि दूसरे के शीर्ष पर भरी हुई है। और रेटिंग संख्या को प्रतिशत में परिवर्तित करें और इसे भराव छवि की चौड़ाई के रूप में उपयोग करें।

यहां छवि विवरण दर्ज करें

.containerdiv {
  border: 0;
  float: left;
  position: relative;
  width: 300px;
} 
.cornerimage {
  border: 0;
  position: absolute;
  top: 0;
  left: 0;
  overflow: hidden;
 } 
 img{
   max-width: 300px;
 }

0

यहाँ मेरा JSX और फ़ॉन्ट भयानक का उपयोग कर, केवल .5 सटीकता पर सीमित है, हालांकि:

       <span>
          {Array(Math.floor(rating)).fill(<i className="fa fa-star"></i>)}
          {(rating) - Math.floor(rating)==0 ? ('') : (<i className="fa fa-star-half"></i>)}
       </span>

पहली पंक्ति पूरे स्टार के लिए है और दूसरी पंक्ति आधे स्टार के लिए है (यदि कोई हो)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.