CSS 绘制 哆啦A梦

2015/03/26 | 3分钟阅读 | 更新于 2015/03/26

持续更新中

2015-03-26

24号试着自己用纯css绘制一个哆啦A梦出来,然后昨天有事情耽搁,今天写了一点,完成了脑袋部分。发现自己的代码有一些问题。理论上来说,我可以把所有的小部件全部丢到一个div里,然后用相对定位把它们挨个固定好。但是这样有个弊端就是一旦我修改了某一个元素,后面的位置基本上就全乱掉了。所以我看得别人做好的源码都是分成好几大块,头,身体,腿这样。我倒是也这么做的,从“头”开始。但是在这一部分里小零件虽然分了层,但是零件过多定位还是有点混乱。

好像我说的有点乱,就是我觉得没一小部分可以通过外框控制定位,内框绘制样式来尽可能少的减少相对定位的使用。然后同时可以用overflow:hidden;之类的代码控制边界。

举个例子

看图中舌头部分,这里我是在嘴(div.mouse)中列了一个(div.mouse-in),而后者中有两个小的方div,宽度和大于div.mouse-in,靠相对定位排在div.mouse-in中,然后div.mouse-in再用margin:0 auto;以及相对定位固定。为了添加线描的效果,最内部的两个div我是设置了border-top;然后外面的div.mouse-in设置overflow:hidden;在IE11下显示ok。但是在firefox下边框会隐隐延伸出来(就是这张图)。

现在我有个想法是,舌头每个小圆外罩一个div用overflow:hidden;划好,然后两个div带上float:left; 直接放在一个两倍他们宽度的div.mouse-in中。 另外一个例子是,哆啦A梦的头,外套一个带overflow:hidden; 高度小于实际头高的div,把头的底部消掉,这时候下面无论是放身体还是放项圈都不需要再额外定位了。 附上现在版本的代码

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
  <head>
    <meta charset="UTF-8" />
    <style>
      body,
      div {
        margin: 0;
        padding: 0;
      }
      div.dm {
        width: 200px;
        margin: 20px auto;
      }
      div.head {
        border: 1px solid #000000;
        margin: 10px auto;
        width: 200px;
        height: 180px;
        background-color: #66aadd;
        border-top-left-radius: 100px;
        border-top-right-radius: 100px;
        border-bottom-left-radius: 100px;
        border-bottom-right-radius: 100px;
        border-radius: 100px;
      }
      div.face {
        position: relative;
        margin: 0px auto;
        top: 20px;
        width: 180px;
        height: 160px;
        background-color: #ffffff;
        border-radius: 100%;
      }
      div.eyes {
        margin: 0 auto;
        width: 72px;
        height: 45px;
        position: relative;
        top: -17px;
      }
      div.eye {
        box-sizing: border-box;
        width: 36px;
        height: 45px;
        border-radius: 100%;
        border: 1px solid #000000;
        background-color: #ffffff;
        float: left;
      }
      div.eyel {
      }
      div.eyer {
      }
      i.eyel-in {
        display: block;
        box-sizing: border-box;
        width: 12px;
        height: 16px;
        border-radius: 100%;
        background-color: #ffffff;
        border: 5px solid #000000;
        position: relative;
        left: 18px;
        top: 22px;
      }
      i.eyer-in {
        box-sizing: border-box;
        display: block;
        width: 15px;
        height: 15px;
        border-radius: 100%;
        border-top: 3px solid #000000;
        position: relative;
        top: 25px;
        left: 5px;
      }
      div.nose {
        box-sizing: border-box;
        width: 24px;
        height: 24px;
        border: 8px solid #cc0000;
        border-top: 7px solid #cc0000;
        border-bottom: 9px solid #cc0000;
        background-color: #ffffff;
        border-radius: 100%;
        margin: 0 auto;
        position: relative;
        top: -24px;
      }
      div.line {
        width: 2px;
        height: 27px;
        background-color: #808080;
        margin: 0 auto;
        position: relative;
        top: -24px;
      }
      div.m {
        width: 70px;
        height: 2px;
        background-color: #000000;
        position: relative;
      }
      div.l1,
      div.l2,
      div.l3 {
        transform-origin: right;
        position: relative;
        left: -90px;
      }
      div.r1,
      div.r2,
      div.r3 {
        position: relative;
        left: 20px;
        transform-origin: left;
      }
      div.r1 {
        top: -2px;
      }
      div.r2 {
        top: -2px;
      }
      div.r3 {
        top: -2px;
      }
      div.l1,
      div.r3 {
        transform: rotate(15deg);
      }
      div.l2,
      div.r2 {
        transform: rotate(0deg);
      }
      div.l3,
      div.r1 {
        transform: rotate(-15deg);
      }
      div.mouse {
        margin: 0 auto;
        position: relative;
        top: -24px;
        width: 140px;
        height: 70px;
        background-color: #ee1222;
        border-bottom-left-radius: 150px;
        border-bottom-right-radius: 150px;
        overflow: hidden;
        border: 1px solid #000000;
      }
      div.mouse-in {
        width: 130px;
        height: 50px;
        margin: 0 auto;
        position: relative;
        top: 20px;

        overflow: hidden;
      }
      div.te {
        width: 70px;
        height: 70px;
        border-radius: 100%;
        background-color: #f48d00;
        border-top: 1px solid #000000;
      }
      div.te1 {
        position: relative;
        left: 0px;
      }
      div.te2 {
        position: relative;
        left: 60px;
        top: -70px;
      }
    </style>
  </head>
  <body>
    <div class="dm">
      <div class="head">
        <div class="face">
          <div class="eyes">
            <div class="eye eyel">
              <i class="eyel-in"></i>
            </div>
            <div class="eye eyer">
              <i class="eyer-in"></i>
            </div>
          </div>
          <div class="nose"></div>
          <div class="line">
            <div class="m l1"></div>
            <div class="m r1"></div>
            <div class="m l2"></div>
            <div class="m r2"></div>
            <div class="m l3"></div>
            <div class="m r3"></div>
          </div>
          <div class="mouse">
            <div class="mouse-in">
              <div class="te te1"></div>
              <div class="te te2"></div>
            </div>
          </div>
        </div>
      </div>
    </div>
  </body>
</html>

2015-03-24

© 2026 香蕉引擎故障报告

🌱 Powered by Hugo with theme Dream.

关于

要怎么介绍自己呢,🤔。

很早以前是作为 Web 前端在学习的,但是工作第一年就成为了全干工程师。喜欢尝试各种东西,什么都会一点。

一直很喜欢 Ebiten 游戏引擎 ,特别简洁,用它做过一些小东西,可以查看这个分类 。另外特别推荐这个木鱼 ,是一个相对完整的小玩意儿,包含手搓的一个简单的 UI 框架;支持鼠标和键盘操作;有多语言和主题切换功能;同时支持 Web 端和客户端。它的源代码在 bin16/wooden-fish

主题

网站基于 Hugo,当前使用的是 hugo-theme-dream 主题的修改版 ,根据我的需要,做了一些对 PaperMod 的兼容。

我自己也写过主题 ,但是没有别人写的好看。

正在从我的笔记中往外搬运内容

等待更新:

  • 从《锈湖》中学了些什么东西
  • 我拿 React 写解谜游戏的经过
  • 基于 Pocketbase 的 Pocket Memos
  • 数独!