如何在没有 Jquery-ui 且没有 Bootstrap 的情况下在 angularjs 中创建自定义进度条?

Posted

技术标签:

【中文标题】如何在没有 Jquery-ui 且没有 Bootstrap 的情况下在 angularjs 中创建自定义进度条?【英文标题】:How to create custom progress bar in angularjs Without Jquery-ui and without Boostrap? 【发布时间】:2017-07-20 07:07:37 【问题描述】:

我正在尝试在Angularjs 中创建进度条,但使用jquery-ui 创建进度条。现在我试图在没有jquery-ui 并且仅在angular 中实现相同的目标。

但它不起作用。下面是我的代码,你能帮我吗?

html

<div ng-app="app" ng-controller="main">
    <div progressbar="value"></div>
    <select ng-model="value" ng-options="item as item + '%' for item in items">
        <option value="">-- Select current progress --</option>
    </select>
</div>

脚本

angular.module("app", [])
.controller("main", ['$scope', function($scope) 
    $scope.value = 10
    $scope.items = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
])
.directive('progressbar', [function() 
    return 
        restrict: 'A',
        scope: 
            'progress': '=progressbar'
        ,
        controller: function($scope, $element, $attrs) 
            $element.progressbar(
                value: $scope.progress
            )

            $scope.$watch(function() 
                $element.progressbar(value: $scope.progress)
            )
        
    
])

jsfiddle:http://jsfiddle.net/A2CV5/639/

【问题讨论】:

是你的进度条的代码吗?如果有,有什么问题? 这里我使用了 jquery-ui 但我想不用 jquery-ui OK ... 那么没有 jquery-ui 的代码在哪里?发布有效的代码并寻求帮助是没有意义的,有没有 不使用 jquery-ui 库如何实现 不使用jquery-ui不知道怎么创建,能否给我逻辑或思路 【参考方案1】:

您只需要使用一些 CSS 和 html 来实现这一点。 $scope.value 将发挥所有作用。在我的回答中,我使用了链接而不是控制器,因为不习惯使用控制器进行 DOM 操作。我试过用两种方式回答这个问题。

    HTML 5 &lt;progress &gt; 标签 传统方式

我从在线资源中获取了这个例子,所以 CSS 可以是任何你的主题

angular.module("app", [])
.controller("main", ['$scope', function($scope) 
    $scope.value = 10
    $scope.items = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
])
.directive('progressbar', [function() 
    return 
        restrict: 'A',
        scope: 
            'progress': '=progressbar'
        ,
        link: function($scope, $element, $attrs) 
           
        
    
])
*  margin: 0; padding: 0; 
body  font: 14px Georgia, serif; 

article, aside, figure, footer, header, hgroup,
menu, nav, section  display: block; 

#page-wrap  width: 490px; margin: 80px auto; 

body  background: #fff; text-align: center; color: #eee; font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; 
h1  font-size: 42px; font-weight: 600; margin: 0 0 30px 0; 

pre 
	background: black;
	text-align: left;
	padding: 20px;
	margin: 0 auto 30px auto; 


.meter  
			height: 20px;  /* Can be anything */
			position: relative;
			margin: 60px 0 20px 0; /* Just for demo spacing */
			background: #555;
			-moz-border-radius: 25px;
			-webkit-border-radius: 25px;
			border-radius: 25px;
			padding: 10px;
			-webkit-box-shadow: inset 0 -1px 1px rgba(255,255,255,0.3);
			-moz-box-shadow   : inset 0 -1px 1px rgba(255,255,255,0.3);
			box-shadow        : inset 0 -1px 1px rgba(255,255,255,0.3);
		
		.meter > span 
			display: block;
			height: 100%;
			   -webkit-border-top-right-radius: 8px;
			-webkit-border-bottom-right-radius: 8px;
			       -moz-border-radius-topright: 8px;
			    -moz-border-radius-bottomright: 8px;
			           border-top-right-radius: 8px;
			        border-bottom-right-radius: 8px;
			    -webkit-border-top-left-radius: 20px;
			 -webkit-border-bottom-left-radius: 20px;
			        -moz-border-radius-topleft: 20px;
			     -moz-border-radius-bottomleft: 20px;
			            border-top-left-radius: 20px;
			         border-bottom-left-radius: 20px;
			background-color: rgb(43,194,83);
			background-image: -webkit-gradient(
			  linear,
			  left bottom,
			  left top,
			  color-stop(0, rgb(43,194,83)),
			  color-stop(1, rgb(84,240,84))
			 );
			background-image: -moz-linear-gradient(
			  center bottom,
			  rgb(43,194,83) 37%,
			  rgb(84,240,84) 69%
			 );
			-webkit-box-shadow: 
			  inset 0 2px 9px  rgba(255,255,255,0.3),
			  inset 0 -2px 6px rgba(0,0,0,0.4);
			-moz-box-shadow: 
			  inset 0 2px 9px  rgba(255,255,255,0.3),
			  inset 0 -2px 6px rgba(0,0,0,0.4);
			box-shadow: 
			  inset 0 2px 9px  rgba(255,255,255,0.3),
			  inset 0 -2px 6px rgba(0,0,0,0.4);
			position: relative;
			overflow: hidden;
		
		.meter > span:after, .animate > span > span 
			content: "";
			position: absolute;
			top: 0; left: 0; bottom: 0; right: 0;
			background-image: 
			   -webkit-gradient(linear, 0 0, 100% 100%, 
			      color-stop(.25, rgba(255, 255, 255, .2)), 
			      color-stop(.25, transparent), color-stop(.5, transparent), 
			      color-stop(.5, rgba(255, 255, 255, .2)), 
			      color-stop(.75, rgba(255, 255, 255, .2)), 
			      color-stop(.75, transparent), to(transparent)
			   );
			background-image: 
				-moz-linear-gradient(
				  -45deg, 
			      rgba(255, 255, 255, .2) 25%, 
			      transparent 25%, 
			      transparent 50%, 
			      rgba(255, 255, 255, .2) 50%, 
			      rgba(255, 255, 255, .2) 75%, 
			      transparent 75%, 
			      transparent
			   );
			z-index: 1;
			-webkit-background-size: 50px 50px;
			-moz-background-size: 50px 50px;
			-webkit-animation: move 2s linear infinite;
			   -webkit-border-top-right-radius: 8px;
			-webkit-border-bottom-right-radius: 8px;
			       -moz-border-radius-topright: 8px;
			    -moz-border-radius-bottomright: 8px;
			           border-top-right-radius: 8px;
			        border-bottom-right-radius: 8px;
			    -webkit-border-top-left-radius: 20px;
			 -webkit-border-bottom-left-radius: 20px;
			        -moz-border-radius-topleft: 20px;
			     -moz-border-radius-bottomleft: 20px;
			            border-top-left-radius: 20px;
			         border-bottom-left-radius: 20px;
			overflow: hidden;
		
		
		.animate > span:after 
			display: none;
		
		
		@-webkit-keyframes move 
		    0% 
		       background-position: 0 0;
		    
		    100% 
		       background-position: 50px 50px;
		    
		
		
		.orange > span 
			background-color: #f1a165;
			background-image: -moz-linear-gradient(top, #f1a165, #f36d0a);
			background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #f1a165),color-stop(1, #f36d0a));
			background-image: -webkit-linear-gradient(#f1a165, #f36d0a); 
		
		
		.red > span 
			background-color: #f0a3a3;
			background-image: -moz-linear-gradient(top, #f0a3a3, #f42323);
			background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #f0a3a3),color-stop(1, #f42323));
			background-image: -webkit-linear-gradient(#f0a3a3, #f42323);
		
		
		.nostripes > span > span, .nostripes > span:after 
			-webkit-animation: none;
			background-image: none;
		
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.22/angular.min.js"></script>
<div ng-app="app" ng-controller="main">
<!--HTML 5 way-->
<progress value="value" max="100" id="progressbar"></progress>

<!--Other  way-->
<div class="meter red">
	<span style="width: value%"></span>
</div>
    <!--<div progressbar="value"></div>-->
    <select ng-model="value" ng-options="item as item + '%' for item in items">
        <option value="">-- Select current progress --</option>
    </select>
</div>

【讨论】:

【参考方案2】:
angular.module("app", [])
.controller("main", ['$scope', function($scope) 
    $scope.value = 10
    $scope.items = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
])
.directive('progressbar', [function() 
    return 
        restrict: 'A',
        scope: 
            'progress': '=progressbar'
        ,
        template: '<div style="background-color: red; height:60px; width:100%;"> <div  ng-style="style" style="background-color:blue; height:100%"></div> </div>',
        controller: function($scope, $element, $attrs) 


          $scope.$watch(function() 
                $scope.style = "width": $scope.progress + "%"
            )
        
    
])

工作示例:http://jsfiddle.net/mLyj1691/4/

嗯,你明白了……

【讨论】:

在控制器中进行 DOM 操作不是一个好主意,而且对于观察者来说也是如此,这在 Angular 应用程序开发中是一种冒犯。

以上是关于如何在没有 Jquery-ui 且没有 Bootstrap 的情况下在 angularjs 中创建自定义进度条?的主要内容,如果未能解决你的问题,请参考以下文章

jQuery-UI 在没有 CSS 或自定义的情况下无法在我的用户脚本中工作?

如何在 jquery-ui datepicker 中禁用动画?

centos7 安装boots,提示bash: ./bootstrap.sh: 没有那个文件或目录

jquery-ui 和 webpack,如何将其管理到模块中?

Rails 6:如何通过 webpacker 添加 jquery-ui?

jQuery-UI滑块未显示