พื้นที่ลอย ​

วางคำอธิบายสั้น รูปภาพ หรือตารางขนาดเล็กทางซ้ายหรือขวา แล้วให้เนื้อหาหลักไหลข้างพื้นที่นั้น คุณแก้ไขเนื้อหาภายในพื้นที่ได้โดยตรงในตัวแก้ไขเดียวกัน กรอบเส้นประจะแสดงเฉพาะขณะแก้ไข ส่วนตัวอย่างและหน้าที่เผยแพร่จะเหลือเพียงเนื้อหาและการจัดวาง

วางเคอร์เซอร์ในพื้นที่ของตัวอย่างด้านล่าง แล้วเปลี่ยนด้านซ้ายหรือขวาและความกว้างสูงสุดด้วยเครื่องมือคุณสมบัติ ในตัวอย่าง คุณจะเห็นเนื้อหาไหลต่อกันโดยไม่มีกรอบเส้นประ

ปีก
แบบอักษรหลักระยะเยื้อง
HTMLกำลังโหลดโปรแกรมแก้ไข…
JSONnabi-treeกำลังโหลดโปรแกรมแก้ไข…
ติดตั้ง
npm install nabi-note
โค้ด
import {
  createLocale, createNabiWith, mountSurface, mountToolbar,
  mountContextToolbar, mountHints, watchSettle, boldWing, linkWing,
  headingWing, alignWing, dropCapWing, bulletListWing, orderedListWing,
  taskListWing, quoteWing, floatWing, detailsWing, codeWing,
  dividerWing, tableWings, imageWing, youtubeWing, uploadWing,
  mountUpload, mountUploadView, mountViewTools,
} from 'nabi-note'

const selected = [
  boldWing,
  linkWing,
  headingWing,
  alignWing,
  dropCapWing,
  bulletListWing,
  orderedListWing,
  taskListWing,
  quoteWing,
  floatWing,
  detailsWing,
  codeWing,
  dividerWing,
  ...tableWings,
  imageWing,
  youtubeWing,
  uploadWing,
]
const locale = createLocale('th')
const { nabi, registry } = createNabiWith(selected, { locale })

// Bring your own highlighter (Prism, highlight.js, Shiki, …) — the wing stays as it is
// and only the attach is swapped (`makeCodeAttach` ships from the same door)
// { ...codeWing, attach: makeCodeAttach({ highlight: (source, lang) => [{ text: source }] }) }

const root = document.querySelector('.nabi')!
const content = document.querySelector('.nabi-content')!

const view = mountUploadView({ nabi, surface: content, locale })
const upload = mountUpload({
  nabi, root: content, locale,
  // your upload goes here — report progress with task.onProgress(0–100)
  uploader: async (task) => ({ uri: 'https://cdn.example/uploaded' }),
  extensions: ['png', 'jpg', 'pdf'], maxFileSize: 10 * 1024 * 1024,
  onStart: (tasks) => view.start(tasks),
  onProgress: (id, percent) => view.progress(id, percent),
  onSettle: () => view.settle(),
  onDone: () => view.done(),
})

// The locale also sets the direction — Arabic and Urdu run right to left
mountSurface({ nabi, registry, root: content, locale, fileSink: upload.take })

const settle = watchSettle(document, { surface: content })
const shared = { nabi, registry, surface: content, settle, locale }
const toolbar = mountToolbar({ ...shared, root: document.querySelector('#toolbar')!, onFiles: upload.take })
const context = mountContextToolbar({ ...shared, root: document.querySelector('#context')! })
mountHints({ toolbar, context, root, surface: content })
// The preview and fullscreen buttons — they stand their own box at the end of the row
mountViewTools({ ...shared, root, container: document.querySelector('#toolbar')! })

// on every change — hook up your own code here
// nabi.onChange(() => user_callback(nabi.getHtml()))

// Call from your language selector. Content and editing history stay intact.
// locale.setLocale('ko')
ts
const selected = wings().allBasic().build()

พื้นที่ลอยรวมอยู่ในปีกพื้นฐาน หากประกอบเฉพาะปีกที่ต้องใช้ ให้ใช้ wings().use('float') หรือลงทะเบียน floatWing โดยตรง และต้องลงทะเบียนปีกสำหรับรูปภาพ ตาราง รายการ และเนื้อหาอื่นที่จะใช้ในพื้นที่ด้วย

การสร้างและจัดวาง ​

วางเคอร์เซอร์ในเนื้อหาหลักแล้วกด พื้นที่ลอย เพื่อสร้างพื้นที่ว่าง ค่าเริ่มต้นคือด้านขวาและความกว้างสูงสุด 40% หากเลือกหลายย่อหน้าก่อนกด ทุกย่อหน้าที่การเลือกแตะถึงจะถูกรวมทั้งย่อหน้าในพื้นที่เดียว ไม่สามารถครอบพื้นที่ลอยที่มีอยู่ซ้ำหรือสร้างพื้นที่ลอยอีกอันภายในได้

ts
nabi.applyCommand('insertFloat', { side: 'right', w: 40 })

เมื่อเคอร์เซอร์อยู่ในพื้นที่ ใช้เครื่องมือคุณสมบัติเปลี่ยนด้านซ้ายหรือขวาและความกว้างสูงสุด โดยเลือก 20%, 30%, 40% หรือ 50% ค่านี้อิงความกว้างของเนื้อหาหลัก ไม่ใช่ทั้งหน้าจอ หากเนื้อหาสั้น พื้นที่จริงอาจแคบกว่านั้น

ts
nabi.applyCommand('setFloatSide', { side: 'left' })
nabi.applyCommand('setFloatWidth', { w: 30 })

การวางข้อความ รูปภาพ ตาราง การแปลงบล็อก และการอัปโหลดจะอยู่ภายในพื้นที่ การลบตารางภายในจะลบเฉพาะตารางนั้น หากการเลือกครอบคลุมทั้งในและนอกพื้นที่ จะไม่สามารถแทรกหรือแปลงบล็อกภายในได้

ปุ่ม ยกเลิกพื้นที่ลอย ข้างค่าความกว้างจะนำเนื้อหากลับสู่เนื้อหาหลักโดยไม่ลบเนื้อหา การสร้าง การเปลี่ยนการจัดวาง และการนำตัวครอบออกล้วนรองรับเลิกทำและทำซ้ำ

ts
nabi.applyCommand('unwrapFloat')

วิธีที่เนื้อหาไหลรอบพื้นที่ ​

ย่อหน้าถัดไปจะไหลข้างพื้นที่ และกลับมาใช้ความกว้างเต็มของเนื้อหาหลักเมื่อพ้นพื้นที่ หัวเรื่อง ตาราง บล็อกโค้ด เส้นแบ่ง หรือพื้นที่ลอยใหม่ที่ตามมาจะเริ่มใต้พื้นที่ก่อนหน้า

เมื่อเนื้อหาหลักกว้างน้อยกว่า 36rem พื้นที่และเนื้อหาจะจัดเป็นคอลัมน์เดียว การพิมพ์ใช้คอลัมน์เดียวเช่นกัน โดยยังคงด้านและความกว้างสูงสุดที่บันทึกไว้ หน้าจอเปรียบเทียบเอกสารคงด้านและความกว้างสูงสุดของแต่ละพื้นที่ แต่แสดงบล็อกถัดไปแยกไว้ด้านล่างเพื่อให้อ่านการเปลี่ยนแปลงได้ง่าย

การบันทึกและโหลด ​

JSON บันทึก a.side และ a.w ของโหนด float พร้อมบล็อกภายใน ส่วน HTML ใช้แอตทริบิวต์ data-nabi-float และ data-nabi-float-width บน div ภายในย่อหน้าวัตถุปกติ

html
<div data-nabi-p>
  <div data-nabi-float="right" data-nabi-float-width="40">
    <p>คำอธิบายสำหรับวางข้างเนื้อหาหลัก</p>
  </div>
</div>
<p>ย่อหน้านี้ไหลต่อไปข้างพื้นที่</p>

การส่งออก Markdown จะเก็บพื้นที่ไว้เป็น HTML ไม่ได้นำเข้าสไตล์ CSS float ที่กำหนดเองตามอำเภอใจ ดังนั้นให้ใช้ JSON หรือ HTML ที่ NABI NOTE สร้างในการบันทึกและกู้คืน ต้องเชื่อมปีกและ CSS ชุดเดียวกันในตัวแก้ไข SSR ตัวอย่าง และหน้าที่เผยแพร่ เพื่อคงด้านและความกว้างไว้

สไตล์ CSS ​

ปรับสีและระยะห่างภายในพื้นที่ด้วยตัวเลือก [data-nabi-float] ย่อหน้าด้านนอกจัดการตำแหน่งและความกว้างสูงสุด จึงไม่ควรทับ float, display หรือความกว้างโดยตรง

css
.brand-note .nabi-content [data-nabi-float] {
  background: var(--nabi-soft);
  border-radius: var(--nabi-radius);
  padding: .75rem;
}