jQuery menghidupkan backgroundColor


327

Saya mencoba menganimasikan perubahan pada backgroundColor menggunakan jQuery pada mouseover.

Saya telah memeriksa beberapa contoh dan saya tampaknya benar, ia bekerja dengan properti lain seperti fontSize, tetapi dengan backgroundColor saya dapatkan dan kesalahan js "Invalid Property". Elemen yang saya kerjakan adalah sebuah div.

$(".usercontent").mouseover(function() {
    $(this).animate({ backgroundColor: "olive" }, "slow");
});

Ada ide?


Untuk jquery 1.4.2 dengan efek jquery 1.8 saya harus mengakui bahwa solusi Andrew berfungsi dengan sempurna. Lihat postingnya di bawah.
Patrick Desjardins

1
Catatan: plugin ini mendeteksi warna latar belakang elemen saat ini - browser Chrome mengembalikan rgba(0, 0, 0, 0)nilai kosong / null yang diharapkan saat tidak ada warna latar yang ditentukan. Untuk "memperbaiki" ini, elemen harus memiliki warna latar belakang awal.
Shadow Wizard adalah Ear For You

Halaman yang ditautkan tampaknya rusak (setidaknya halaman proyek dan halaman demo).
Paolo Stefan

Jawaban:


333

Plugin warna hanya 4kb jauh lebih murah daripada perpustakaan UI. Tentu saja Anda akan ingin menggunakan versi plugin yang layak dan bukan buggy old thing yang tidak menangani Safari dan crash ketika transisinya terlalu cepat. Karena versi yang diperkecil tidak disediakan, Anda mungkin ingin menguji berbagai kompresor dan membuat versi min Anda sendiri . YUI mendapatkan kompresi terbaik dalam hal ini hanya membutuhkan 2317 byte dan karena sangat kecil - ini dia:

(function (d) {
    d.each(["backgroundColor", "borderBottomColor", "borderLeftColor", "borderRightColor", "borderTopColor", "color", "outlineColor"], function (f, e) {
        d.fx.step[e] = function (g) {
            if (!g.colorInit) {
                g.start = c(g.elem, e);
                g.end = b(g.end);
                g.colorInit = true
            }
            g.elem.style[e] = "rgb(" + [Math.max(Math.min(parseInt((g.pos * (g.end[0] - g.start[0])) + g.start[0]), 255), 0), Math.max(Math.min(parseInt((g.pos * (g.end[1] - g.start[1])) + g.start[1]), 255), 0), Math.max(Math.min(parseInt((g.pos * (g.end[2] - g.start[2])) + g.start[2]), 255), 0)].join(",") + ")"
        }
    });

    function b(f) {
        var e;
        if (f && f.constructor == Array && f.length == 3) {
            return f
        }
        if (e = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(f)) {
            return [parseInt(e[1]), parseInt(e[2]), parseInt(e[3])]
        }
        if (e = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(f)) {
            return [parseFloat(e[1]) * 2.55, parseFloat(e[2]) * 2.55, parseFloat(e[3]) * 2.55]
        }
        if (e = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(f)) {
            return [parseInt(e[1], 16), parseInt(e[2], 16), parseInt(e[3], 16)]
        }
        if (e = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(f)) {
            return [parseInt(e[1] + e[1], 16), parseInt(e[2] + e[2], 16), parseInt(e[3] + e[3], 16)]
        }
        if (e = /rgba\(0, 0, 0, 0\)/.exec(f)) {
            return a.transparent
        }
        return a[d.trim(f).toLowerCase()]
    }
    function c(g, e) {
        var f;
        do {
            f = d.css(g, e);
            if (f != "" && f != "transparent" || d.nodeName(g, "body")) {
                break
            }
            e = "backgroundColor"
        } while (g = g.parentNode);
        return b(f)
    }
    var a = {
        aqua: [0, 255, 255],
        azure: [240, 255, 255],
        beige: [245, 245, 220],
        black: [0, 0, 0],
        blue: [0, 0, 255],
        brown: [165, 42, 42],
        cyan: [0, 255, 255],
        darkblue: [0, 0, 139],
        darkcyan: [0, 139, 139],
        darkgrey: [169, 169, 169],
        darkgreen: [0, 100, 0],
        darkkhaki: [189, 183, 107],
        darkmagenta: [139, 0, 139],
        darkolivegreen: [85, 107, 47],
        darkorange: [255, 140, 0],
        darkorchid: [153, 50, 204],
        darkred: [139, 0, 0],
        darksalmon: [233, 150, 122],
        darkviolet: [148, 0, 211],
        fuchsia: [255, 0, 255],
        gold: [255, 215, 0],
        green: [0, 128, 0],
        indigo: [75, 0, 130],
        khaki: [240, 230, 140],
        lightblue: [173, 216, 230],
        lightcyan: [224, 255, 255],
        lightgreen: [144, 238, 144],
        lightgrey: [211, 211, 211],
        lightpink: [255, 182, 193],
        lightyellow: [255, 255, 224],
        lime: [0, 255, 0],
        magenta: [255, 0, 255],
        maroon: [128, 0, 0],
        navy: [0, 0, 128],
        olive: [128, 128, 0],
        orange: [255, 165, 0],
        pink: [255, 192, 203],
        purple: [128, 0, 128],
        violet: [128, 0, 128],
        red: [255, 0, 0],
        silver: [192, 192, 192],
        white: [255, 255, 255],
        yellow: [255, 255, 0],
        transparent: [255, 255, 255]
    }
})(jQuery);

2
Baiklah, buka tautan yang diusulkan Andrew. Unduh file. Anda perlu menambahkannya ke proyek Anda. Anda masih dapat memiliki jquery.effects.core di proyek Anda ini akan bekerja dengan sempurna. Terima kasih atas jawabannya. +1
Patrick Desjardins

3
Saya hanya menempelkan file di atas ke dalam file 'jquery-ui-1.8.2.min.js' saya yang sudah ada dan ... semuanya masih berfungsi :-)
Dave Everitt

7
Saya ingin mencatat, pada tahun lalu (2011) penulis plugin ini merilis versi 2 yang memiliki banyak fitur bagus di dalamnya, tetapi tidak diperlukan untuk fungsi dasar lib ini biasanya dicari untuk. Sekarang 20 + kb besar. Anda dapat memilih v1cabang untuk mendapatkan versi yang lama (Yang masih berfungsi) tetapi jauh lebih ringan.
Aren

6
FWIW - Anda dapat menghapus pemetaan warna-ke-rgb dalam kode dan mengurangi ukuran lebih lanjut: raw.github.com/gist/1891361/… . Kelemahannya adalah Anda tidak dapat menggunakan nama warna untuk animasi. Anda harus menggunakan nilai rgb.
Niyaz

4
jQuery 1.8 memecah plug ini di btw. curCSS tidak ada di jQuery lagi.
Rich Bradshaw

68

Saya memiliki masalah yang sama dan memperbaikinya dengan memasukkan jQuery UI. Ini skrip lengkapnya:

<!-- include Google's AJAX API loader -->
<script src="http://www.google.com/jsapi"></script>
<!-- load JQuery and UI from Google (need to use UI to animate colors) -->
<script type="text/javascript">
google.load("jqueryui", "1.5.2");
</script>


<script type="text/javascript">
$(document).ready(function() {
$('#menu ul li.item').hover(
    function() {
        $(this).stop().animate({backgroundColor:'#4E1402'}, 300);
        }, function () {
        $(this).stop().animate({backgroundColor:'#943D20'}, 100);
    });
});
</script>

61

Lakukan dengan Transisi CSS3. Dukungan luar biasa (semua browser modern, bahkan IE). Dengan Kompas dan SASS ini dengan cepat dilakukan:

#foo {background:red; @include transition(background 1s)}
#foo:hover {background:yellow}

CSS murni:

#foo {
background:red;
-webkit-transition:background 1s;
-moz-transition:background 1s;
-o-transition:background 1s;
transition:background 1s
}
#foo:hover {background:yellow}

Saya telah menulis artikel berbahasa Jerman tentang topik ini: http://www.solife.cc/blog/animation-farben-css3-transition.html


6
Bermain biar dengan hover dan klik transisi di: jsfiddle.net/K5Qyx
Dem Pilafian


13

Anda dapat menggunakan jQuery UI untuk menambahkan fungsi ini. Anda dapat mengambil apa yang Anda butuhkan, jadi jika Anda ingin menghidupkan warna, yang harus Anda sertakan adalah kode berikut. Saya mendapat if dari jQuery UI terbaru (saat ini 1.8.14)

/******************************************************************************/
/****************************** COLOR ANIMATIONS ******************************/
/******************************************************************************/

// override the animation for color styles
$.each(['backgroundColor', 'borderBottomColor', 'borderLeftColor',
    'borderRightColor', 'borderTopColor', 'borderColor', 'color', 'outlineColor'],
function(i, attr) {
    $.fx.step[attr] = function(fx) {
        if (!fx.colorInit) {
            fx.start = getColor(fx.elem, attr);
            fx.end = getRGB(fx.end);
            fx.colorInit = true;
        }

        fx.elem.style[attr] = 'rgb(' +
            Math.max(Math.min(parseInt((fx.pos * (fx.end[0] - fx.start[0])) + fx.start[0], 10), 255), 0) + ',' +
            Math.max(Math.min(parseInt((fx.pos * (fx.end[1] - fx.start[1])) + fx.start[1], 10), 255), 0) + ',' +
            Math.max(Math.min(parseInt((fx.pos * (fx.end[2] - fx.start[2])) + fx.start[2], 10), 255), 0) + ')';
    };
});

// Color Conversion functions from highlightFade
// By Blair Mitchelmore
// http://jquery.offput.ca/highlightFade/

// Parse strings looking for color tuples [255,255,255]
function getRGB(color) {
        var result;

        // Check if we're already dealing with an array of colors
        if ( color && color.constructor == Array && color.length == 3 )
                return color;

        // Look for rgb(num,num,num)
        if (result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color))
                return [parseInt(result[1],10), parseInt(result[2],10), parseInt(result[3],10)];

        // Look for rgb(num%,num%,num%)
        if (result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(color))
                return [parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55];

        // Look for #a0b1c2
        if (result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(color))
                return [parseInt(result[1],16), parseInt(result[2],16), parseInt(result[3],16)];

        // Look for #fff
        if (result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(color))
                return [parseInt(result[1]+result[1],16), parseInt(result[2]+result[2],16), parseInt(result[3]+result[3],16)];

        // Look for rgba(0, 0, 0, 0) == transparent in Safari 3
        if (result = /rgba\(0, 0, 0, 0\)/.exec(color))
                return colors['transparent'];

        // Otherwise, we're most likely dealing with a named color
        return colors[$.trim(color).toLowerCase()];
}

function getColor(elem, attr) {
        var color;

        do {
                color = $.curCSS(elem, attr);

                // Keep going until we find an element that has color, or we hit the body
                if ( color != '' && color != 'transparent' || $.nodeName(elem, "body") )
                        break;

                attr = "backgroundColor";
        } while ( elem = elem.parentNode );

        return getRGB(color);
};

Ini hanya 1.43kb setelah dikompresi dengan YUI:

$.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor","borderTopColor","borderColor","color","outlineColor"],function(b,a){$.fx.step[a]=function(c){if(!c.colorInit){c.start=getColor(c.elem,a);c.end=getRGB(c.end);c.colorInit=true}c.elem.style[a]="rgb("+Math.max(Math.min(parseInt((c.pos*(c.end[0]-c.start[0]))+c.start[0],10),255),0)+","+Math.max(Math.min(parseInt((c.pos*(c.end[1]-c.start[1]))+c.start[1],10),255),0)+","+Math.max(Math.min(parseInt((c.pos*(c.end[2]-c.start[2]))+c.start[2],10),255),0)+")"}});function getRGB(b){var a;if(b&&b.constructor==Array&&b.length==3){return b}if(a=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(b)){return[parseInt(a[1],10),parseInt(a[2],10),parseInt(a[3],10)]}if(a=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(b)){return[parseFloat(a[1])*2.55,parseFloat(a[2])*2.55,parseFloat(a[3])*2.55]}if(a=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(b)){return[parseInt(a[1],16),parseInt(a[2],16),parseInt(a[3],16)]}if(a=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(b)){return[parseInt(a[1]+a[1],16),parseInt(a[2]+a[2],16),parseInt(a[3]+a[3],16)]}if(a=/rgba\(0, 0, 0, 0\)/.exec(b)){return colors.transparent}return colors[$.trim(b).toLowerCase()]}function getColor(c,a){var b;do{b=$.curCSS(c,a);if(b!=""&&b!="transparent"||$.nodeName(c,"body")){break}a="backgroundColor"}while(c=c.parentNode);return getRGB(b)};

Anda juga dapat menghidupkan warna menggunakan transisi CSS3 tetapi hanya didukung oleh peramban modern.

a.test {
  color: red;
  -moz-transition-property: color;  /* FF4+ */
  -moz-transition-duration: 1s;
  -webkit-transition-property: color;  /* Saf3.2+, Chrome */
  -webkit-transition-duration: 1s;
  -o-transition-property: color;  /* Opera 10.5+ */
  -o-transition-duration: 1s;
  -ms-transition-property: color;  /* IE10? */
  -ms-transition-duration: 1s;
  transition-property: color;  /* Standard */
  transition-duration: 1s;
  }

  a.test:hover {
  color: blue;
  }

Menggunakan properti steno:

/* shorthand notation for transition properties */
/* transition: [transition-property] [transition-duration] [transition-timing-function] [transition-delay]; */

a.test {
  color: red;
  -moz-transition: color 1s;
  -webkit-transition: color 1s;
  -o-transition: color 1s;
  -ms-transition: color 1s;
  transition: color 1s;
  }

a.test {
  color: blue;
 }

Tidak seperti transisi javascript biasa, transisi CSS3 dipercepat perangkat keras dan karenanya lebih halus. Anda dapat menggunakan Modernizr, untuk mengetahui apakah browser mendukung transisi CSS3, jika tidak maka Anda dapat menggunakan jQuery sebagai cadangan:

if ( !cssTransitions() ) {
    $(document).ready(function(){
        $(".test").hover(function () {
                $(this).stop().animate({ backgroundColor: "red" },500)
             }, function() {
                 $(this).stop().animate({ backgroundColor: "blue" },500)}    
             );
    }); 
}

Ingat untuk menggunakan stop () untuk menghentikan animasi saat ini sebelum memulai yang baru jika tidak ketika Anda melewati elemen terlalu cepat, efeknya terus berkedip untuk sementara waktu.


11

Bagi siapa pun yang menemukan ini. Lebih baik Anda menggunakan versi jQuery UI karena berfungsi di semua browser. Plugin warna memiliki masalah dengan Safari dan Chrome. Kadang hanya berfungsi.


6
-1 Versi terbaru dari plugin warna berfungsi sempurna di Chrome.
Andrew

3
Sangat berat untuk menyertakan skrip tambahan hanya untuk menghidupkan latar belakang
oneiros

11

Anda dapat menggunakan 2 div:

Anda bisa meletakkan klon di atasnya dan memudar yang asli saat memudar.

Setelah pudar, kembalikan yang asli dengan bg baru.

$(function(){
    var $mytd = $('#mytd'), $elie = $mytd.clone(), os = $mytd.offset();

      // Create clone w other bg and position it on original
    $elie.toggleClass("class1, class2").appendTo("body")
         .offset({top: os.top, left: os.left}).hide();

    $mytd.mouseover(function() {            
          // Fade original
        $mytd.fadeOut(3000, function() {
            $mytd.toggleClass("class1, class2").show();
            $elie.toggleClass("class1, class2").hide();            
        });
          // Show clone at same time
        $elie.fadeIn(3000);
    });
});​

contoh jsFiddle


.toggleClass()
.offset()
.fadeIn()
.fadeOut()


mungkin itu bekerja di beberapa titik, setidaknya benar bukan sepertinya tidak melakukan apa yang diharapkan itu.
epeleg

@epeleg - Bekerja di mac chrome untuk saya. Anda klik pada persegi panjang berwarna, dan itu berubah warna (2013 - 07 - 15)
Peter Ajtai

Saya tidak tahu bagaimana, tetapi memang sekarang bekerja pada chrome windows7 saya. mungkin terkait dengan pembaruan chrome yang saya lakukan kemarin?! Lagi pula seperti yang saya katakan memang berhasil sekarang.
epeleg

8

Saya menggunakan kombinasi transisi CSS dengan JQuery untuk efek yang diinginkan; jelas browser yang tidak mendukung transisi CSS tidak akan bernyawa tetapi itu opsi yang ringan yang bekerja dengan baik untuk sebagian besar browser dan untuk persyaratan saya adalah degradasi yang dapat diterima.

Jquery untuk mengubah warna latar:

   $('.mylinkholder a').hover(
        function () {
            $(this).css({ backgroundColor: '#f0f0f0' }); 
        },
        function () {
            $(this).css({ backgroundColor: '#fff' });
        }
    );

CSS menggunakan transisi untuk memudar perubahan warna latar belakang

   .mylinkholder a
   {
   transition: background-color .5s ease-in-out;
   -moz-transition: background-color .5s ease-in-out;
   -webkit-transition: background-color .5s ease-in-out; 
  -o-transition: background-color .5s ease-in-out; 
   }

6

Plugin jQuery color hari ini mendukung warna bernama berikut:

aqua:[0,255,255],
azure:[240,255,255],
beige:[245,245,220],
black:[0,0,0],
blue:[0,0,255],
brown:[165,42,42],
cyan:[0,255,255],
darkblue:[0,0,139],
darkcyan:[0,139,139],
darkgrey:[169,169,169],
darkgreen:[0,100,0],
darkkhaki:[189,183,107],
darkmagenta:[139,0,139],
darkolivegreen:[85,107,47],
darkorange:[255,140,0],
darkorchid:[153,50,204],
darkred:[139,0,0],
darksalmon:[233,150,122],
darkviolet:[148,0,211],
fuchsia:[255,0,255],
gold:[255,215,0],
green:[0,128,0],
indigo:[75,0,130],
khaki:[240,230,140],
lightblue:[173,216,230],
lightcyan:[224,255,255],
lightgreen:[144,238,144],
lightgrey:[211,211,211],
lightpink:[255,182,193],
lightyellow:[255,255,224],
lime:[0,255,0],
magenta:[255,0,255],
maroon:[128,0,0],
navy:[0,0,128],
olive:[128,128,0],
orange:[255,165,0],
pink:[255,192,203],
purple:[128,0,128],
violet:[128,0,128],
red:[255,0,0],
silver:[192,192,192],
white:[255,255,255],
yellow:[255,255,0]

1
Bisakah Anda mengutip sumbernya? Terima kasih sudah mendaftar btw.
Shrikant Sharat

Daftar ini berasal dari plugin warna jQuery: plugins.jquery.com/project/color
spoulson

2
-1 Daftar warna Anda mengacu pada versi yang kedaluwarsa. Versi saat ini memiliki setidaknya satu warna tambahan yang saya perhatikan.
Andrew

5

Saya suka menggunakan delay () untuk menyelesaikan ini, berikut ini sebuah contoh:

jQuery(element).animate({ backgroundColor: "#FCFCD8" },1).delay(1000).animate({ backgroundColor: "#EFEAEA" }, 1500);

Ini dapat dipanggil dengan fungsi, dengan "elemen" menjadi elemen kelas / nama / dll. Elemen akan langsung muncul dengan latar belakang # FCFCD8, tahan sebentar, lalu menghilang menjadi #EFEAEA.



2

Saya menemukan halaman ini dengan masalah yang sama, tetapi masalah berikut:

  1. Saya tidak dapat menyertakan file plugin jQuery tambahan dengan pengaturan saya saat ini.
  2. Saya tidak nyaman menempel blok kode besar yang saya tidak punya waktu untuk membaca dan memvalidasi.
  3. Saya tidak memiliki akses ke css.
  4. Saya hampir tidak punya waktu untuk implementasi (itu hanya peningkatan visual ke halaman admin)

Dengan jawaban di atas, hampir tidak ada jawaban. Mengingat warna pudar saya sangat sederhana, saya menggunakan quick hack berikut:

element
  .css('color','#FF0000')
;
$('<div />')
  .css('width',0)
  .animate(
    {'width':100},
    {
      duration: 3000,
      step:function(now){
        var v = (255 - 255/100 * now).toString(16);
        v = (v.length < 2 ? '0' : '') + v.substr(0,2);
        element.css('color','#'+v+'0000');
      }
    }
  )
;

Di atas membuat div sementara yang tidak pernah ditempatkan dalam aliran dokumen. Saya kemudian menggunakan animasi bawaan jQuery untuk menghidupkan properti numerik dari elemen itu - dalam hal ini width- yang dapat mewakili persentase (0 hingga 100). Kemudian, menggunakan fungsi langkah, saya mentransfer animasi numerik ini ke warna teks dengan hex hexacation sederhana.

Hal yang sama dapat dicapai dengan setInterval, tetapi dengan menggunakan metode ini Anda dapat mengambil manfaat dari metode animasi jQuery - seperti .stop()- dan Anda dapat menggunakan easingdan duration.

Jelas itu hanya digunakan untuk memudarkan warna yang sederhana, untuk konversi warna yang lebih rumit Anda harus menggunakan salah satu jawaban di atas - atau kode warna Anda sendiri memudar matematika :)


2

Coba yang ini:

(function($) {  

            var i = 0;  

            var someBackground = $(".someBackground");  
            var someColors = [ "yellow", "red", "blue", "pink" ];  


            someBackground.css('backgroundColor', someColors[0]);  

            window.setInterval(function() {  
                i = i == someColors.length ? 0 : i;  
                someBackground.animate({backgroundColor: someColors[i]}, 3000);  
                i++;  
            }, 30);  

})(jQuery);  

Anda dapat mempratinjau contoh di sini: http://jquerydemo.com/demo/jquery-animate-background-color.aspx



1

Jika Anda tidak ingin menghidupkan latar belakang Anda hanya menggunakan fungsionalitas inti jQuery, coba ini:

jQuery(".usercontent").mouseover(function() {
      jQuery(".usercontent").animate({backgroundColor:'red'}, 'fast', 'linear', function() {
            jQuery(this).animate({
                backgroundColor: 'white'
            }, 'normal', 'linear', function() {
                jQuery(this).css({'background':'none', backgroundColor : ''});
            });
        });

0

Cobalah untuk menggunakannya

-moz-transition: background .2s linear;
-webkit-transition: background .2s linear;
-o-transition: background .2s linear;
transition: background .2s linear;

0

Coba yang ini:

jQuery(".usercontent").hover(function() {
    jQuery(this).animate({backgroundColor:"pink"}, "slow");
},function(){
    jQuery(this).animate({backgroundColor:"white"}, "slow");
});

Cara yang direvisi dengan efek:

jQuery(".usercontent").hover(function() {

    jQuery(this).fadeout("slow",function(){
        jQuery(this).animate({"color","yellow"}, "slow");
    });
});
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.