如何在没有 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
<progress >
标签
传统方式
我从在线资源中获取了这个例子,所以 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,如何将其管理到模块中?