Angular6封装LED时钟数字组件
一、运行截图
截图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时钟数字组件的更多相关文章
- C#进阶系列——一步一步封装自己的HtmlHelper组件:BootstrapHelper(三:附源码)
		前言:之前的两篇封装了一些基础的表单组件,这篇继续来封装几个基于bootstrap的其他组件.和上篇不同的是,这篇的有几个组件需要某些js文件的支持. 本文原创地址:http://www.cnblog ... 
- 原生JS面向对象思想封装轮播图组件
		原生JS面向对象思想封装轮播图组件 在前端页面开发过程中,页面中的轮播图特效很常见,因此我就想封装一个自己的原生JS的轮播图组件.有了这个需求就开始着手准备了,代码当然是以简洁为目标,轮播图的各个功能 ... 
- C#进阶系列——一步一步封装自己的HtmlHelper组件:BootstrapHelper
		前言:之前学习过很多的Bootstrap组件,博主就在脑海里构思:是否可以封装一套自己Bootstrap组件库呢.再加上看到MVC的Razor语法里面直接通过后台方法输出前端控件的方式,于是打算仿照H ... 
- JS组件系列——封装自己的JS组件,你也可以
		前言:之前分享了那么多bootstrap组件的使用经验,这篇博主打算研究下JS组件的扩展和封装,我们来感受下JQuery为我们提供$.Extend的神奇,看看我们怎么自定义自己的组件,比如我们想扩展一 ... 
- JS组件系列——分享自己封装的Bootstrap树形组件:jqTree
		前言:之前的一篇介绍了下如何封装自己的组件,这篇再次来体验下自己封装组件的乐趣.看过博主博客的园友应该记得之前分享过一篇树形菜单的使用JS组件系列——Bootstrap 树控件使用经验分享,这篇里面第 ... 
- JS组件系列——封装自己的JS组件
		前言:之前分享了那么多bootstrap组件的使用经验,这篇博主打算研究下JS组件的扩展和封装,我们来感受下JQuery为我们提供$.Extend的神奇,看看我们怎么自定义自己的组件,比如我们想扩展一 ... 
- 从零开始教你封装自己的vue组件
		组件(component)是vue.js最强大的功能之一,它可以实现功能的复用,以及对其他逻辑的解耦.但经过一段时间的使用,我发现自己并没有在业务中发挥出组件的最大价值.相信很多刚开始使用vue的朋友 ... 
- Android Widget小组件开发(一)——Android实现时钟Widget组件的步骤开发,这些知识也是必不可少的!
		Android Widget小组件开发(一)--Android实现时钟Widget组件的步骤开发,这些知识也是必不可少的! PS:学习自某网站(不打广告) 这个小组件相信大家都很熟悉吧,以前的墨迹天气 ... 
- vue和echarts 封装的 v-charts 图表组件
		https://v-charts.js.org/#/ 在使用 echarts 生成图表时,经常需要做繁琐的数据类型转化.修改复杂的配置项,v-charts 的出现正是为了解决这个痛点.基于 Vue2. ... 
随机推荐
- 在Ubuntu登陆界面输入密码之后,黑屏一闪后,又跳转到登录界面
			现象:在Ubuntu登陆界面输入密码之后,黑屏一闪后,又跳转到登录界面.原因:主目录下的.Xauthority文件拥有者变成了root,从而以用户登陆的时候无法都取.Xauthority文件.说明:X ... 
- docker中gitlab-runner配置
			1.启动gitlab-runner docker run -d --name gitlab-runner --restart always \ -v /opt/data/gitlab-runner/c ... 
- 使用Docker搭建CentOS 7 + Apache 2.4+ PHP7
			从Docker Hub上Pull最新的CentOS 7镜像并新建容器 # sudo docker pull centos docker run -p 8082:80 --name centos_c - ... 
- Internetworking
			1 Introduction 所谓的InternetWorking就是将很多网络连接起来,那么在这种连接的网络下我们该如何传送封包呢? 2 IP and Routers 1 IP Datagram H ... 
- 网易易盾最新一代Java2c加固究竟有什么厉害之处?
			导语:几个月前,网易易盾正式推出Java2c加固.它以独有的"静态保护"技术,使得应用程序中的代码出现"下沉",达到不可逆的效果,兼顾"冷热启动时间& ... 
- Lerning Entity Framework 6 ------ Working with in-memory data
			Sometimes, you need to find some data in an existing context instead of the database. By befault, En ... 
- 47_并发编程-线程python实现
			一.Threading模块 1.线程的创建 - 方式一 from threading import Thread import time def sayhi(name): time.sleep(2 ... 
- java数组-如何在一堆数据中使用数组!
			数组 1.类型一致的一组数据,其实相当于集合概念. 数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成.其中,每一个数据称作一个数组元素(item),每个数组元素可以通过一个下标/索引来 ... 
- fscanf_s与scanf_s的宽度参数与缓冲区参数分析
			fscanf_s函数 在文件操作中经常会用到fscanf这个函数,但是在VC和VS中会有警告 意思是编译器觉得fscanf不安全,叫你考虑用一下fscanf_s这个函数来代替fscanf,fscanf ... 
- PHP注释
			PHP支持C.C++和 Shell 脚本风格的注释. 单行注释 两个反斜线组成的单行注释 // 注释内容 一个井号组成的单行注释 # 注释内容 说明:PHP单行注释几乎用的都是//,很少使用#来注释内 ... 
