angular+underscore+hammer实现太阳花取色器酷炫效果代码

代码语言:html

所属分类:选择器

代码描述:angular+underscore+hammer实现太阳花取色器酷炫效果代码,点击色卡进行选择。

代码标签: angular underscore hammer 太阳花 取色器

下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <link type="text/css" rel="stylesheet" href="//repo.bfw.wiki/bfwrepo/css/font-awesome-4.7.0/css/font-awesome.min.css">
    <style>
        @charset "UTF-8";
    *, *::before, *::after {
      box-sizing: border-box;
    }
    
    [ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak {
      display: none !important;
    }
    
    [tap] {
      cursor: pointer;
    }
    
    .fg-light {
      color: #FFF;
    }
    
    .fg-dark {
      color: #363639;
    }
    
    .canvas {
      overflow: hidden;
      position: relative;
      display: flex;
      flex-direction: row;
      justify-content: center;
      align-items: center;
      z-index: 1;
      flex: 4;
      font-size: 1.3vmin;
      transition: 1.5s ease-in-out;
      cursor: default;
    }
    
    .dial {
      position: absolute;
      top: 0;
      right: 0;
      bottom: 0;
      left: 0;
      flex: none;
      background-image: radial-gradient(circle at 50% 50%, #fff, #000);
      mix-blend-mode: overlay;
    }
    
    .color-display {
      display: flex;
      flex-direction: column;
      align-items: center;
      position: relative;
      font-size: 1.35em;
    }
    .color-display a {
      text-decoration: none;
      color: inherit;
    }
    
    .color-brick {
      border-radius: 50%;
      flex: 0 0 auto;
      padding: 0;
      width: 100%;
      height: 100%;
      pointer-events: auto;
      box-shadow: 1.5em 0 2.5em -2em rgba(0, 0, 0, 0.65);
    }
    .color-brick.current::after {
      content: "";
      font-family: FontAwesome;
      font-size: 4.5vmin;
      position: absolute;
      top: 1em;
      left: 50%;
      transform: translateX(-50%);
    }
    
    .color-ring-outer {
      position: absolute;
      top: 50%;
      left: 50%;
      transform: translate(-50%, -50%) translateZ(0);
    }
    
    .color-ring {
      position: relative;
      width: 35em;
      height: 35em;
      pointer-events: none;
      border-radius: 100%;
      overflow: visible;
      transform-origin: 50% 50%;
      line-height: 0;
      transition: transform 0.3s ease-out;
    }
    .color-ring > div {
      display: flex;
      align-items: flex-start;
      justify-content: space-around;
      position: absolute;
      top: -12vmin;
      right: 50%;
      bottom: 50%;
      left: 50%;
      transform-origin: center bottom;
      transform: rotate(180deg);
      transition: transform 0.3s ease-out, top 0.3s ease-out;
    }
    .color-ring > div:nth-last-child(-n+2) {
      transition: none;
    }
    .color-ring > div:last-child {
      transform-origin: right bottom;
    }
    .color-ring > div:last-child .color-brick {
      pointer-events: none;
      border-radius: 0 100% 10%/20% 55%;
      box-shadow: 0.7em 1em 1.5em -1em rgba(0, 0, 0, 0.65);
    }
    .color-ring > div:last-child .color-brick::after {
      left: 0;
    }
    
    .color-info {
      position: relative;
      width: 13em;
      height: 13em;
      text-align: center;
      font-size: 2.1em;
      flex: 1 1 auto;
      display: flex;
      flex-direction: column;
      align-items: center;
      justify-content: center;
      border-radius: 100%;
      -webkit-user-select: none;
         -moz-user-select: none;
          -ms-user-select: none;
              user-select: none;
      transition: background 0.3s ease-out;
      box-shadow: 0 0.5em 4em -1em rgba(0, 0, 0, 0.9);
      border-radius: 100%;
    }
    .color-info > * + * {
      margin: 0;
    }
    
    html, body {
      margin: 0;
      height: 100%;
      display: flex;
      flex: 1;
      font-family: "DIN Alternate", monospace;
    }
    
    .panel {
      position: relative;
      flex: 1;
      padding: 0.5em;
      line-height: 1;
      background: #FFF;
      color: #363639;
      z-index: 1;
      display: flex;
      flex-direction: column;
      justify-content: center;
      align-items: center;
      font-size: 1.5em;
      box-shadow: 0 0 2em -1em #363639;
      -webkit-user-select: none;
         -moz-user-select: none;
          -ms-user-select: none;
              user-select: none;
    }
    .panel > div {
      flex: 1;
      text-align: center;
    }
    .panel .button {
      text-decoration: none;
      display: inline-block;
      white-space: nowrap;
      padding: 0.5em;
      border-radius: 0.25em;
      transition: 0.3s ease-out;
    }
    .panel .button:hover {
      box-shadow: 0 0.5em 1em -0.8em #363639;
      transform: scale(1.05);
    }
    .panel textarea {
      width: 100%;
      height: 4.5em;
      padding: 0.5em;
      margin: 1em 0;
      border: 1px solid #c3c3c4;
      border-radius: 0.25em;
      font-size: 1em;
      resize: vertical;
    }
    .panel textarea:focus {
      outline: none;
    }
    
    .love.fg-dark {
      -webkit-text-stroke: 0.05em #363639;
    }
    .love.fg-light {
      -webkit-text-stroke: 0.05em #FFF;
    }
    
    .button.fg-dark {
      border: 0.1em solid #363639;
    }
    .button.fg-light {
      border: 0.1em solid #FFF;
    }
    
    @media screen and (max-width: 40em), screen and (orientation: portrait) {
      body {
        flex-direction: column-reverse;
      }
    
      .canvas {
        flex: 1;
      }
    
      .panel {
        flex: 0 0 auto;
        flex-direction: row;
      }
      .panel textarea {
        flex: 1;
        margin: 0 1em;
        height: auto;
      }
      .panel .love, .panel .button {
        flex: 0 0 auto;
      }
    
      .color-ring {
        width: 24em;
        height: 24em;
      }
      .color-ring > div {
        top: -15vmin;
      }
    
      .color-info {
        width: 12em;
        height: 12em;
      }
    }
    </style>

</head>


<body class="ng-cloak" ng-app="app" ng-controller="appController">
    <div class="canvas" ng-style="{'background-color': color}">

        <div class="dial"></div>
        <div class="color-display" ng-class="setClasses(color, null, true)">

            <div class="color-ring-outer">
                <div class="color-ring" ng-style="setRingRotation()">
                    <div ng-repeat="c in shades track by $index" ng-style="setRotation($index)">
                        <div class="color-brick" tap="doIt(c)" ng-class="setClasses(c, color, false)" ng-style="{'backgroundColor': c}">
                        </div>
                    </div>
                </div>
            </div>

            <div class="color-info" ng-class="setClasses(tuner.hex, null, true)" ng-style="{'background': tuner.hex}">
                <h1>{{tuner.hex}}</h1>
                <div class="refresh" tap="doIt()"><i class="fa fa-refresh fa-3x fa-fw"></i></div>
            </div>

        </div>
    </div>

  

    <script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/angular-1.4.6.js"></script>
    <script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/underscore.js"></script>
    <script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/hammer.min.js"></script>
    <script>
        (function($angular, _, Hammer) {
    	'use strict';
    	
    	$angular
    	.module('app', [])
    	.controller('appController', ['$scope', '$document', 'ColorService', 'UiHelpers', function($scope, $document, colors, ui) {
    
    		$scope.colorSteps = 6;
    		$scope.defaultColor = '#0ebeff';
    		$scope.hash = window.location.hash ? window.location.hash.replace('/', '') : $scope.defaultColor;
    
    		window.addEventListener('hashchange', function(e){
    			var color = '#' + e.newURL.split('#')[1];
    			if(color !== $scope.color) {
    				doIt(color);
    			}
    		});
    
    		var _notInRunLoop = function _notInRunLoop() {
    			return !$scope.$root.$$phase;
    		};
    
    		var doIt = function(color){
    			if(!color || color === '#') {
    				color = colors.randomHex();
    			}
    			color = colors.toHex(color).toLowerCase();
    
    			var cb = colors.brightness(color);
    			var darker = [];
    			_.times(50, function(n){
    				if(n % $scope.colorSteps === 0) {
    					var dn = colors.darken(color, n);
    					if(dn !== '#000000') {
    						if(cb < $scope.colorSteps) {
    							darker.push(dn);
    						} else {
    							if(cb - colors.brightness(dn) > $scope.colorSteps) {
    								darker.push(dn);
    							}
    						}
    					}
    				}
    			});
    
    			var lighter = [];
    			_.times(50, function(n){
    				if(n % $scope.colorSteps === 0) {
    					var c = 50 - n;
    					var ln = colors.lighten(color, c);
    					if(ln !== '#ffffff') {
    						lighter.push(ln);
    					}
    				}
    			});
    
    			$scope.darker = _.unique(darker);
    			$scope.lighter = _.unique(lighter);
    
    			// edges
    			$scope.lightest = _.first($scope.lighter);
    			$scope.darkest = _.last($scope.darker);
    			// middles
    			$scope.lightish = $scope.lighter.length > 2 ? $scope.lighter[$scope.lighter.length-3] : color;
    			$scope.darkish = $scope.darker.length > 2 ? $scope.darker[2] : color;
    
    			$scope.shades = _.unique($scope.lighter.concat([color]).concat($scope.darker));
    
    			// inject a duplicate last item for overlap hackery in tanuki mode: flower
    			if(!$scope.darkest) {
    				$scope.darkest = color;
    			}
    			$scope.shades.push($scope.darkest);
    
    			$scope.controlBg = _.first($scope.darker);
    			$scope.controlFg = _.last($scope.lighter);
    
    			$scope.deg = (360/($scope.shades.length-1));
    			$scope.size = Math.floor((100/($scope.shades.length-2) + Math.PI)/2);
    
    			$scope.color = color;
    			$scope.tuner = {
    				r: colors.red(color),
    				g: colors.green(color),
    				b: colors.blue(color),
    				hex: color,
    				brightness: cb
    			};
    
    			$scope.rotateFactor = _.findIndex($scope.shades, function(item){
    				return item === $scope.color;
    			});
    
    			$scope.ringDeg = $scope.deg*($scope.rotateFactor+1);
    
    			window.location.hash = color; //.replace('#', '#/');
    
    			 if (_notInRunLoop()) {
    				try {
    					// Sometimes we're outside of the Angular run-loop,
    					// and therefore need to manually invoke the `apply` method
    					$scope.$apply();
    				} catch(e) {}
    			}
    		};
    		
    		$scope.doIt = function(color){
    			doIt(color);
    		};
    		
    		$scope.setRingRotation = function(){
    			return {
    				transform: 'rotate(-'+$scope.ringDeg+'deg) translateZ(0)'
    			};
    		};
    
    		$scope.setRotation = function(index){
    			var i = index+1;
    			var d = $scope.deg*(i);
    			var m = '0 -'+$scope.size+'em';
    			var z = $scope.shades.length - i;
    			var t = (i * 0.08);
    			var r = 	'';
    			var s = '';
    			var f = '';
    			var n;
    
    			// hackery
    			if(i === $scope.shades.length) {
    				d = 360; //$scope.deg;
    				m = '0 -'+$scope.size+'em 0 0';
    				z = $scope.shades.length;
    			}
    
    			r = 'rotate('+d+'deg)';
    
    			return {
    				transform: r + s,
    				fontSize: f,
    				margin: m,
    				transitionDelay: t+'s',
    				zIndex: z
    			};
    		};
    
    		$scope.setClasses = function(color, test, affectText){
    			if(color) {
    				var classes = [];
    				if(affectText) {
    					var text = colors.brightness(color) < 155 ? 'fg-light' : 'fg-dark';
    					classes.push(text);
    				}
    
    				if(color === test) {
    						classes.push('current');
    				}
    
    				return classes.join(' ');
    			}
    		};
    
    		$scope.loadColor = function(color){
    				.........完整代码请登录后点击上方下载按钮下载查看

网友评论0