H5C3时钟实例(rem适配)

1.原理分析和效果图

先上效果图:

屏幕适配上使用rem适配,假设用户的手机屏幕最下宽度是375px,而谷歌浏览器最小的字体大小为12px,所以我以375px为标准尺寸进行rem适配,即375px的屏幕设置html标签字体大小为12px,随着屏幕宽度增大,1rem也随之增大

表盘使用的是圆角,使之展现为正圆的效果。刻度条其实是几条div通过rotate产生的,但是中间用一个遮罩盖住了(粉色区域)

页面初始化后开启定时器,每秒钟获取一次当前时间,解析时分秒,计算相应的角度值,将其应用到相关元素上

2.完整代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>时钟</title>
    <style>
        html{
            font-size: 10px;
        }
        *{
            margin: 0;
            padding: 0;
        }
        .clock{
            margin: 5rem auto;
            width: 28rem;
            height:28rem;
            border:10px solid #ccc;
            border-radius: 50%;
            position: relative;
            max-width: 640px;
        }
        .clock > .line{
            position: absolute;
            width: 0.8rem;
            height: 100%;
            background-color: #ccc;
            left: 50%;
            transform-origin: center center;
            transform: translate(-50%,0);
        }
        .clock > .line:nth-of-type(1){
            transform: translate(-50%,0) rotate(30deg);
        }
        .clock > .line:nth-of-type(2){
            transform: translate(-50%,0) rotate(60deg);
        }
        .clock > .line:nth-of-type(3){
            width: 1rem;
            transform: translate(-50%,0) rotate(90deg);
        }
        .clock > .line:nth-of-type(4){
            transform: translate(-50%,0) rotate(120deg);
        }
        .clock > .line:nth-of-type(5){
            transform: translate(-50%,0) rotate(150deg);
        }
        .clock > .line:nth-of-type(6){
            width: 1rem;
            transform: translate(-50%,0) rotate(180deg);
        }

        .clock > .cover{
            position: absolute;
            background-color: #fff;
            width: 25rem;
            height: 25rem;
            left: 50%;
            top: 50%;
            transform: translate(-50%,-50%);
            z-index: 10;
            border-radius: 50%;
        }
        .clock > .cover > .mark{
            position: absolute;
            width: 4rem;
            height: 3rem;
            line-height: 3rem;
            z-index: 50;
            text-align: center;
            font-size: 3rem;
            font-weight: bold;
        }
        .clock > .cover > .mark:nth-of-type(1){
            top: 0;
            left: 50%;
            transform: translate(-50%,0);
        }
        .clock > .cover > .mark:nth-of-type(2){
            top: 50%;
            right: 0;
            transform: translate(0,-50%);
        }
        .clock > .cover > .mark:nth-of-type(3){
            bottom:0;
            left: 50%;
            transform: translate(-50%,0);
        }
        .clock > .cover > .mark:nth-of-type(4){
            top: 50%;
            left: 0;
            transform: translate(0,-50%);
        }
        .clock > .cover > .weekday,
        .clock > .cover > .date{
            position: absolute;
            width: 12rem;
            height: 2rem;
            line-height: 2rem;
            z-index: 50;
            text-align: center;
            font-size: 2rem;
            font-weight: bold;
            left: 50%;
            transform: translate(-50%,0);
        }
        .clock > .cover > .date{
            top:20%;
        }
        .clock > .cover > .weekday{
            bottom:20%;
        }
        .clock > .hour{
            position: absolute;
            background-color: rgba(255,0,0,0.5);
            width: 0.6rem;
            height: 8rem;
            left: 50%;
            bottom: 50%;
            transform: translate(-50%,0);
            z-index: 20;
            transform-origin: center bottom;
        }
        .clock > .minute{
            position: absolute;
            background-color: rgba(0,255,0,0.5);
            width: 0.4rem;
            height: 9rem;
            left: 50%;
            bottom: 50%;
            transform: translate(-50%,0);
            z-index: 30;
            transform-origin: center bottom;
        }
        .clock > .second{
            position: absolute;
            background-color: rgba(0,0,255,0.5);
            width: 0.3rem;
            height: 10rem;
            left: 50%;
            bottom: 50%;
            transform: translate(-50%,0);
            z-index: 40;
            transform-origin: center bottom;
        }
        .clock > .origin{
            position: absolute;
            background-color: #ccc;
            width: 2rem;
            height: 2rem;
            left: 50%;
            top: 50%;
            transform: translate(-50%,-50%);
            z-index: 50;
            border-radius: 50%;
        }
    </style>
    <script>
        // 设定rem
        setRem();
        window.onload=function(){
            //设置定时器才指针走起来
            setInterval(function(){
                setClock();
            },1000);
        }
        function setRem(){
            // 设置能适配的最小屏幕宽度(375宽度对应12px 满屏为31.25rem)
            var min = 375
            // 设置能适配的最大屏幕宽度
            var max = 640
            if(window.screen.width >= max){
                //超过640的宽度一览表按640处理 12是因为谷歌浏览器最小字体是12px
                document.documentElement.style.fontSize = max/min * 12 + "px";
            }else{
                document.documentElement.style.fontSize = window.screen.width/min * 12 + "px";
            }
        }
        function setClock(){
            //获取指针对应的dom元素
            var hourHand = document.querySelector('.hour');
            var minuteHand = document.querySelector('.minute');
            var secondHand = document.querySelector('.second');

            var date = new Date();
            //获取时分秒
            var hour = date.getHours()%12;
            var minute = date.getMinutes();
            var second = date.getSeconds();

            //根据当前时间获取各指针的初始角度值
            var hourDeg = hour/12*360 + minute/60*30;
            var minuteDeg = minute/60*360;
            var secondDeg = second/60*360;

            //将角度值应用到时钟上
            hourHand.style.transform = `translate(-50%,0) rotate(${hourDeg}deg)`;
            minuteHand.style.transform = `translate(-50%,0) rotate(${minuteDeg}deg)`;
            secondHand.style.transform = `translate(-50%,0) rotate(${secondDeg}deg)`;

            //获取日期
            var year = date.getFullYear();
            var month = date.getMonth() + 1;
            var d = date.getDate();
            var dateStr = `${year}-${month}-${d}`;
            if(  dateStr != document.querySelector('.date').innerHTML ){
                document.querySelector('.date').innerHTML = dateStr;
            }

            //获取星期
            var weekday = date.getDay();
            var weekdayArr=["星期日","星期一","星期二","星期三","星期四","星期五","星期六"];
            var weekdayStr = document.querySelector('.weekday').innerHTML;
            if(  weekdayStr != weekdayArr[weekday] ){
                document.querySelector('.weekday').innerHTML = weekdayArr[weekday];
            }
        }
    </script>
</head>
<body>
    <div class="clock">
        <div class="line"></div>
        <div class="line"></div>
        <div class="line"></div>
        <div class="line"></div>
        <div class="line"></div>
        <div class="line"></div>
        <div class="cover">
            <div class="mark">12</div>
            <div class="mark">3</div>
            <div class="mark">6</div>
            <div class="mark">9</div>
            <div class="date">2019-4-18</div>
            <div class="weekday">星期四</div>
        </div>
        <div class="hour"></div>
        <div class="minute"></div>
        <div class="second"></div>
        <div class="origin"></div>
    </div>
</body>
</html>

原文地址:https://www.cnblogs.com/OrochiZ-/p/11618653.html

时间: 2024-08-01 03:04:36

H5C3时钟实例(rem适配)的相关文章

em与rem之间的区别以及移动设备中的rem适配方案

em与rem之间的区别: 共同点: 它们都是像素单位 它们都是相对单位 不同点: em大小是基于父元素的字体大小 rem大小是基于根元素(html)的字体的大小 实例: <!DOCTYPE html> <html lang="en" style="font-size: 50px"> <head> <meta charset="UTF-8"> <title>Document</tit

webapp思路和rem适配极其viewport

webapp在制作时候,页面上要加入viewport标签,用来进行适配; viewport的meta标签,指的是在移动端显示的时候,viewport是多大?移动端的浏览器是屏幕宽,viewport一般(手机浏览器)默认的是960px左右,就把页面压缩到 960px显示,所以是比手机屏幕宽的哟.等比放小,所以,为了显示的好看,要设定viewport为屏幕宽,就是:如此标签 <meta name="viewport" content="width=device-width,

移动端使用rem适配及相关问题

移动端适配方案,说多也很多.可以使用百分比布局,但百分比与em都是基于父元素进行计算的,在实际应用中不是很方便.使用rem不仅可以设置字体大小,块大小也可以设置.而且可以良好的适配各种终端,所以这方案很受欢迎. rem定义及浏览器支持情况 rem(font size of the root element)是指相对于根元素的字体大小的单位.简单的说它就是一个相对单位.看到rem一定会想起em单位,em(font size of the element)是指相对于父元素的字体大小的单位.它们之间其

移动APP中rem适配

将js中的代码引入自己html页面中,页面内的所有有关尺寸大小的设定都可以用rem来代替,如用rem代替px的使用,可以做到屏幕大内容按比例放大,是所有内容哦,若果你项目中所有内容都使用rem. <!doctype html><html><head><meta charset="utf-8"><title>移动APP中rem适配-jq22.com</title><script src="http:/

rem适配

//REM适配new function() { var _self = this; _self.width = 640; // 设置默认最大宽度 _self.fontSize = 100; // 默认字体大小 _self.widthProportion = function() { var p = (document.body && document.body.clientWidth || document.getElementsByTagName("html")[0]

移动端适配(3)---rem适配

rem适配 <meta name="viewport"  content="width=device-width,user-scalable=no"/> <script> (function(){ var html=document.documentElement; var hWidth=html.getBoundingClientRect().width; html.style.fontSize=hWidth/16+"px&quo

移动端最强适配(rem适配之px2rem)&amp;&amp; 移动端结合Vuex实现简单loading加载效果

一.rem之px2rem适配 前言:相信许多小伙伴上手移动端时面对各式各样的适配方案,挑选出一个自己觉得简便.实用.高效的适配方案是件很纠结的事情. 深有体会... 经过多个移动端项目从最初的 viewport --> 百分比 --> rem --> rem的升级版px2rem可谓是一把鼻涕一把泪啊 ,在px2rem之前总觉得之前的不够完美或者麻烦: 进入正题: 首先 px2rem 也是基于 rem  适配的,但是他的好用之处在于灵活.简便.高效不用我们自己去换算.px2rem-load

0082 rem适配方案:less+rem+媒体查询、flexible.js+rem

1.让一些不能等比自适应的元素,达到当设备尺寸发生改变的时候,等比例适配当前设备. 2.使用媒体查询根据不同设备按比例设置html的字体大小,然后页面元素使用rem做尺寸单位,当html字体大小变化,元素尺寸也会发生变化,从而达到等比缩放的适配. 技术方案: 1.less+rem+媒体查询 2.flexible.js+rem 总结: 两种方案现在都存在,方案2 更简单,现阶段无需了解里面的js代码. rem实际开发适配方案1 ①假设设计稿是750px ②假设我们把整个屏幕划分为15等份(划分标准

前端移动端的rem适配计算原理

rem是什么? rem(font size of the root element)是指相对于根元素的字体大小的单位.简单的说它就是一个相对单位.看到rem大家一定会想起em单位,em(font size of the element)是指相对于父元素的字体大小的单位.它们之间其实很相似,只不过一个计算的规则是依赖根元素一个是依赖父元素计算. 计算原理: 1 屏幕宽为 clientWidth(px). 设计稿宽度为 750 (px), 假设 n = clientWidth(px)/750(px)