中型のフローティングアクションメニューを作成する方法
の人気 フローティングアクションメニュー 特にMedium.comがその機能を流行させて以来、その数は増え続けています。簡単に言うと、フローティングアクションメニュー 浮き出る あなたがいるとき テキストを選択してください Webページに。選択範囲の近くにメニューが表示されます。, さまざまなアクションを表示 選択したテキストをすばやくフォーマット、強調表示、または共有できます。.
このチュートリアルでは、表示方法について説明します。 選択したテキストスニペットのアクションメニュー Webページに。私達の行動メニューはユーザーを可能にします 選択したテキストをツイートする フォロワーに.
1. HTMLを作成する
の スターターHTMLは簡単です, 必要なだけ いくつかのテキスト ユーザーが選択できます。デモには、私が使用します “ハートとハンター” 就寝時の話 サンプルテキストとして.
ハートとハンター
ハートはかつて…
…
2.アクションメニューテンプレートを作成する
私は HTMLコードを追加する アクションメニューに属する の中 素子. 内にあるものは何でも
タグ、それ レンダリングされません ドキュメントに追加されるまでブラウザで JavaScriptを使う.
不要なスペースを残してはいけません の中 ドキュメントに挿入されるとアクションメニューのレイアウトが乱れる可能性があるため、tag。お望みならば, ボタンを追加する 内部
#shareBox
その他のオプション.
3. CSSを作成する
のCSS #shareBox
インラインコンテナ このようになります:
#shareBox width:30px;高さ:30ピクセル。位置:絶対
の 位置:絶対
ルールは私たちをさせる 好きな場所にメニューを配置する ページ上.
私もスタイルを作りました 内側のアクションボタン #shareBox
背景色と画像とその中で ::後
擬似要素I 下向きの矢印に三角形を追加しました.
#shareBox> button 幅:100%;身長:100%。背景色:#292A2B。国境:なし。 border-radius:2ピクセル。概要:なし。カーソル:ポインタ。背景画像:url( 'share.png'); background-repeat:繰り返しなし。背景位置:中央。背景サイズ:70%。 #shareBox> button :: after position:absolute; content: ";; border-top:10px単色#292A2B; border-left:10px単色透明; border-right:10px単色透明; left:5px; top:30px;
4. JSでイベントハンドラを追加する
JavaScriptに移りましょう。 イベントハンドラを追加する のために マウスダウン
そして マウスアップ
へのイベント 始まりと終わりを捉える テキスト選択の.
またのための研究をすることができます 他の選択イベント といった selectstart
そしてそれらを使う マウスイベントの代わりに (これは理想的ですが、それでもブラウザのサポートはあまり良くありません).
また 参照を追加 に を使用する要素
querySelector()
方法.
document.addEventListener( 'mousedown'、onMouseDown); document.addEventListener( 'mouseup'、onMouseUp); var temp = document.querySelector( '#shareBoxTemplate'); function onMouseDown() function onMouseUp()
5.前の選択をクリアする
の中に マウスダウン
イベント、 いくつかのクリーンアップを実行する, すなわち、以前の選択と所属するアクションメニューをクリアします.
関数onMouseDown()document.getSelection()。removeAllRanges(); var shareBox = document.querySelector( '#shareBox'); if(shareBox!== null)shareBox.remove();
の getSelection()
メソッドは 選択
物 テキストの範囲を表す 現在ユーザーによって選択されている removeAllRange()
方法すべての範囲を削除 同じから 選択
オブジェクト 以前の選択をクリアする.
6.アクションメニューを表示する
それは マウスアップ
イベント、いつ テキスト選択が行われたかどうかを確認 そしてさらなる行動をとる.
関数onMouseUp()var sel = document.getSelection()、txt = sel.toString(); if(txt!== "")var range = sel.getRangeAt(0); if(range.startContainer.parentElement.parentElement.localName === "article" || range.startContainer.parentElement.localName === "article")//記事の一部のテキストが選択されました
選択したテキスト文字列を取得する を呼び出すことによって toString()
の方法 選択
オブジェクト選択したテキストが空でない場合は、先に進んで 最初の範囲を取得 から 選択
物.
範囲 それは 選択部分 ドキュメントの通常、ユーザーは 単一選択 (ctrl / cmdキーを押すことで)倍数ではないので、(インデックス0の)最初の範囲オブジェクトを次のように選択して取得します。 getRangeAt(0)
.
範囲が決まったら、選択がその場所から始まっているかどうかを確認します。 記事の中. の startContainer
範囲のプロパティはDOMノードを返します 選択が始まった場所から.
時々(あなたが 段落内で選択する)、その値は テキストノード, その場合は 親要素 になります との親
要素は
(この記事のサンプルコードで).
それ以外の場合は、選択したとき 複数の段落にまたがる, の startContainer
になります その親ノードは
. 従って 2つの比較 第二に
もし
上記のコードの条件.
一度 もし
条件が合格したら、 アクションメニューを取得する テンプレートから作成してドキュメントに追加する. 下にコードを配置してください 第二の内側 もし
ステートメント.
document.body.insertBefore(document.importNode(temp.content、true)、temp);));
の importNode()
方法 外部文書からノードを返す (私達の場合、からのノード ) 2番目のパラメータで呼び出されたとき(
本当の
)、インポートした要素/ノードは その子要素が付属しています.
挿入できます #shareBox
文書本体内の任意の場所, テンプレート要素の前に追加しました.
7.アクションメニューを配置する
アクションメニューを配置したい 真上 & 選択した領域の中央に. そうするには, 四角形の値を取得する 選択した領域の getBoundingClientRect()
要素のサイズと位置を返すメソッド.
その後、 上
そして 左
の値 #shareBox
四角形の値に基づく. 新しいの計算では 上
そして 左
値、私が利用した ES6テンプレートリテラル.
var rect = range.getBoundingClientRect(); var shareBox = document.querySelector( '#shareBox'); shareBox.style.top = 'calc($ rect.top px - 38px)'; shareBox.style.left = 'calc($ rect.left px + calc($ rect.width px / 2) - 30px)';
8.機能を追加する
選択したテキストの近くにアクションメニューを追加したので、次に選択したテキストを作成します。 メニューオプションで利用可能 私たちがそれに対して何らかのアクションを実行できるよう.
選択したテキストを 共有ボタンのカスタムプロパティ 呼ばれる 'shareTxt'
そしてを追加 マウスダウン
ボタンのイベントリスナー.
var shareBtn = shareBox.querySelector( 'button'); shareBtn ['shareTxt'] = txt; shareBtn.addEventListener( 'mousedown'、onShareClick、true);
の 本当の
のパラメータ addEventListener()
を防ぐ マウスダウン
バブリングからのイベント.
の中 onShareClick()
イベントハンドラ 選択したテキストをツイートに挿入する にアクセスして shareTxt
ボタンのプロパティ.
function onShareClick()window.open( 'https://twitter.com/intent/tweet?text=$ this.shareTxt'); this.remove(); document.getSelection()。removeAllRanges()
一度 ボタンをクリック, それはそれがすることを想定していることをし、それからページから自分自身を削除します。またするよ 選択を解除する ドキュメント内.
ソースコードとデモ
以下のCodepenデモでは、次のことができます。 テスト アクションメニューの仕組みまた見つけることができます 完全なソースコード Githubレポジトリに.