4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

素のjavascriptでCSS操作

Posted at

背景

以前作った
cssのみで立体な球体を表現
目で追従するやつをriotで実装

という記事を合わせれば、光の当たる点を動かせるのかと思い立ったので実装。
ついでに素のjavascriptのみで実装してみました。

結果

こんな感じで実装できました。

名称未設定.mov.gif

See the Pen Movement of shadow of ball by mouse by hashito (@hashito) on CodePen.

内容

基本的にはCSSは「cssのみで立体な球体を表現」の実装と同じです。

// マウスムーブイベント
document.onmousemove = function (e){
  // スタイルシートからお探しの定義を検索する関数
  // c:対象のスタイルシートオブジェクト
  // tg:対象の文字列
  var get_syle=(c,tg)=>{
    return c[Object.keys(c).filter((v)=>{
      return c[v].selectorText==tg
    })[0]]
  };  
  var styleEl = document.querySelector('style'); // スタイルシートを取得
  var cssRuleList = styleEl.sheet.cssRules;      // スタイルシート各種定義を取得
  var mb=get_syle(cssRuleList,".mi1::before");   // .mi1::before定義を取得
  var ma=get_syle(cssRuleList,".mi1::after");    // .mi1::after定義を取得
  // 2つのポイントから角度を検索
  var point2angle=(p1,p2)=>{
    return Math.atan2((p1.y-p2.y),(p1.x-p2.x)); 
  }
  // 角度から点を算出
  // r:角度
  // l:中心点からの距離
  var angle2point=(r,l)=>{
    return {x:Math.cos(r)*l,y:Math.sin(r)*l};
  }

  var _k  = point2angle(e,{x:150,y:150});//差を算出
  var _p  = angle2point(_k,25);//白い点の移動値
  var _p2 = angle2point(_k,15);//影の移動値
  //白い点の更新
  mb.style.top  =37.5+_p.y+"px";
  mb.style.left =37.5+_p.x+"px";
  //影の更新
  ma.style.boxShadow = 'inset '+ _p2.x +'px '+_p2.y+'px 10px 3px #000';
};

思ったこと

  • box-shadowstyle.boxShadowでアクセスする必要がある
  • style.boxShadowとかで設定する時に最後に; とかが有るとエラーが起きず更新もされない
  • スタイルを検索する関数を作ったけど、他にいいアクセスの方法無いかなぁ…
4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?