素のjavascriptでCSS操作

背景

以前作った
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とかで設定する時に最後に; とかが有るとエラーが起きず更新もされない
  • スタイルを検索する関数を作ったけど、他にいいアクセスの方法無いかなぁ…