JQuery এবং CSS ব্যবহার করে একটি নম্বরকে তারকা রেটিং ডিসপ্লেতে পরিণত করুন


101

আমি jquery প্লাগইনটির দিকে তাকিয়ে ছিলাম এবং ভাবছিলাম যে কীভাবে 5 টির মধ্যে ভরাট 4.8618164 নম্বরে একটি সংখ্যাকে (4.8618164 এর মতো) রূপান্তর করতে সেই প্লাগইনটিকে কীভাবে রূপান্তর করতে হবে? / জেএস / সিএসএস।

মনে রাখবেন যে এটি ইতিমধ্যে উপলব্ধ নম্বর থেকে কেবল তারাগুলি রেটিং প্রদর্শন / প্রদর্শন করবে এবং নতুন রেটিং জমাগুলি গ্রহণ করবে না।


উত্তর:


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 )

দ্রষ্টব্য: উপরের চিত্রটিতে হটলিঙ্ক করবেন না ! আপনার নিজের সার্ভারে ফাইলটি অনুলিপি করুন এবং সেখান থেকে এটি ব্যবহার করুন।

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 আকার এবং একটি ব্যাকগ্রাউন্ড ইমেজ তারকারা পেয়েছে। স্প্যানগুলি বাসা বেঁধেছে, যাতে স্প্যানগুলির কাঠামোটি দেখতে এইরকম হয়:

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

বাইরের বিঘত একটি পায় background-positionএর 0 -16px। এটি বাইরের স্প্যানের ধূসর তারাগুলি দৃশ্যমান করে তোলে। বাইরের স্প্যানটির উচ্চতা 16px এবং repeat-xএটি কেবল 5 ধূসর তারা দেখায়।

অন্যদিকে অভ্যন্তরীণ স্প্যানগুলির মধ্যে একটি background-positionরয়েছে 0 0যা কেবল হলুদ নক্ষত্রকে দৃশ্যমান করে।

এটি অবশ্যই দুটি পৃথক চিত্রের ফাইল, স্টার_ইলো.পিএনজি এবং স্টার_গ্রায়.পিএনএ সাথে কাজ করবে। তবে তারকাদের একটি নির্দিষ্ট উচ্চতা হওয়ায় আমরা এগুলি সহজেই একটি চিত্রের সাথে সংযুক্ত করতে পারি। এটি সিএসএস স্প্রাইট কৌশলটি ব্যবহার করে ।

এখন, স্প্যানগুলি যেমন বাসা বেঁধেছে, সেগুলি স্বয়ংক্রিয়ভাবে একে অপরের উপরে আবৃত। ডিফল্ট ক্ষেত্রে, যখন উভয় স্প্যানের প্রস্থ 80px হয়, হলুদ তারাগুলি ধূসর তারাগুলি পুরোপুরি অস্পষ্ট করে।

তবে যখন আমরা অভ্যন্তরের স্প্যানটির প্রস্থ সামঞ্জস্য করি তখন ধূসর নক্ষত্র প্রকাশ করে হলুদ তারাগুলির প্রস্থ হ্রাস পায়।

অ্যাক্সেসযোগ্যতা অনুসারে, অভ্যন্তরের স্প্যানের অভ্যন্তরে ভাসমান নম্বরটি রেখে এটি লুকিয়ে রাখাই বুদ্ধিমানের কাজ হত text-indent: -9999px, যাতে সিএসএস বন্ধ হওয়া লোকেরা তারার পরিবর্তে কমপক্ষে ভাসমান পয়েন্ট নম্বরটি দেখতে পারে would

আশা করি কিছুটা বোধগম্য হয়েছিল।


আপডেট হয়েছে 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 সম্পর্কিত জ্ঞান সম্পূর্ণরূপে এটি পেতে কেবল একটি ছোট্ট ছোট। আমি মনে করি যে আমি কীভাবে সিএসএস x নির্দেশ এবং 16 * 5 = 80 বিটের পুনরাবৃত্তি নিয়ে কাজ করে এবং আপনি কীভাবে হলুদ-তারা চিত্রটির প্রস্থটি সামঞ্জস্য করেন তবে কীভাবে আপনি একটি থেকে একে অপরের শীর্ষে দুটি চিত্রকে উপস্থাপন করছেন একক ছবিতে একের ওপরে একটি তারা রয়েছে? -16px ধূসর তারাটিকে কি হলুদ রঙের সমান স্তরে নিয়ে আসে?
paxdiablo

@ তাতু, এই আপডেটের জন্য ধন্যবাদ যা এখন আমার কাছে আরও অনেক কিছু বোঝায়। দুর্ভাগ্যক্রমে আমি আপনাকে ইতিমধ্যে একটি +1 দিয়েছি যাতে আমি এটি আর করতে পারি না তবে আশা করি ব্যাখ্যাটি আপনাকে আরও কিছু (উপার্জিত) উপার্জন করবে। চিয়ার্স।
প্যাক্সিডিয়াবলো

2
@ প্যাক্সিয়াব্লো এবং অন্যান্যরা, সমর্থনের জন্য ধন্যবাদ। সম্ভবত এই কৌশলটি বেশিরভাগের কাছে অবাক হওয়ার মতো বলে মনে হচ্ছে সম্ভবত:
তাতু উলমানেন

@ তাতু, অসংখ্য ধন্যবাদ বিদ্যমান ফাইভ স্টার প্লাগইনগুলি এমন একটি ফর্ম চাইছে যা কোনও রেটিংকে ইনপুট দেওয়ার জন্য ভাল তবে কোনও সংখ্যার উপস্থাপনা পরিবর্তন করার জন্য ওভারকিলের উপায়।
vfilby

7
বা এমনকি আরও ছোট: jsbin.com/IBIDalEn/2/edit (পিএস জেএসে অপ্রয়োজনীয় স্টাফ সরিয়েছে, সিএসএস নির্বাচককে minified করেছে এবং ব্যবহৃত হয়েছে max-width)।
রোকো সি বুলজান

30

আপনার যদি কেবল আধুনিক ব্রাউজারগুলিকে সমর্থন করতে হয় তবে আপনি এখান থেকে সরে যেতে পারেন:

  • কোনও চিত্র নেই ;
  • বেশিরভাগ স্থির সিএসএস;
  • প্রায় jQuery বা জাভাস্ক্রিপ্ট নেই;

আপনার কেবলমাত্র নম্বরটি রূপান্তর করতে হবে 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বিট DOM মধ্যে প্রকৃত উপাদানের পরিণত (তাই আমরা যে জন্য কিছু জাতীয় প্রয়োজন) প্রয়োজন।

পরেরটি পাঠকের জন্য একটি অংশ হিসাবে রেখে গেছে।


3
আমি এই সমাধান বাড়ানো ভাসে এবং পরিবর্তনশীল উত্পন্ন স্কোর করে একটি 100 10ths মধ্যে মাপসই করা না মিটমাট করা Codepen । আমাকে শুরু করার জন্য ধন্যবাদ: ডি
ক্যামিক

এটি একটি খুব মিষ্টি স্ক্রিপ্ট
নিক ডিভ

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>

স্ক্রিনশট


কেবল একটি নোট যে সমাপনী </ translation> ট্যাগটি অনুপস্থিত :)
রব স্টকি

7

কেন কেবল তারার পাঁচটি পৃথক চিত্র নেই (খালি, চতুর্থাংশ পূর্ণ, অর্ধ পূর্ণ, তিন-চতুর্থাংশ পূর্ণ এবং পূর্ণ) তারপরে কেবল আপনার ডিওমে চিত্রগুলি ইনজেক্ট করুন 4 এর দ্বারা গুণিত রেটিংয়ের কাটা বা রাউন্ডযুক্ত মানের উপর নির্ভর করে কোয়ার্টারের জন্য পুরো নাম্বার পেতে)?

উদাহরণস্বরূপ, 4.8618164 4 দ্বারা গুণিত হয়েছে এবং বৃত্তাকার 19 হবে যা চার এবং তিনটি কোয়ার্টার তারকা হবে।

বিকল্পভাবে (আপনি যদি আমার মতো অলস হন), কেবল 21 থেকে একটি চিত্র নির্বাচন করুন (এক চতুর্থাংশ ইনক্রিমেন্টে 5 তারা থেকে 0 টি তারকা) এবং উপরোক্ত মানটির ভিত্তিতে একক চিত্র নির্বাচন করুন। তারপরে এটি কেবলমাত্র একটি গণনা যার পরে ডিওমে একটি চিত্র পরিবর্তন হয় (পাঁচটি পৃথক চিত্র পরিবর্তনের চেষ্টা করার চেয়ে)।


5

ক্লায়েন্ট-সাইড রেন্ডার ল্যাগ এড়াতে আমি পুরোপুরি জেএস-ফ্রি হয়ে শেষ করেছি। এটি সম্পাদন করার জন্য, আমি এই জাতীয় এইচটিএমএল তৈরি করি:

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

অ্যাক্সেসযোগ্যতার সাথে সহায়তা করতে, এমনকি আমি শিরোনাম বৈশিষ্ট্যে কাঁচা রেটিং মান যুক্ত করি।


4

প্রোটোটাইপ ছাড়াই jquery ব্যবহার করে, জেএস কোড আপডেট করুন

$( ".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

এখানে জেএসএক্স এবং দুর্দান্ত ফন্টটি ব্যবহার করে আমার নেওয়ার বিষয়টি কেবলমাত্র .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>

প্রথম সারিটি পুরো তারাটির জন্য এবং দ্বিতীয় সারিটি অর্ধ তারাটির জন্য (যদি থাকে)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.