一、运行截图

  截图1:

    

  截图2:

    

二、代码

  html代码:

 <div class="time" >
<ng-container #container> </ng-container>
</div> <ng-template #child_elem>
<div class="digit minutes">
<div class="segment "></div>
<div class="segment "></div>
<div class="segment "></div>
<div class="segment "></div>
<div class="segment "></div>
<div class="segment "></div>
<div class="segment "></div>
</div>
</ng-template> <ng-template #point_elem>
<div class="separator minutes"></div>
</ng-template>

  css代码:

 .time {
height: 40px;
position: absolute;
top:;
left: 28%;
width: 100px;
margin-left: 0px;
text-align: center;
z-index:;
margin-top: -7px;
}
.time .digit {
width: 16px;
height: 44px;
position: relative;
display: inline-block;
margin-top: 2px;
} .digit .segment {
background:#11c4fb;
border-radius:2px;
position:absolute;
opacity:0.1;
transition:opacity 0.2s;
-webkit-transition:opacity 0.2s;
-ms-transition:opacity 0.2s;
-moz-transition:opacity 0.2s;
-o-transition:opacity 0.2s;
} .digit .segment.on, .separator {
opacity:;
background:#11c4fb;
box-shadow:0 0 30px rgba(0,255,0,0.1);
transition:opacity 0s;
-webkit-transition:opacity 0s;
-ms-transition:opacity 0s;
-moz-transition:opacity 0s;
-o-transition:opacity 0s;
} .time .separator {
width: 4px;
height: 4px;
background: #11c4fb;
border-radius: 50%;
display: inline-block;
position: relative;
bottom: 10px;
} .digit .segment:nth-child(1) {
top: 10px;
left: 4px;
right: 4px;
height: 2px;
background: #11c4fb;
} .digit .segment:nth-child(2) {
top: 12px;
right: 1px;
width: 2px;
height: 75px;
height: calc(71% - 21px);
background: #11c4fb;
} .digit .segment:nth-child(3) {
bottom: 10px;
right: 1px;
width: 2px;
height: 72px;
height: calc(71% - 21px);
background: #11c4fb;
} .digit .segment:nth-child(4) {
bottom: 8px;
right: 4px;
height: 2px;
left: 4px;
background: #11c4fb;
} .digit .segment:nth-child(5) {
bottom: 12px;
left: 2px;
width: 2px;
height: 75px;
height: calc(70% - 24px);
background: #11c4fb;
} .digit .segment:nth-child(6) {
top: 14px;
left: 2px;
width: 2px;
height: 75px;
height: calc(70% - 24px);
background: #11c4fb;
} .digit .segment:nth-child(7) {
bottom: 95px;
bottom: calc(71% - 11px);
right: 4px;
left: 4px;
height: 2px;
background: #11c4fb;
}

  ts代码:

 import { Component, OnInit, Input, ViewChild, ViewContainerRef, TemplateRef, ElementRef, QueryList, SimpleChanges } from '@angular/core';

 @Component({
selector: 'app-led-clockfont',
templateUrl: './led-clockfont.component.html',
styleUrls: ['./led-clockfont.component.css']
})
export class LedClockfontComponent implements OnInit {
@ViewChild("container", {read: ViewContainerRef}) container_elem: ViewContainerRef;
@ViewChild("child_elem") tpl_elem: TemplateRef<any>;
@ViewChild("point_elem") tpl_point_elem: TemplateRef<any>;
@Input() fontValue:number = 0; //数值模型数组,0,1,2,3,4,5,6,7,8,9
private digitSegments = [
[1, 2, 3, 4, 5, 6],
[2, 3],
[1, 2, 7, 5, 4],
[1, 2, 7, 3, 4],
[6, 7, 2, 3],
[1, 6, 7, 3, 4],
[1, 6, 5, 4, 3, 7],
[1, 2, 3],
[1, 2, 3, 4, 5, 6, 7],
[1, 2, 7, 3, 6, 4]
]
constructor(private el:ElementRef) { } ngOnInit() { } ngOnChanges(changes: SimpleChanges): void {
if(parseFloat(this.fontValue.toString())){
this.createDomContainer();
}else{
//Do-nothing
}
// this.createDomContainer(); } createDomContainer(){
//根据当前数值长度处理DOM容器
if(0 !== this.fontValue.toString().length){
//清空容器内视图
this.container_elem.clear();
//处理容器内视图
let view = null;
let point_index = this.fontValue.toString().indexOf('.');
for(let i=0;i<this.fontValue.toString().length;i++){
if((-1 != point_index) && (i == point_index)){
view = this.tpl_point_elem.createEmbeddedView(null);
this.container_elem.insert(view);
}else{
view = this.tpl_elem.createEmbeddedView(null);
this.container_elem.insert(view);
}
}
this.typeConversionst();
}else{
//Do-nothing
}
} //截取数字,类型转换
typeConversionst(){
let _minutes = this.el.nativeElement.querySelectorAll('.minutes');
//字符串格式
let fontValue_string = this.fontValue.toString();
//转化成number类型,调用设置数值方法,设置数值
if(0 != _minutes.length){
for(let i=0;i<_minutes.length;i++){
this.setNumber(_minutes[i], parseInt(fontValue_string.slice(i,i+1)), 1);
}
}
} setNumber(digit, number, on){
let segments = digit.querySelectorAll('.segment');
let current = parseInt(digit.getAttribute('data-value'));
if(!isNaN(number)){
//处理数字
this.digitSegments[number].forEach(function(digitSegment, index) {
setTimeout(function() {
segments[digitSegment - 1].classList.add('on');
}, index * 1)
});
digit.setAttribute('data-value', number);
}else{
//Do-nothing
}
} }

三、使用

  图一使用:  

 <p *ngIf="selfFontStyle == 'clockStyle' && value != '--'" style="height: 140px;line-height: 120px;text-align: right;font-size: 40px;color: #13b4eb;position: relative;float: right;right: 130px;">
<app-led-clockfont [fontValue]="value" *ngIf="selfFontStyle == 'clockStyle'"></app-led-clockfont>
<!-- value = 40.72 -->
</p>

  图二使用:

 <app-led-clockfont [fontValue]="mapComponentConfig.length"></app-led-clockfont>
<!-- mapComponentConfig.length = 397 -->

四、说明

  利用Angular6创建一个led-clockfont组件,目录结构如下图:

    

  css代码详见第二步 css代码,html代码详见第二步 html代码,ts代码详见第二步 ts代码。

  使用部分详见第三步

Angular6封装LED时钟数字组件的更多相关文章

  1. C#进阶系列——一步一步封装自己的HtmlHelper组件:BootstrapHelper(三:附源码)

    前言:之前的两篇封装了一些基础的表单组件,这篇继续来封装几个基于bootstrap的其他组件.和上篇不同的是,这篇的有几个组件需要某些js文件的支持. 本文原创地址:http://www.cnblog ...

  2. 原生JS面向对象思想封装轮播图组件

    原生JS面向对象思想封装轮播图组件 在前端页面开发过程中,页面中的轮播图特效很常见,因此我就想封装一个自己的原生JS的轮播图组件.有了这个需求就开始着手准备了,代码当然是以简洁为目标,轮播图的各个功能 ...

  3. C#进阶系列——一步一步封装自己的HtmlHelper组件:BootstrapHelper

    前言:之前学习过很多的Bootstrap组件,博主就在脑海里构思:是否可以封装一套自己Bootstrap组件库呢.再加上看到MVC的Razor语法里面直接通过后台方法输出前端控件的方式,于是打算仿照H ...

  4. JS组件系列——封装自己的JS组件,你也可以

    前言:之前分享了那么多bootstrap组件的使用经验,这篇博主打算研究下JS组件的扩展和封装,我们来感受下JQuery为我们提供$.Extend的神奇,看看我们怎么自定义自己的组件,比如我们想扩展一 ...

  5. JS组件系列——分享自己封装的Bootstrap树形组件:jqTree

    前言:之前的一篇介绍了下如何封装自己的组件,这篇再次来体验下自己封装组件的乐趣.看过博主博客的园友应该记得之前分享过一篇树形菜单的使用JS组件系列——Bootstrap 树控件使用经验分享,这篇里面第 ...

  6. JS组件系列——封装自己的JS组件

    前言:之前分享了那么多bootstrap组件的使用经验,这篇博主打算研究下JS组件的扩展和封装,我们来感受下JQuery为我们提供$.Extend的神奇,看看我们怎么自定义自己的组件,比如我们想扩展一 ...

  7. 从零开始教你封装自己的vue组件

    组件(component)是vue.js最强大的功能之一,它可以实现功能的复用,以及对其他逻辑的解耦.但经过一段时间的使用,我发现自己并没有在业务中发挥出组件的最大价值.相信很多刚开始使用vue的朋友 ...

  8. Android Widget小组件开发(一)——Android实现时钟Widget组件的步骤开发,这些知识也是必不可少的!

    Android Widget小组件开发(一)--Android实现时钟Widget组件的步骤开发,这些知识也是必不可少的! PS:学习自某网站(不打广告) 这个小组件相信大家都很熟悉吧,以前的墨迹天气 ...

  9. vue和echarts 封装的 v-charts 图表组件

    https://v-charts.js.org/#/ 在使用 echarts 生成图表时,经常需要做繁琐的数据类型转化.修改复杂的配置项,v-charts 的出现正是为了解决这个痛点.基于 Vue2. ...

随机推荐

  1. Android开发 - 掌握ConstraintLayout(五)偏差(Bias)

    比如实现这样一个场景: "在屏幕宽度的1/4的地方放置一个View" 使用传统布局时,实现按照屏幕的宽度(高度),或者相对两个View之间距离的一个比例来进行布局,就显得非常麻烦, ...

  2. 解决“UnicodeEncodeError: 'gbk' codec can't encode character u'\xa9' in position 24051: illegal multibyte sequence”错误

    今天我在爬取一个网页时出现了下面这个错误: UnicodeEncodeError: 'gbk' codec can't encode character u'\xa9' in position 240 ...

  3. Android退出所有Activity最优雅的方式

    关于退出所有Activity,目前网上比较流行的方式大概有以下几种: ① 使用ActivityManager的方式: ② 自定义一个Activity集合类的方式: ③ 通过发送广播的方式: ④ 通过杀 ...

  4. JavaScript在IE和Firefox的不兼容问题解决方法总结

    1.兼容Firefox的 outerHTML,Firefox中没有outerHtml的方法. if (window.HTMLElement) { HTMLElement.prototype.__def ...

  5. 《JavaScript高级教程》学习笔记一、变量和数据类型

    JavaScript的核心语言特性在ECMA-262中是以名为ECMAScript的伪语言的形式来定义的. 一.变量和数据类型 1. 变量 JavaSript是弱类型语言,可以通过var定义任何类型变 ...

  6. linux中一些简便的命令之cut

    提中的这些命令都是些小命令,很简便,在工作过程中经常使用,具体使用方法如下: cut 使用说明:一般是把某个整齐的文档输出其中某列使用 常用的参数有: -f 选择打印的列 -d 指定定界符(默认定界符 ...

  7. java中String类型与Date日期类型的互相转换

    //String格式的数据转化成Date格式,Date格式转化成String格式 SimpleDateFormat formatter= new SimpleDateFormat("yyyy ...

  8. nginx介绍(二) - 默认配置

    前言 前面, 在浏览器中, 输入linux 的ip, 出现了以下页面: 那这个页面在哪里呢? 一. 工具 notepad++ 在进入主题之前, 先来介绍下, 一会使用到的工具. 在notepad++里 ...

  9. vue.js的项目实战

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由蔡述雄发表于云+社区专栏 需求背景 组件库是做UI和前端日常需求中经常用到的,把一个按钮,导航,列表之类的元素封装起来,方便日常使用, ...

  10. Jenkins CLI 命令详解

    笔者在前文<通过 CLI 管理 Jenkins Server>中介绍了如何通过 SSH 或客户端命令行的方式管理 Jenkins Server,限于篇幅,前文主要的目的是介绍连接 Jenk ...