2

こんにちは私はこのようなドーナツメニューを実装したいと思いますhttp://dribbble.com/shots/610433-Wheel-Navcss3でドーナツを行う簡単な方法があることを知っています。

.doughnut { 
    border: 50px solid #f00;
    border-radius: 100px;
    height:100px;
    width:100px;
}

しかしもちろん、これはドーナツを内部に要素なしで作るだけです。とにかくcss3だけでそれを行うのではないかと思いますが、どのように始めるかについてのアイデアはありますか?cssだけでは不可能な場合は、javascript領域にジャンプします...

4

3 に答える 3

14

CSSでその画像を再現する私の試み:

ライブデモ

結果:

結果

HTML :

<ul class='menu circ-menu'>
  <li class='menu-item'>
    <a href='#'>☊&lt;/a>
  </li>
  <li class='menu-item selected'>
    <a href='#'>☁☀</a>
    <ul class='menu submenu'>
      <li><a href='#'>☂&lt;/a></li><!--
      --><li><a href='#'>☁&lt;/a></li><!--
      --><li><a href='#'>☃&lt;/a></li>
    </ul>
  </li>
  <li class='menu-item'>
    <a href='#'>✦&lt;/a>
  </li>
</ul>

CSS :

.menu { padding: 0; list-style: none; }
.menu a {
  display: block;
  color: #666561;
  font: 900 2em/3.2 monospace;
  text-decoration: none;
  text-shadow: 0 1px white;
}
.circ-menu {
  overflow: hidden;
  position: relative;
  margin: 1em auto;
  padding: 5em 0 0;
  width: 20em; height: 10em;
  box-shadow: 0 .5em .5em -.5em;
}
.menu-item {
  overflow: hidden;
  position: absolute;
  z-index: 0;
  left: -50%; bottom: 0;
  width: 20em; height: 20em;
  transform-origin: 100% 100%;
}

/* === style the menu items (slices) === */

/* three slices making up half a circle mean that a slice is going to have a central_angle = 60deg */
.menu-item:first-child {
  transform: skewX(30deg) /* 90deg - central_angle */;
}
.menu-item:nth-child(2) {
  /* rotate by the value of the central angle multiplied with how many slices are before */
  transform: 
    rotate(60deg) /* 60deg = 1*central angle */
    skewX(30deg) /* 90deg - central_angle */;
}
.menu-item:last-child {
  transform: 
    rotate(120deg) /* 120deg = 2*central angle */
    skewX(30deg) /* 90deg - central_angle */;
}

/* === contents of the menu items === */
.menu-item > * {
  position: absolute;
  top: 55%; left: 55%;
  width: 90%; height: 90%;
  text-align: center;
}
.menu-item > a {
  border-radius: 50%;
  box-shadow: 0 0 0 .2em #aaa497, 
    0 0 .5em .2em black;
  transform:
    skewX(-30deg) /* unskew */
    rotate(-60deg);
  background: #f8f4ef;
  background: 
    radial-gradient(transparent 39%, #f7f3ee 40%);
}
.selected > a { z-index: 1; }
.selected > a, .menu a:hover {
  color: #e96429;
}
.selected > a, .menu-item > a:hover {
  box-shadow: 0 0 0 .2em #e96429, 
    0 0 .5em .2em black;
  background: 
    linear-gradient(60deg, #e96429 31%, rgba(247, 243, 238, 0) 33%),
    linear-gradient(-60deg, #e96429 31%, rgba(247, 243, 238, 0) 33%),
    radial-gradient(transparent 39%, #f7f3ee 40%);
  background-size: 100% 26%,  100% 26%, 100% 100%;
}

.submenu {
  z-index: 0;
  transform: 
    skewX(-30deg) /* unskew */
    rotate(-60deg)
    translateY(-5.25em);
}
.submenu li {
  display: inline-block;
  position: relative;
  border-top: solid 1px #666561;
  border-bottom: solid 1px #666561;
  width: 3.2em; height: 3.2em;
  background: #f7f3ee;
}
.submenu li:before {
  position: absolute;
  bottom: 0;
  width: 100%; height: .2em;
  background: #666561;
  content: '';
}
.submenu a {
  line-height: 2
}
.submenu li:first-child {
  border-radius: .3em 0 0 .3em;
  border-left: solid 1px #666561;
}
.submenu:after {
  position: absolute;
  z-index: -1;
  top: 2.5em; left: 50%;
  margin: 0 -.6em;
  width: 1.2em; height: 1.2em;
  transform: rotate(-30deg) skewX(30deg);
  background: #666561;
  content: '';
}
.submenu li:last-child {
  border-radius: 0 .3em .3em 0;
  border-right: solid 1px #666561;
}

.circ-menu:before, .circ-menu:after {
  position: absolute;
  z-index: 1;
  bottom: -7.071em; left: 14.645%;
  width: 14.142em; height: 14.142em;
  border-radius: 50%;
  content: '';
}
.circ-menu:before {
  bottom: -5em; left: 5em;
  width: 10em; height: 10em;
  box-shadow: inset 0 0 .75em black, 
    0 0 .5em .2em #f7f3ee;
}
.circ-menu:after {
  bottom: -1em; left: 9em;
  width: 2em; height: 2em;
  box-shadow: 0 0 .4em dimgrey, 
    0 0 0 .75em #e27447, 
    0 0 .4em .75em dimgrey, 
    0 0 0 2em #f7f3ee, 
    0 0 .4em 2em dimgrey;
  background: #f7a480;
}

アイデアはとてもシンプルです。すべてのメニューで行うのと同じように、リスト構造から始めます。

<ul class='menu-circ'>
  <li class='menu-item'><a href='#'>boo</a></li>
  <!-- the other list items -->
</ul>

基本的な考え方の説明

コンテナ.menu-circ position: relativeを指定し、そのコーナーの 1 つが (の) 中心にあるように、その子 (メニュー項目) を絶対に配置します.menu-circ。次に、transform-origin を.menu-itemそのコーナーに設定します。

この場合、右下隅を中央に選択しました (transform-origin: right bottomは に相当しtransform-origin: 100% 100%ます) が、実際には問題ではありません。中央に置きたい隅を選択して、transform-originそこに を設定できます。

次に、メニュー項目が形成する各スライスの中心角の値を決定する必要があります。この場合、簡単でした。半円には 3 つのスライスがあり、半円は を意味します180deg。したがって、3 つの等しいスライスが必要であると仮定すると、それぞれの中心角は になり180deg/3 = 60degます。

それを決定したら、親の中心で交わる辺 (この場合は右辺と下辺) を の角度にする必要があり60degます。これを行うには、傾斜変換を適用します。傾斜角度は次の90deg-60deg = 30degとおりです。

transform: skewX(30deg);

ただし、これでもすべてのメニュー項目が最初の項目の位置に残ります。したがって、最初のメニュー項目を除くすべてのメニュー項目について、中心角に以前の項目の数を掛けた値だけ回転させる必要があります。これは、次のことを意味します。

.menu-item:first-child { transform: skewX(30deg); } /* no items before */
.menu-item:nth-child(2) { transform: rotate(60deg) /* 1*60deg */ skewX(30deg); }
.menu-item:nth-child(3) { transform: rotate(120deg) /* 2*60deg */ skewX(30deg); } 

これにより、すべてのメニュー項目が本来あるべき場所に配置されますが、内容が歪んでいます。したがって、それらを「歪ませる」必要があります。つまり、反対の角度で傾斜変換を適用するということです。この場合、スキュー解除とは を適用することを意味しskewX(-30deg)ます。

それでも、コンテンツの角度は正しくありません。この場合、中心角の半分から 90 度を引いた角度で回転させる必要があります。これは を意味し60deg/2 - 90deg = 30deg - 90deg = -60degます。

コンテンツ (この場合はリンク) も、その中心がtransform-origin親 ( .menu-item) に設定したポイントになるように絶対に配置する必要があります。任意のサイズを指定できますが、円形にしたい場合は、次に、幅と高さを等しくし、それらが親の 2 倍を超えないようにする必要があります ( .menu-item)。

最後に、パイ メニューが表示overflow: hiddenされます。.menu-item中央部分をカバーしたい場合は、メニューの疑似要素を使用します(.menu-circ)。

于 2013-03-04T23:03:04.223 に答える
0

これらのプロパティのいくつかを見てください:

  • CSS3変換-要素の回転用-W3
  • CSS3トランジション-ダイヤルをスムーズに回転させるために-W3
  • CSSホバーセレクター-ポップアップ用-W3
  • CSS3クリップ-要素を形作るために-W3
于 2013-03-04T18:20:39.887 に答える
0

css3円グラフの作成に関するこのチュートリアルは、役立つ可能性があります:http ://www.kylejlarson.com/blog/2011/how-to-create-pie-charts-with-css3/ 。

すべてのパイウェッジをボタンにしてから、ホイールの中央に小さな円を重ねることができます。

于 2013-03-04T18:22:14.630 に答える