Day 60 - Knob
How do I make an day 60 - knob?
Implementation of Day 60 design from @npaulflavius' 100 Days UI Challenge. What is a day 60 - knob? How do you make a day 60 - knob? This script and codes were developed by Arnelle Balane on 14 October 2022, Friday.
Day 60 - Knob - Script Codes HTML Codes
<!DOCTYPE html>
<html >
<head> <meta charset="UTF-8"> <title>Day 60 - Knob</title> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/meyer-reset/2.0/reset.min.css"> <link rel="stylesheet" href="css/style.css">
</head>
<body>
<div class="knob"> <div class="knob-outer"> <div class="knob-inner"> <div class="knob-arrow up"></div> <div class="knob-value">0</div> <div class="knob-arrow down"></div> <div class="knob-value-progress"></div> </div> <div class="knob-indicator contrast" data-angle="0"></div> <div class="knob-indicator brightness" data-angle="0"></div> </div> <div class="progress-label contrast">Contrast</div> <div class="progress-label brightness">Brightness</div> <svg class="progress-bars" width="500" height="500"> <path d="M 240 445 A 190 195 0 1 1 240 55" fill="transparent" stroke="#dbdbdb" stroke-width="10" stroke-linecap="round"></path> <path d="M 240 445 A 190 195 0 1 1 240 55" fill="transparent" stroke="#f47231" stroke-width="10" stroke-linecap="round" stroke-dasharray="605 605" id="contrast-progress"></path> <path d="M 260 445 A 190 195 0 1 0 260 55" fill="transparent" stroke="#dbdbdb" stroke-width="10" stroke-linecap="round"></path> <path d="M 260 445 A 190 195 0 1 0 260 55" fill="transparent" stroke="#208ef4" stroke-width="10" stroke-linecap="round" stroke-dasharray="605 605" id="brightness-progress"></path> </svg>
</div> <script src='http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js'></script> <script src="js/index.js"></script>
</body>
</html>
Day 60 - Knob - Script Codes CSS Codes
/** Mixins **/
/** Base Styles **/
*,
*::before,
*::after { margin: 0; padding: 0; box-sizing: border-box;
}
html { font-size: 62.5%;
}
body { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; -webkit-box-align: center; -ms-flex-align: center; align-items: center; height: 100vh; font-family: "Roboto", "Myriad Pro", sans-serif; line-height: 1; background: url("http://i1067.photobucket.com/albums/u422/arnellebalane/background_zpsifao5spd.jpg") center center no-repeat; background-size: cover; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none;
}
/** Knob Styles **/
.knob { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; -webkit-box-align: center; -ms-flex-align: center; align-items: center; width: 50rem; height: 50rem; position: relative;
}
.knob-outer { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; -webkit-box-align: center; -ms-flex-align: center; align-items: center; width: 33rem; height: 33rem; position: relative; z-index: 1; border-radius: 50%; background-color: #42444a; overflow: hidden;
}
.knob-outer::before { content: ""; position: absolute; left: -10rem; bottom: 5rem; width: 10rem; height: 10rem; border-radius: 50%; box-shadow: 0 0 10rem 10rem #d5a362; opacity: 0.25;
}
.knob-inner { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; -webkit-box-align: center; -ms-flex-align: center; align-items: center; -webkit-box-orient: vertical; -webkit-box-direction: normal; -ms-flex-direction: column; flex-direction: column; width: 24rem; height: 24rem; position: relative; border-radius: 50%; background-color: #f2f2f2; overflow: hidden;
}
.knob-value { width: 12rem; height: 12rem; margin: 2rem 0; position: relative; z-index: 1; font-size: 6rem; font-weight: 100; text-align: center; line-height: 12rem; color: #71727b; border-radius: 50%; background-color: #fff;
}
.knob-value-progress { height: 0; position: absolute; left: 0; right: 0; bottom: 0; background-color: #d8e3ea; -webkit-transition: height 500ms ease-out; transition: height 500ms ease-out;
}
.knob-arrow { width: 4rem; height: 1.5rem; position: relative; z-index: 1; cursor: pointer; outline: none;
}
.knob-arrow::before,
.knob-arrow::after { content: ""; width: 2.4rem; height: 3px; position: absolute; top: 0; left: 50%; background-color: #ccc; -webkit-transform-origin: left center; transform-origin: left center; -webkit-transform: rotate(30deg); transform: rotate(30deg);
}
.knob-arrow::after { -webkit-transform: rotate(150deg); transform: rotate(150deg);
}
.knob-arrow.down::before,
.knob-arrow.down::after { top: auto; bottom: 0; -webkit-transform: rotate(-30deg); transform: rotate(-30deg);
}
.knob-arrow.down::after { -webkit-transform: rotate(-150deg); transform: rotate(-150deg);
}
.knob-indicator { width: 1rem; height: 1rem; border: 1px solid #fff; position: absolute; top: calc(50% - 0.5rem); left: calc(50% - 0.5rem); z-index: 1; border-radius: 50%; cursor: pointer; -webkit-transition: background-color 250ms ease-out; transition: background-color 250ms ease-out;
}
.knob-indicator:hover { background-color: #fff;
}
.progress-label { width: 10rem; position: absolute; top: 50%; font-size: 1.4rem; text-align: center; text-transform: uppercase; color: #a0a2a9;
}
.progress-label.contrast { left: -2.5rem; -webkit-transform: rotate(-90deg); transform: rotate(-90deg);
}
.progress-label.brightness { right: -2.5rem; -webkit-transform: rotate(90deg); transform: rotate(90deg);
}
/** Progress Bars Styles **/
.progress-bars { position: absolute; top: 0; left: 0; right: 0; bottom: 0;
}
.progress-bars path { stroke-dashoffset: 605; -webkit-transition: stroke-dashoffset 500ms ease-out; transition: stroke-dashoffset 500ms ease-out;
}
Day 60 - Knob - Script Codes JS Codes
'use strict';
var knob = $('.knob-value');
var knobProgress = $('.knob-value-progress');
var contrastProgress = $('#contrast-progress');
var contrastIndicator = $('.knob-indicator.contrast');
var brightnessProgress = $('#brightness-progress');
var brightnessIndicator = $('.knob-indicator.brightness');
var draggedIndicator = null;
setKnobValue(45, true);
setContrast(40);
setBrightness(70);
$(document).on('click', '.knob-arrow', function (e) { e.stopPropagation(); var knobValue = +knob.text(); if ($(this).is('.up') && knobValue < 100) { setKnobValue(knobValue + 1); } else if ($(this).is('.down') && knobValue > 0) { setKnobValue(knobValue - 1); }
});
$(document).on('click', knobInteract);
$(document).on('mousedown', '.knob-indicator', function () { draggedIndicator = $(this);
});
$(document).on('mousemove', function (e) { if (draggedIndicator) { knobInteract(e); }
});
$(document).on('mouseup', function () { draggedIndicator = null;
});
function knobInteract(e) { var origin = { x: window.innerWidth / 2, y: window.innerHeight / 2 }; var target = { x: e.pageX, y: e.pageY }; var angle = angleBetween(origin, target); angle = (angle + 90) % 360; if (angle > 3 && angle < 177) { var contrast = (angle - 3) / 174 * 100; setContrast(contrast); } else if (angle > 183 && angle < 357) { var brightness = 100 - (angle - 183) / 174 * 100; setBrightness(brightness); }
}
function setKnobValue(value) { var initial = arguments.length <= 1 || arguments[1] === undefined ? false : arguments[1]; knob.text(value); knobProgress.css('height', value + '%');
}
function setContrast(value) { var totalLength = contrastProgress[0].getTotalLength(); var percentage = value / 100; var progress = totalLength - totalLength * percentage; var angle = 174 * percentage + 93; var indicator = getPointAtAngleFrom({ x: 0, y: 0 }, angle, 142); contrastProgress.css('stroke-dashoffset', progress); contrastIndicator.css('transform', ['translateX(' + indicator.x + 'px)', 'translateY(' + indicator.y + 'px)'].join(' '));
}
function setBrightness(value) { var totalLength = brightnessProgress[0].getTotalLength(); var percentage = value / 100; var progress = totalLength - totalLength * percentage; var angle = 174 - (174 * percentage + 87); var indicator = getPointAtAngleFrom({ x: 0, y: 0 }, angle, 142); brightnessProgress.css('stroke-dashoffset', progress); brightnessIndicator.css('transform', ['translateX(' + indicator.x + 'px)', 'translateY(' + indicator.y + 'px)'].join(' '));
}
function getPointAtAngleFrom(origin, angle, distance) { angle = deg2rad(angle); return { x: origin.x + Math.cos(angle) * distance, y: origin.y + Math.sin(angle) * distance };
}
function deg2rad(angle) { return angle * (Math.PI / 180);
}
function rad2deg(angle) { return angle * (180 / Math.PI);
}
function angleBetween(origin, target) { var dy = target.y - origin.y; var dx = target.x - origin.x; var angle = rad2deg(Math.atan(dy / dx)); if (angle < 0 && dy < 0) { return 180 + angle; } else if (angle < 0 && dy >= 0) { return 360 + angle; } else if (dx > 0) { return 180 + angle; } return angle;
}
Developer | Arnelle Balane |
Username | arnellebalane |
Uploaded | October 14, 2022 |
Rating | 4.5 |
Size | 6,525 Kb |
Views | 18,216 |
Find the perfect freelance services for your business! Fiverr's mission is to change how the world works together. Fiverr connects businesses with freelancers offering digital services in 500+ categories. Find Developer!
Name | Size |
Day 48 - Speedometer | 6,078 Kb |
Day 41 - File Upload Widget | 6,912 Kb |
Day 77 - Choose Category | 7,442 Kb |
Virtual Filesystem | 12,706 Kb |
Day 11 - Calendar Card | 6,984 Kb |
Yummy Food App | 4,607 Kb |
Pixel mario | 1,906 Kb |
Running pixel mario | 4,473 Kb |
Day 78 - TV UI - Player Card | 3,004 Kb |
Day 85 - Cinema Application | 11,023 Kb |
Jasper is the AI Content Generator that helps you and your team break through creative blocks to create amazing, original content 10X faster. Discover all the ways the Jasper AI Content Platform can help streamline your creative workflows. Start For Free!
Name | Username | Size |
Exploring css spinners | Akagr | 3,569 Kb |
About Mazano | Kiti | 2,585 Kb |
Horizontal slider on scroll | Alojzije | 2,672 Kb |
Flip test | Madhes | 1,635 Kb |
Responsive Menu I | Rodericksandoval | 3,045 Kb |
Use the Twitchtv JSON API | Roksanaop | 3,561 Kb |
Tab Menus | Zephyr | 3,180 Kb |
LeMandinque | Aadesida | 9,046 Kb |
Flying Bee | Pwsm50 | 3,711 Kb |
Elon Musk - Tribute Page - FreeCodeCamp | Yunnimun | 8,615 Kb |
Surf anonymously, prevent hackers from acquiring your IP address, send anonymous email, and encrypt your Internet connection. High speed, ultra secure, and easy to use. Instant setup. Hide Your IP Now!