热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

纯CSS打造银色MacBookAir(完整版)

上一篇:《selection伪元素小解》::selection{background:blue;color:red;}p{font-size:14px;}
上一篇:《selection伪元素小解》

作者主页:myvin
博主QQ:851399101(点击QQ和博主发起临时会话)

写在前面的前面

前几天讲解了自己用纯CSS绘制银色MacBook Air的详细过程,由于篇幅较长就分了两部分介绍,今天我将其合二为一方便大家查看,该文章用Markdown+少量的html编辑。

同时在用markdown的过程中发现,一些markdown语法在cnblog博文里面和直接在浏览器显示是有区别的,比如网址链接和引用,但是完全不影响使用和查看。为了让大家更好的查看,markdown中的所有链接我都用a标签进行了修饰,并没有使用markdown中的链接方式。

写在前面

前段时间自己用CSS绘制了一个银色的MacBook Air,今天把它从电脑硬盘深处挖了出来,我把我的思路和想法写下来和小伙伴们分享分享。先把最后的效果给大家。

First 注:如果图片显示过大没有完全显示,请Command+R(Ctrl+F5)。

Double 注:本文为Markdown+少量html编辑。

Triple 注:祝愿小伙伴们每天都过得快乐。

这其实是一个半成品,键盘上的其他图标和文字都还没有加,图标的话可以用font-face,待我找着合适的字体图标网址链接后给大家补全,同时也欢迎小伙伴们捣腾。

小伙伴们也可以猛戳这里Codepen上查看高清无码大图,给出链接:

http://codepen.io/myvin/pen/yNezZR

零、第零步

这里使用了CSS的before、after伪元素、渐变gradient、阴影、nth-child选择器等相关内容,阴影和渐变效果从图片上可能看的不太清楚,小伙伴们可以去上面的Codepen上查看,文章的最后我会给出整个源代码,有兴趣的可以自己随意修改完善。

Ok,开始肆无忌惮地进入。

首先介绍一下绘制的结构。

对于键盘,就是建立了一个无序列表ul,然后写上若干个li即可,其他的用几个div包裹即可,先给出HTML结构:

4个div加上2个伪元素,总共六个部分构成整个MacBook Air。board是MacBook Air的底座,blackbar是屏幕的那个黑色旋转轴,keyboard是键盘,touch是触控板;board:before是上面的盖子,border-bottom是盖子下面的那个黑色细长条。Ok,这六部分构成了整个MacBook Air。

我说个什么:

接下来,我按照我的绘制顺序一步步来介绍。口渴的小伙伴可以先去沏杯茶。

一、第一步

先给出HTML,下面是一段很长很长但是却没什么研究价值的无序列表,让滚轮飞起来吧:

  • !1
  • @2
  • #3
  • $4
  • %5
  • ^6
  • &7
  • *8
  • (9
  • )0
  • -
  • +=
  • Q
  • W
  • E
  • R
  • T
  • Y
  • U
  • I
  • O
  • P
  • {[
  • }]
  • |\
  • A
  • S
  • D
  • F
  • G
  • H
  • J
  • K
  • L
  • :;
  • "'
  • Z
  • X
  • C
  • V
  • B
  • N
  • M
  • <,
  • >.
  • ?/
  • By Pure CSS.To Be Continued.

其中,&、大于号(>)、小于号(<)使用的是字符实体。

键盘按键为若干个li,其中按键上有两个符号的我用两个span包了起来,像这样:

  • !1
  • 因为它们最后式一上一下的69体位,用span包裹住便于分别布置它们的位置。

    先绘制一个600*450的div,并将board居中,给一个银色的color,这里用的是rgb(210,210,210),用border-radius绘制出四个20px的圆角,用box-shadow给出一个灰色的阴影,这里用的灰色是rgb(160,160,160),小伙伴们可以自己选择合适的颜色,最后从div的左下角到右上角以60度添加一个线性渐变linear-gradient,是从白色开始从四分之一出过渡到灰色。因为之后的div会用到绝对定位,所以在此先把其父元素board定位为relative

    完整的代码及效果如下:

    .board{
        margin: 0 auto;
        padding: 0 auto;
        width: 600px;
        height: 450px;
        margin-top: 50px;
        background: rgb(210,210,210);
        border-radius: 20px;
        position: relative;
        box-shadow: 0px 5px 6px rgb(160,160,160);
        background:-webkit-linear-gradient(60deg,rgba(250,250,250,1) 25%,rgba(210,210,210,1));
    }

    这样,一个有阴影和线性渐变过渡效果的面板就率先完成了。

    二、第二步

    接下来我要画笔记本盖子,用的是伪元素board:before

    因为盖子是翻起来的,所以从上往下看是一个窄边。把board:before填充为780px*20px的div,背景颜色为灰色。

    实现及效果如下:

    .board:before{
        content: '';
        display: block;
        width: 780px;
        height: 20px;
        background: rgb(210,210,210);
    }

    然后调一下位置,board:before定位为绝对定位,board宽600px,盖子宽780px,所以left=-(780-600)/2=-90px,top为board:before的高20px,顺带做出一个大弧形的效果,水平半径取大一些,垂直半径取小一些,like this:

    border-top-left-radius: 390px 18px;
    border-top-right-radius: 390px 18px;

    对border-radius不太熟悉的小伙伴可以查看之前的《CSS3小分队——进击的border-radius》。

    此时的效果如下:

    有那么个意思了,为了做出立体的效果,我们给盖子从上到下加个渐变的过渡效果:

    background:-webkit-linear-gradient(top,rgb(210,210,210) 50%,rgb(255,255,255));

    再顺带把屏幕下的那条小黑条加上,一句话很简单:

    border-bottom: 2px solid rgb(0,0,0);

    看看效果先:

    有没有感觉某些地方有些违和?放大看一下这里:

    来个更加菊部的:

    对,就是这个小角处,给点效果:

    border-bottom: 2px solid rgb(0,0,0);

    再看看效果:

    这样黑边那也有了小的光滑弧度过渡,显得更加自然。

    附上这一步的完整代码和效果:

    .board:before{
        content: '';
        display: block;
        width: 780px;
        height: 20px;
        background: rgb(210,210,210);
        border-radius: 0px 0px 3px 3px;
        border-top-left-radius: 390px 18px;
        border-top-right-radius: 390px 18px;
        position: absolute;
        top:-20px; 
        left: -90px;
        border-bottom: 2px solid rgb(0,0,0); 
        background:-webkit-linear-gradient(top,rgb(210,210,210) 50%,rgb(255,255,255));
    }

    三、第三步

    这一步我们来做屏幕旋转轴,也就是屏幕下方的那条黑色矩形blackbar。

    同样先设置width和height,absolute定位,居中显示,移动的距离可以参考上面的方法小算一下就可以了,加上2px的圆角,为了显示出旋转轴立体的沟槽,我们给blackbar类的下边框和右边框加上2px的白色实线,同时给blackbar一个从上到下的渐变,中间显示出窄窄的亮丽的白色即可,颜色和过渡的位置小伙伴们可以自行了断,oops,是自行把握。

    实现和效果:

    .blackbar{
        width: 450px;
        height: 18px;
        position: absolute; 
        left: 75px;
        border-radius: 2px;
        border-bottom: 2px solid #ffffff; /* 小白边 */
        border-right: 2px solid #ffffff;
        background: -webkit-linear-gradient(top,rgb(30,30,30) ,rgb(60,60,60) 35%,rgb(100,100,100) 50%,rgb(30,30,30) 65%);
        background: -linear-gradient(top,rgb(30,30,30) ,rgb(60,60,60) 35%,rgb(100,100,100) 50%,rgb(30,30,30) 65%);
    }

    四、第四步

    接下来就是MacBook Air最显眼的部分了,那就是键盘部分,为什么显眼呢,因为它占的地儿最大吧哈哈哈(不好笑的事也要大笑三声)。

    在画键盘之前呢,小伙伴们最好先算好整个键盘区域的大小,各个按键的大小和排列,否则到时候只能一点点重新调,很麻烦。好了,咱先把键盘区域画下来吧。

    传统步骤,设置宽高,绝对定位,然后设置left、top居中,勾勒出1px solid 颜色为rgb(180,180,180)的border,8px的圆角,白色的背景颜色;

    实现和效果如下:

    .keyboard{
        position: absolute;
        width:530px;
        height: 216px;
        left: 35px;
        top: 35px;
        border: 1px solid rgb(180,180,180);
        border-radius: 8px;
        background:rgba(250,250,250,1);
    }

    为了显示出立体的沟槽感,阴影又该出来了。我们用box-shadow给keyboard的四条边框添加四条内部inset阴影,关于box-shadow以后有机会再讲,先把实现和效果贴上:

    box-shadow:2px 0px 2px rgb(180,180,180) inset,
    0px 3px 3px rgb(180,180,180) inset,
    -5px -0px 1px rgb(255,255,255) inset,
    0px -3px 3px rgb(180,180,180) inset;

    雏形出来了,接下来就是一个个的nth-child了。让我们接着猛烈地荡起双桨吧。

    五、第五步

    就像前面提到的,我们最好事先先计算好每个按键的大小和位置,做到心中有数,不至于到时候一片混乱,否则整个键盘就像东汉末年似的这一块儿那一块儿。

    首先是一些常规的设置,去掉列表标志,margin、padding设置,列表的宽和高balabala,按照之前的计算,设置按键与按键的间距,大致排列下这么多个按键,并给按键添加4px的圆角,为了显示立体效果,加上一个border:

    border: 1px solid rgb(70,70,70);

    并四个边添加阴影:

    box-shadow: 1px 0px 0px rgb(0,0,0),
    0px 1px 0px rgb(0,0,0),
    -1px 0px 0px rgb(0,0,0),
    0px -1px 0px rgb(0,0,0);

    附上代码和效果:

    ul,li{
        list-style: none;
        margin:0 auto;
        padding:0 auto;
        display: block;
        font-family: "Vrinda";
        -webkit-user-select: none;
        -moz-user-select: none;
        -ms-user-select: none;
        user-select: none;
    }
    
    ul{
        width:530px;
        margin-top: 8px;
        padding-left: 8px;
        /* border:2px solid black; */
    }
    
    li{
        width:29px;
        height:29px;
        float: left;
        /* padding-left: 0px; */
        margin-right: 5px;
        margin-bottom: 5px;
        background-color: rgb(30,30,30);
        color: rgb(200,200,200);
        text-align: center;
        line-height: 28px;
        font-size: 12px;
        border-radius: 4px;
        border: 1px solid rgb(70,70,70);
        box-shadow: 1px 0px 0px rgb(0,0,0),
        0px 1px 0px rgb(0,0,0),
        -1px 0px 0px rgb(0,0,0),
        0px -1px 0px rgb(0,0,0);
    }

    看上去还很乱,连文本都溢出了,但是妈妈说过,心急吃不了热豆腐,慢慢来,保准等会就驯服得她服服帖帖的。

    Tips:请用力记住父母的生日哦。

    细心的小伙伴们会发现有一段代码,貌似不细心的也能发现,就是这段:

    -webkit-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    user-select: none;

    这是什么意思呢?先来看下不加这段代码的效果:

    对,就是这一片的蓝色,当用鼠标去键盘上拖着选中的时候,那一个个的li就会被选中,添加这段代码就能还我们一片巧克力键盘了,就能还我们一个洁白的蓝天了。

    洁白...的...蓝天...^o^

    我们先把键盘最上面的那一排功能键先捣腾好。这里我们用nth-child来选择上面那一排我没数错数量应该是14个的功能键,并给它们简单设置样式。

    这里使用链式写法,实现和效果如下:

    li:nth-child(-n+14):nth-child(n+1){
        width:30px;
        height:15px;
    }

    接下来调整第二行的数字按键上的那些数字和符号的一上一下的69体位,同样先用nth-child选中再设置样式:

    li:nth-child(-n+27):nth-child(n+16) span,li:nth-child(40) span,li:nth-child(41) span,li:nth-child(42) span,
        li:nth-child(53) span,li:nth-child(54) span,li:nth-child(-n+66):nth-child(n+64) span{
        display: block;
        margin-top: 5px;
        line-height: 0.5; 
    }

    然后设置除了最后的那四个方向键外的其他键的大小,很简单,算准写就行,要做一个心中有数的男人,这块直接贴代码:

    li:nth-child(28),li:nth-child(29){
        width:45px;
    }
    li:nth-child(43),li:nth-child(55){
        width:55px;
    }
    li:nth-child(56),li:nth-child(67){
        width:73px;
    }
        li:nth-child(-n+74):nth-child(n+68){
        height:33px;
    }
    li:nth-child(72){
        width:173px;
    }
    li:nth-child(71),li:nth-child(73){
        width:37px;
    }

    找个驿站半路休息下先,顺带看下效果:

    除了四个方向键,其他的按键放置得还算可以,接着走。

    四个方向键设置也很简单,设置宽高,定位即可,不罗嗦了,直接上:

    li:nth-child(75),li:nth-child(77),li:nth-child(78){
        margin-top: 18px;
        height: 14px;
    }
    
    li:nth-child(76){
        height: 13px;
        margin-top: 19px;
    }
    
    li:nth-child(78){
        position: absolute;
        bottom: 22px;
        right:38px;
    }

    效果:

    恩,美感效果还在我的审美范围之内。

    六、第六步

    最后一步就是触控板touch的绘制了,哈哈哈,终于要诺曼底登陆了,待我喝口菊花茶先。

    触控板的绘制和键盘的绘制基本上是一样的,设置大小,定位,圆角,border即可。直接上:

    .touch{
        position: absolute;
        width:200px;
        height:150px;
        border: 2px solid rgb(190,190,190);
        bottom: 23px;
        left: 200px;
        border-radius: 8px;
    }

    七、小了个结

    到这里,MacBook Air就算完成了,还是那句话,是个半成品,一些字体图标还待用font-face来完成,当然还可以添加些动画,让它像产品旋转来展示等等,这只是抛砖引玉而已,期待小伙伴们更多奇思妙想。小伙伴们有好的想法欢迎分享~~~

    作者:myvin
    原文出处:http://www.cnblogs.com/myvin/p/4621231.html
    CodePen源码地址:http://codepen.io/myvin/pen/yNezZR
    转载请记得说明作者和出处哦-.-

    下一篇:《函数声明和函数表达式——函数声明的声明提前》

    推荐阅读
    • javascript分页类支持页码格式
      前端时间因为项目需要,要对一个产品下所有的附属图片进行分页显示,没考虑ajax一张张请求,所以干脆一次性全部把图片out,然 ... [详细]
    • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
      在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
    • 在今天的实践中,我深入学习了网页图像抓取技术,通过编写爬虫程序批量获取网站上的图片资源。具体来说,我选择了一个包含大量高质量图片的网站作为练习对象,并成功实现了将这些图片批量下载到本地存储。这一过程不仅提升了我对爬虫技术的理解,还增强了我的编程能力。 ... [详细]
    • 使用jqTransform插件美化表单
      jqTransform 是由 DFC Engineering 开发的一款 jQuery 插件,专用于美化表单元素,操作简便,能够美化包括输入框、单选按钮、多行文本域、下拉选择框和复选框在内的所有表单元素。 ... [详细]
    • 网站访问全流程解析
      本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
    • MySQL Decimal 类型的最大值解析及其在数据处理中的应用艺术
      在关系型数据库中,表的设计与SQL语句的编写对性能的影响至关重要,甚至可占到90%以上。本文将重点探讨MySQL中Decimal类型的最大值及其在数据处理中的应用技巧,通过实例分析和优化建议,帮助读者深入理解并掌握这一重要知识点。 ... [详细]
    • 在Cisco IOS XR系统中,存在提供服务的服务器和使用这些服务的客户端。本文深入探讨了进程与线程状态转换机制,分析了其在系统性能优化中的关键作用,并提出了改进措施,以提高系统的响应速度和资源利用率。通过详细研究状态转换的各个环节,本文为开发人员和系统管理员提供了实用的指导,旨在提升整体系统效率和稳定性。 ... [详细]
    • 本指南介绍了如何在ASP.NET Web应用程序中利用C#和JavaScript实现基于指纹识别的登录系统。通过集成指纹识别技术,用户无需输入传统的登录ID即可完成身份验证,从而提升用户体验和安全性。我们将详细探讨如何配置和部署这一功能,确保系统的稳定性和可靠性。 ... [详细]
    • Squaretest:自动生成功能测试代码的高效插件
      本文将介绍一款名为Squaretest的高效插件,该工具能够自动生成功能测试代码。使用这款插件的主要原因是公司近期加强了代码质量的管控,对各项目进行了严格的单元测试评估。Squaretest不仅提高了测试代码的生成效率,还显著提升了代码的质量和可靠性。 ... [详细]
    • 在第10天的夜灵HTML日志中,我们深入探讨了浏览器兼容性和高级选择器的应用。CSS3引入了许多新属性,但在旧版浏览器中的支持情况并不理想。然而,目前主流浏览器的最新版本已全面支持这些新特性。对于那些不支持CSS3新属性的浏览器,我们提供了多种解决方案,以确保网站在不同环境下的兼容性和用户体验。此外,我们还详细讨论了如何利用高级选择器提升页面布局的灵活性和可维护性。 ... [详细]
    • 可转债数据智能抓取与分析平台优化
      本项目旨在优化可转债数据的智能抓取与分析平台。通过爬取集思录上的可转债信息(排除已发布赎回的债券),并结合安道全教授提出的三条安全线投资策略,新增了建仓线、加仓线和重仓线,以提供更精准的投资建议。 ... [详细]
    • PyQt5 QTextEdit:深入解析Python中多功能GUI库的应用与实现
      本文详细探讨了 PyQt5 中 QTextEdit 组件在 Python 多功能 GUI 库中的应用与实现。PyQt5 是 Qt 框架的 Python 绑定,提供了超过 620 个类和 6000 个函数及方法,广泛应用于跨平台应用程序开发。QTextEdit 作为其中的重要组件,支持丰富的文本编辑功能,如富文本格式、文本高亮和自定义样式等。PyQt5 的流行性不仅在于其强大的功能,还在于其易用性和灵活性,使其成为开发复杂用户界面的理想选择。 ... [详细]
    • 本文介绍如何在 Android 中自定义加载对话框 CustomProgressDialog,包括自定义 View 类和 XML 布局文件的详细步骤。 ... [详细]
    • 在CentOS 7环境中安装配置Redis及使用Redis Desktop Manager连接时的注意事项与技巧
      在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ... [详细]
    • 本文详细介绍了在MySQL中如何高效利用EXPLAIN命令进行查询优化。通过实例解析和步骤说明,文章旨在帮助读者深入理解EXPLAIN命令的工作原理及其在性能调优中的应用,内容通俗易懂且结构清晰,适合各水平的数据库管理员和技术人员参考学习。 ... [详细]
    author-avatar
    mobiledu2502902725
    这个家伙很懒,什么也没留下!
    PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有