วิธีการสร้างเมนู Action แบบ Medium-Like Floating
ความนิยมของ เมนูการกระทำลอยตัว ได้รับการเพิ่มขึ้นโดยเฉพาะอย่างยิ่งตั้งแต่ Medium.com นำคุณลักษณะนี้มาสู่ความนิยม โดยย่อเมนูการกระทำลอยตัว ปรากฏขึ้น เมื่อคุณ เลือกข้อความ บนหน้าเว็บ เมนูจะปรากฏขึ้นใกล้กับส่วนที่เลือก, แสดงการกระทำที่แตกต่าง ที่ช่วยให้คุณสามารถจัดรูปแบบไฮไลต์หรือแบ่งปันข้อความที่เลือกได้อย่างรวดเร็ว.
ในบทช่วยสอนนี้ฉันจะแสดงวิธีการแสดง เมนูการกระทำสำหรับตัวอย่างข้อความที่เลือก บนหน้าเว็บ เมนูการกระทำของเราจะช่วยให้ผู้ใช้ ทวีตข้อความที่เลือก ถึงผู้ติดตามของพวกเขา.
1. สร้าง HTML
HTML เริ่มต้นนั้นง่าย, เราต้องการเท่านั้น ข้อความบางส่วน ผู้ใช้สามารถเลือก สำหรับตัวอย่างฉันจะใช้ “ฮาร์ตและนักล่า” นิทานก่อนนอน เป็นข้อความตัวอย่าง.
ฮาร์ตและนักล่า
ฮาร์ตครั้งหนึ่งเคยเป็น ...
...
2. สร้างเทมเพลตเมนูการกระทำ
ฉัน เพิ่มรหัส HTML เป็นของเมนูการกระทำ ภายใน ธาตุ. อะไรก็ตามที่อยู่ภายใน
แท็กมัน จะไม่แสดงผล โดยเบราว์เซอร์จนกว่าจะถูกเพิ่มลงในเอกสาร ใช้ JavaScript.
อย่าออกจากพื้นที่ที่ไม่จำเป็น ข้างใน แท็กเนื่องจากอาจรบกวนรูปแบบเมนูการกระทำเมื่อแทรกลงในเอกสาร ถ้าคุณต้องการ, เพิ่มปุ่มเพิ่มเติม ภายใน
#shareBox
สำหรับตัวเลือกเพิ่มเติม.
3. สร้าง CSS
CSS สำหรับ #shareBox
คอนเทนเนอร์อินไลน์ ไปเช่นนี้
#shareBox width: 30px; ความสูง: 30px; ตำแหน่ง: สัมบูรณ์;
position: absolute;
กฎจะช่วยให้เรา วางเมนูทุกที่ที่เราต้องการ บนหน้า.
ฉันยังเรียกขาน ปุ่มการกระทำภายใน #shareBox
ด้วยสีพื้นหลังและภาพและใน ::หลังจาก
องค์ประกอบหลอกฉัน เพิ่มรูปสามเหลี่ยมสำหรับลูกศรลง.
#shareBox> ปุ่ม ความกว้าง: 100%; ความสูง: 100%; สีพื้นหลัง: # 292A2B เส้นขอบ: ไม่มี; รัศมี - ชายแดน: 2px; เค้าโครง: ไม่มี; เคอร์เซอร์: ตัวชี้; ภาพพื้นหลัง: url ('share.png'); พื้นหลังซ้ำ: ไม่ทำซ้ำ; พื้นหลังตำแหน่ง: ศูนย์; ขนาดพื้นหลัง: 70%; #shareBox> ปุ่ม :: หลังจาก position: absolute; เนื้อหา: "; border-top: 10px solid # 292A2B; border-left: 10px solid transparent; border-right: 10px solid transparent; left: 5px; top: 30px;
4. เพิ่มตัวจัดการเหตุการณ์ด้วย JS
ย้ายไปที่จาวาสคริปต์เราจำเป็นต้อง เพิ่มตัวจัดการเหตุการณ์ สำหรับ mousedown
และ mouseup
กิจกรรมเพื่อ จับจุดเริ่มต้นและจุดสิ้นสุด ของการเลือกข้อความ.
คุณยังสามารถทำการวิจัยเพื่อ กิจกรรมการเลือกอื่น ๆ เช่น selectstart
และใช้พวกเขา แทนเหตุการณ์เมาส์ (ซึ่งจะเหมาะ แต่ก็ยังสนับสนุนเบราว์เซอร์ของพวกเขาไม่ดีมาก).
ด้วย เพิ่มการอ้างอิง ไปที่ องค์ประกอบที่ใช้
querySelector ()
วิธี.
document.addEventListener ('mousedown', onMouseDown); document.addEventListener ('mouseup', onMouseUp); var temp = document.querySelector ('# shareBoxTemplate'); function onMouseDown () function onMouseUp ()
5. ล้างการเลือกก่อนหน้า
ใน mousedown
เหตุการณ์เราจะ ดำเนินการทำความสะอาด, เช่นล้างการเลือกก่อนหน้าและเมนูการกระทำที่เป็นของ.
ฟังก์ชั่น onMouseDown () document.getSelection (). removeAllRanges (); var shareBox = document.querySelector ('# shareBox'); if (shareBox! == null) shareBox.remove ();
getSelection ()
วิธีการส่งกลับ การเลือก
วัตถุ แสดงช่วงของข้อความ เลือกโดยผู้ใช้ในปัจจุบันและ removeAllRange ()
วิธีลบทุกช่วง จากเดียวกัน การเลือก
วัตถุดังนั้น การล้างการเลือกก่อนหน้าใด ๆ.
6. แสดงเมนูการกระทำ
มันเป็นในช่วง mouseup
เหตุการณ์เมื่อเราจะ ยืนยันว่ามีการเลือกข้อความหรือไม่ และดำเนินการต่อไป.
ฟังก์ชัน onMouseUp () var sel = document.getSelection (), txt = sel.toString (); if (txt! == "") var range = sel.getRangeAt (0); ถ้า (range.startContainer.parentElement.parentElement.localName === "บทความ" || range.startContainer.parentElement.localName === "บทความ") // ข้อความบางส่วนในบทความถูกเลือก
รับสตริงข้อความที่เลือก โดยการโทร toString ()
วิธีการของ การเลือก
วัตถุ. หากข้อความที่เลือกไม่ว่างเปล่าไปข้างหน้าและ รับช่วงแรก จาก การเลือก
วัตถุ.
พิสัย คือ ส่วนที่เลือก ของเอกสาร โดยทั่วไปผู้ใช้จะทำ เลือกเดี่ยว เท่านั้น, ไม่ใช่หลาย ๆ ตัว (โดยการกดปุ่ม ctrl / cmd), ดังนั้นให้รับวัตถุช่วงแรก (ที่ดัชนี 0) จากการเลือกโดยใช้ getRangeAt (0)
.
เมื่อคุณมีช่วงแล้วให้ดูว่าการเลือกเริ่มต้นจากสถานที่นั้นหรือไม่ ภายในบทความ. startContainer
คุณสมบัติของช่วงส่งคืนโหนด DOM จากที่เลือกเริ่ม.
บางครั้ง (เมื่อคุณ เลือกภายในย่อหน้า) มูลค่าของมันเป็นเพียง โหนดข้อความ, ในกรณีที่มัน องค์ประกอบหลัก จะ และผู้ปกครองของ
องค์ประกอบจะเป็น
(ในรหัสตัวอย่างในโพสต์นี้).
เวลาอื่นเมื่อคุณเลือก ข้ามหลายย่อหน้า, startContainer
จะ และโหนดหลักจะเป็น
. ดังนั้น สองการเปรียบเทียบ ในวินาที
ถ้า
เงื่อนไขในรหัสข้างต้น.
เมื่อครั้ง ถ้า
สภาพผ่านไปได้แล้ว เรียกเมนูการกระทำ จากเทมเพลตและเพิ่มไปยังเอกสาร. วางรหัสด้านล่าง ภายในวินาที ถ้า
คำแถลง.
document.body.insertBefore (document.importNode (temp.content, true), temp);));
importNode ()
วิธี ส่งคืนโหนดจากเอกสารภายนอก (ในกรณีของเราโหนดจาก ) เมื่อมันถูกเรียกด้วยพารามิเตอร์ที่สอง (
จริง
) องค์ประกอบ / โหนดที่นำเข้าจะ มาพร้อมกับองค์ประกอบของเด็ก.
คุณสามารถแทรก #shareBox
ที่ใดก็ได้ในตัวเอกสาร, ฉันเพิ่มไว้ก่อนองค์ประกอบแม่แบบ.
7. วางเมนูการกระทำ
เราต้องการวางเมนูการกระทำ ด้านบนขวา & ตรงกลางของพื้นที่ที่เลือก. ให้ทำเช่นนั้น, รับค่าสี่เหลี่ยมผืนผ้า ของพื้นที่ที่เลือกโดยใช้ getBoundingClientRect ()
วิธีการที่ส่งกลับขนาดและตำแหน่งขององค์ประกอบ.
จากนั้นอัปเดต ด้านบน
และ ซ้าย
ค่าของ #shareBox
ขึ้นอยู่กับค่าสี่เหลี่ยมผืนผ้า. ในการคำนวณของใหม่ ด้านบน
และ ซ้าย
ค่าฉันใช้ประโยชน์จาก เทมเพลตตัวอักษร ES6.
var rect = range.getBoundingClientRect (); var shareBox = document.querySelector ('# shareBox'); shareBox.style.top = 'คำนวณ ($ rect.top px - 38px)'; shareBox.style.left = 'Calc ($ rect.left px + calc ($ rect.width px / 2) - 30px)';
8. เพิ่มฟังก์ชั่น
ตอนนี้เราได้เพิ่มเมนูการกระทำใกล้กับข้อความที่เลือกแล้วก็ถึงเวลาสร้างข้อความที่เลือก ใช้ได้สำหรับตัวเลือกเมนู เพื่อให้เราสามารถดำเนินการบางอย่างกับมัน.
กำหนดข้อความที่เลือกให้กับ คุณสมบัติที่กำหนดเองของปุ่มแบ่งปัน เรียกว่า 'shareTxt'
และเพิ่ม mousedown
ฟังเหตุการณ์ไปที่ปุ่ม.
var shareBtn = shareBox.querySelector ('ปุ่ม'); shareBtn ['shareTxt'] = txt; shareBtn.addEventListener ('mousedown', onShareClick, จริง);
จริง
พารามิเตอร์ของ addEventListener ()
ป้องกันไม่ให้ mousedown
เหตุการณ์จากเดือดปุด ๆ.
ข้างใน onShareClick ()
ตัวจัดการเหตุการณ์เรา แทรกข้อความที่เลือกลงในทวีต โดยการเข้าถึง shareTxt
คุณสมบัติของปุ่ม.
ฟังก์ชั่น onShareClick () window.open ('https://twitter.com/intent/tweet?text=$ this.shareTxt'); this.remove (); document.getSelection (). removeAllRanges ()
เมื่อครั้ง คลิกปุ่มแล้ว, มันเป็นสิ่งที่ควรทำจากนั้นลบตัวเองออกจากหน้า มันจะยัง ล้างการเลือกใด ๆ ในเอกสาร.
รหัสต้นฉบับ & การสาธิต
ในตัวอย่าง Codepen ด้านล่างคุณสามารถ ทดสอบ เมนูแอคชั่นทำงานอย่างไร คุณยังสามารถค้นหา รหัสที่มาแบบเต็ม ใน repo Github ของเรา.