Skip to content

Instantly share code, notes, and snippets.

Created May 27, 2016 19:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save anonymous/fa60591f500e024ad29e7a3022e5afc2 to your computer and use it in GitHub Desktop.
Save anonymous/fa60591f500e024ad29e7a3022e5afc2 to your computer and use it in GitHub Desktop.
Bubble color picker
<div class="color-picker"></div>
/*
Bubble color picker
By @Lewitje
Have fun with it!
*/
var colorPicker = (function() {
var config = {
baseColors: [
[46, 204, 113],
[52, 152, 219],
[155, 89, 182],
[52, 73, 94],
[241, 196, 15],
[230, 126, 34],
[231, 76, 60],
[180, 180, 180]
],
lightModifier: 20,
darkModifier: 0,
transitionDuration: 200,
transitionDelay: 25,
variationTotal: 10
};
var state = {
activeColor: [0, 0, 0]
};
function init() {
createColorPicker(function() {
appendBaseColors();
});
addEventListeners();
setFirstColorActive(function() {
setFirstModifiedColorActive();
});
}
function setActiveBaseColor(el) {
$('.color.active').removeClass('active');
el.addClass('active');
}
function setActiveColor(el) {
$('.color-var.active').removeClass('active');
el.addClass('active');
state.activeColor = el.data('color').split(',');
}
function addEventListeners() {
$('body').on('click', '.color', function() {
var color = $(this).data('color').split(',');
setActiveBaseColor($(this));
hideVariations(function() {
createVariations(color, function() {
setDelays(function() {
showVariations();
});
});
});
});
$('body').on('click', '.color-var', function() {
setActiveColor($(this));
setBackgroundColor();
});
}
function setFirstColorActive(callback) {
$('.color').eq(1).trigger('click');
callback();
}
function setFirstModifiedColorActive() {
setTimeout(function() {
$('.color-var').eq(7).trigger('click');
}, 500);
}
function createColorPicker(callback) {
$('.color-picker').append('<div class="base-colors"></div>');
$('.color-picker').append('<div class="varied-colors"></div>');
$('.color-picker').append('<div class="active-color"></div>');
$('.color-picker').append('<div class="color-history"></div>');
callback();
}
function appendBaseColors() {
for (i = 0; i < config.baseColors.length; i++) {
$('.base-colors').append('<div class="color" data-color="' + config.baseColors[i].join() + '" style="background-color: rgb(' + config.baseColors[i].join() + ');"></div>');
}
};
function setBackgroundColor() {
$('body').css({
'background-color': 'rgb(' + state.activeColor + ')'
});
}
function createVariations(color, callback) {
$('.varied-colors').html('');
for (var i = 0; i < config.variationTotal; i++) {
var newColor = [];
for (var x = 0; x < color.length; x++) {
var modifiedColor = (Number(color[x]) - 100) + (config.lightModifier * i);
if (modifiedColor <= 0) {
modifiedColor = 0;
} else if (modifiedColor >= 255) {
modifiedColor = 255;
}
newColor.push(modifiedColor);
}
var extraClass = "";
if (newColor[0] > 220 && newColor[1] > 220 && newColor[2] > 220) {
extraClass = "light";
}
$('.varied-colors').append('<div data-color="' + newColor + '" class="color-var ' + extraClass + '" style="background-color: rgb(' + newColor + ');"></div>');
}
callback();
}
function setDelays(callback) {
$('.color-var').each(function(x) {
$(this).css({
'transition': 'transform ' + (config.transitionDuration / 1000) + 's ' + ((config.transitionDelay / 1000) * x) + 's'
});
});
callback();
}
function showVariations() {
setTimeout(function() {
$('.color-var').addClass('visible');
}, (config.transitionDelay * config.variationTotal));
}
function hideVariations(callback) {
$('.color-var').removeClass('visible').removeClass('active');
setTimeout(function() {
callback();
}, (config.transitionDelay * config.variationTotal));
}
return {
init: init
};
}());
colorPicker.init();
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.2/jquery.min.js"></script>
*{
box-sizing: border-box;
padding: 0;
margin: 0;
}
body{
display: flex;
align-items: center;
justify-content: center;
width: 100%;
height: 100vh;
transition: all 1s;
font-family: sans-serif;
}
.color-picker{
width: 100%;
background-color: white;
padding: 40px 0;
}
.base-colors,
.varied-colors{
overflow: hidden;
display: flex;
align-items: center;
justify-content: center;
width: 100%;
}
.color,
.color-var{
float: left;
border-radius: 50%;
cursor: pointer;
}
.color{
transition: all .2s;
width: 25px;
height: 25px;
margin: 20px;
&.active{
transform: scale(1.3, 1.3);
}
}
.color-var{
transform: scale(0, 0);
width: 40px;
height: 40px;
margin: 10px;
&.visible{
transform: scale(1, 1);
}
&.active{
transform: scale(1.3, 1.3);
}
&.light{
border: 1px solid #ccc;
}
}
footer{
position: fixed;
bottom: 0;
left: 0;
width: 100%;
padding: 20px;
color: white;
text-align: center;
a{
color: white;
text-decoration: none;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment