質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

2回答

1980閲覧

[CSS]動的に動く要素でマスキングを行う方法は無いでしょうか?

hasshy

総合スコア102

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

1クリップ

投稿2018/10/16 07:23

編集2018/10/16 10:53

実現したい事の追記と、最新のソースを更新しました。


タグで描画している部分のみ、backgroundに敷いている要素を表示し、それ以外は透明にする方法は無いでしょうか?
もちろん、必要であればjsを使うことは構いません。

やりたいこと

波紋のように、ドーナッツ常にマスキングしたいと考えています。
ドーナッツの内側は、background-colorを指定するのではなく、透過させたいです。

実現したいイメージ

下記のように、枠の部分のみ背景を表示したいと考えています。
枠内部は投下されていて、枠の裏にある要素が見えるようにしたいです。

イメージ説明

拙い説明画像で申し訳ありません。

ソースコード

HTML

cardというクラスが内側に表示される要素で、
rippleというのが枠の要素になります。

html

1<div class="card"></div> 2<div class="ripple"> 3 <div class="ripple_circle"></div> 4</div> 5

css

説明用のコード自体はSCSSです。

scss

1body { 2 margin: 0; 3 display: grid; 4 height: 100vh; 5 place-items: center; 6 background-color: #000; 7} 8 9// 真ん中に表示する要素 10.card { 11 height: 100px; 12 width: 100px; 13 background-color: red; 14 margin-top: 20px; 15} 16 17// 枠要素 18.ripple { 19 position: absolute; 20 width: 400px; 21 height: 400px; 22 top: 50%; 23 left: 50%; 24 background: url(https://dl.dropbox.com/s/wwvut9frq0k4ukf/3_512.jpg); 25 clip-path: circle(50px at 50% 50%); 26 transform: translate(-50%, -50%); 27 animation: wow 2s ease-out forwards infinite; 28 &_circle { 29 position: absolute; 30 width: 100%; 31 height: 100%; 32 &::after { 33 content: ''; 34 position: absolute; 35 border-radius: 50%; 36 top: 50%; 37 left: 50%; 38 background-color: rgba(0,0,0,0); 39 background-clip: padding-box; 40 transform: translate(-50%, -50%); 41 animation: riple01 2s ease-out forwards infinite; 42 } 43 } 44} 45 46@keyframes wow { 47 0%{ 48 clip-path: circle(0px at 50% 50%); 49 } 50 20%{ 51 clip-path: circle(50px at 50% 50%); 52 } 53 100%{ 54 clip-path: circle(200px at 50% 50%); 55 } 56} 57 58@keyframes riple01 { 59 0% { 60 } 61 20% { 62 width: 0; 63 height: 0; 64 } 65 100% { 66 width: 100%; 67 height: 100%; 68 } 69}

codepen

下記で動的に動く要素については確認できます。
https://codepen.io/websandbag/pen/RejOZp

追記

jjj_aaa様よりご共有いただいたソースを参考に、白い枠に要素を表示する事は実現方法を追記しました。
枠の後ろにある要素を透過する事はまだ実現できていません。
イメージ説明

https://codepen.io/websandbag/pen/EdogaM

上記のソースでは、透過したい部分を半透明にしています。
実際は、半透明の部分を透明して後ろに配置している赤い要素を見えるようにしたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

汚いですが以下でどうでしょうか。アニメーションwowを追加してclip-pathであれこれしてます。
codepen

一応やりたいことはできてるぽいですが、思ってる実装とは違うかも・・保守性も低い!

border部分だけ親CSSを透過設定みたいなことができればいいんですけどねぇ~

追伸:きたねぇSCSSもはっときます。もし使ってくれるならきれいにしたりしてください!

SCSS

1body { 2 margin: 0; 3 display: grid; 4 height: 100vh; 5 6 place-items: center; 7 8 background-color: #000; 9} 10 11.ripple { 12 position: absolute; 13 width: 400px; 14 height: 400px; 15 top: 50%; 16 left: 50%; 17 background: url(https://dl.dropbox.com/s/wwvut9frq0k4ukf/3_512.jpg); 18 clip-path: circle(50px at 50% 50%); 19 transform: translate(-50%, -50%); 20 animation: wow 2s ease-out forwards infinite; 21 &_circle { 22 position: absolute; 23 width: 100%; 24 height: 100%; 25 &::after { 26 content: ''; 27 position: absolute; 28 border-radius: 50%; 29 top: 50%; 30 left: 50%; 31 background-color: black; 32 background-clip: padding-box; 33 transform: translate(-50%, -50%); 34 animation: riple01 2s ease-out forwards infinite; 35 } 36 } 37} 38 39@keyframes wow { 40 0%{ 41 clip-path: circle(0px at 50% 50%); 42 } 43 20%{ 44 clip-path: circle(50px at 50% 50%); 45 } 46 100%{ 47 clip-path: circle(200px at 50% 50%); 48 } 49} 50 51@keyframes riple01 { 52 0% { 53 } 54 20% { 55 width: 0; 56 height: 0; 57 } 58 100% { 59 width: 100%; 60 height: 100%; 61 } 62}

投稿2018/10/16 08:30

編集2018/10/16 08:42
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hasshy

2018/10/16 08:47

ご回答ありがとうございます! 実現したい内容です。 しかも、codepenのソースをフォークして描いていただいたのですね。 ありがとうございます。助かります。 clip-pathで、円形にマスキングできたんですね…。 勉強になります。
hasshy

2018/10/16 08:50

ソースコードも私のソースを継承して作っていただいて見やすいです。 ありがとうございます。
退会済みユーザー

退会済みユーザー

2018/10/16 08:54

よかったです。 一応補足で、、、「きたねぇ」ってのは私が書いた部分(重複プロパティとかあるかも+インデントもハチャメチャが押し寄せてきている)で、継承元のhasshy様のSCSSのことでないのであしからず。
hasshy

2018/10/16 09:03

承知です。 泣いている場合じゃないですね。
hasshy

2018/10/16 10:52

ソースを拝見させていただき、色々検討して見たのですが、 枠の内側を透過して、後ろの要素を表示するのは出来なさそうですね…。 > border部分だけ親CSSを透過設定みたいなことができればいいんですけどねぇ~ この一言に尽きますね…。
iev39526

2018/10/16 11:06

横からすいません。 z-indexで赤い要素を前に出して、それに枠と同じようにアニメーションをかけるとか、そういうことでは実現できないでしょうか? 素人考えなので合っているかわからないですが…。 https://codepen.io/anon/pen/pxpRvE
hasshy

2018/10/16 12:13

>> iev39526 いえいえ、ご助言いただけるだけでありがたいです。 コードもフォークして、改良していただきありがとうございます! 拝見させていただきました。 確かに、おっしゃる通り枠に合わせて中の要素も伸縮させる方法もありますね。 枠と同じ原理で、後ろの要素も徐々に見せる方法はありかもしれません。 ただ、検証では1つしか波紋を作っていませんが、最終的には複数の波紋を組み合わせて使用します。 こちらの説明不足で、申し訳ありません。 アニメーションの開始もスピードも異なったり、後ろの要素が可変なので難しいですね。
iev39526

2018/10/16 12:32 編集

>> hasshyさん そういっていただけると嬉しいです^^。 なるほど…。複数の波紋を表現したかったのですね。 となると、Pure CSSで行うには少しハードルの高いアニメーションだと思います。 そこまで複雑になるのであれば、「一部(もしくは全体)のパーツをSVGで作って、それをCSSやJSなどでガチャガチャ動かす」という方向で実装していくほうが、後々の変更などへの対応も楽かな、と思いました(これもまた、素人考えですが;)。 これ以上jjj_aaaさんの回答を汚してしまうといけないので、これにて失礼します~。
guest

0

こういうことでしょうか?

SCSS

1body { 2 margin: 0; 3 display: grid; 4 height: 100vh; 5 place-items: center; 6 background-color: #000; 7} 8 9.ripple { 10 position: absolute; 11 width: 400px; 12 height: 400px; 13 top: 50%; 14 left: 50%; 15 transform: translate(-50%, -50%); 16 &_circle { 17 position: absolute; 18 width: 100%; 19 height: 100%; 20 &::after { 21 content: ''; 22 position: absolute; 23 border-radius: 50%; 24 top: 50%; 25 left: 50%; 26 border: 0px solid #ffffff; 27 transform: translate(-50%, -50%); 28 animation: riple01 2s ease-out forwards infinite; 29 } 30 } 31} 32 33@keyframes riple01 { 34 0% { 35 border: 0 solid #f8bbd0; 36 background: #000 url(https://dl.dropbox.com/s/wwvut9frq0k4ukf/3_512.jpg); 37 } 38 20% { 39 width: 0; 40 height: 0; 41 border: 50px solid #fff; 42 } 43 100% { 44 width: 100%; 45 height: 100%; 46 border: 0px solid #fff; 47 background: #000 url(https://dl.dropbox.com/s/wwvut9frq0k4ukf/3_512.jpg); 48 } 49} 50 51

投稿2018/10/16 07:46

編集2018/10/16 08:09
root_jp

総合スコア4666

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kei344

2018/10/16 08:02

コードブロックのラベルはCSSでなくSCSSでは?
root_jp

2018/10/16 08:10

変更しました。ご指摘ありがとうございます。
hasshy

2018/10/16 08:10

ご回答いただきありがとうございます! 下記に再現させていただきました。 https://codepen.io/websandbag/pen/zmpvxP 説明不足で申し訳ございませんが、実現したいものとは違います。 枠の内側ではなく、枠自体に背景を表示したいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問