Arsip Penulis: Hendra,MT

Tentang Hendra,MT

Hendra,S.Kom.,MT. lahir di Tangerang tahun 1975. Menamatkan gelar sarjana komputer di Universitas Bina Nusantara tahun 1998 dan Magister Teknik Elektro di Universitas Trisakti Jakarta tahun 2001. Disamping sebagai praktisi IT di perusahaan IT Services, juga aktif mengajar di Binus University sejak 1999.

Membuat Menu Popup dengan atribut popover

Tahukah kamu ada atribut popover di HTML. Kita akan coba membuat menu seperti gambar di atas dengan menggunakan atribut popover yang ada di HTML.

Berikut ini coding HTML-nya:

<button popovertarget=”mainpopover” popovertargetaction=”toggle”>

      Menu

    </button>

    <div id=”mainpopover” popover>

      <nav class=”listcontainer”>

        <a href=”#”>Home</a>

        <div class=”subcontainer” tabindex=”0″>

          <a href=”#”>Product <strong> >></strong></a>

          <div id=”subpopover” popover>

            <div class=”listcontainer”>

              <a href=”#”>Computer</a>

              <a href=”#”>Monitor</a>

              <a href=”#”>Keyboard</a>

              <a href=”#”>Mouse</a>

            </div>

          </div>

        </div>

        <a href=”#”>About</a>

        <a href=”#”>Contact</a>

      </nav>

    </div>

Pertama kita buat tombol menu dengan diberikan atribut popovertarget=”mainpopover” dan popovertargetaction=”toggle”.

Atribut popovertarget ini akan mengubah elemen menjadi tombol kontrol popover; mengambil ID elemen popover, yakni mainpopover, untuk dikontrol sebagai nilainya.

Sedangkan atribut popovertargetaction itu untuk menentukan aksi yang akan dilakukan pada elemen popover yang dikontrol oleh popover. Nilai ‘toggle’ untuk membuat tombol menu ini mengalihkan popover antara ditampilkan dan disembunyikan. Jika popover disembunyikan, maka akan ditampilkan; jika popover ditampilkan, maka akan disembunyikan.

Ada 2 menu yang di-popover yakni <div id=”mainpopover” popover> dan <div id=”subpopover” popover>.

Untuk memberikan style pada tampilan kedua menu yang di-popover diberikan CSS berikut ini.

body,

      html {

        font-family: sans-serif;

      }

      body [popover] {

        border: 0px;

        width: 120px;

        inset: unset;

      }

      #mainpopover {

        left: 5px;

        top: 38px;

      }

      #subpopover {

        left: 130px;

        top: 86px;

      }

      .listcontainer,

      .subcontainer {

        display: flex;

        flex-direction: column;

      }

      a {

        flex: 1;

        text-decoration: none;

        outline: none;

        text-align: center;

        line-height: 3;

        color: black;

      }

      a:link,

      a:visited {

        background: rgb(225, 225, 224);

        color: black;

      }

      a:hover,

      a:focus {

        background: rgb(200, 200, 200);

      }

      a:active {

        background: rgb(1, 131, 253);

        color: white;

      }

Dan untuk membuat menu popupover muncul atau sembunyi diberikan JavaScript berikut ini.

const subcontainer = document.querySelector(“.subcontainer”);

      const mainpopover = document.getElementById(“mainpopover”);

      const subpopover = document.getElementById(“subpopover”);

      // Events to show/hide the subpopover when the mouse moves over and out

      subcontainer.addEventListener(“mouseover”, () => {

        subpopover.showPopover();

      });

      subcontainer.addEventListener(“mouseout”, () => {

        if (subpopover.matches(“:popover-open”)) {

          subpopover.hidePopover();

        }

      });

      // Event to make the subpopover keyboard-accessible

      subcontainer.addEventListener(“focusin”, () => {

        subpopover.showPopover();

      });

      // Events to hide the popover menus when an option is selected in either of them

      mainpopover.addEventListener(“click”, () => {

        if (subpopover.matches(“:popover-open”)) {

          subpopover.hidePopover();

        }

        if (mainpopover.matches(“:popover-open”)) {

          mainpopover.hidePopover();

        }

      });

      subpopover.addEventListener(“click”, () => {

        subpopover.hidePopover();

        mainpopover.hidePopover();

      });

Silakan dicoba. Semoga berhasil.

Happy Coding.

Responsive Web Design

Dalam membuat website atau aplikasi berbasis web sebaiknya menggunakan disain web responsif (Responsive Web Design / RWD). Dengan RWD website atau aplikasi web kita dapat ditampilkan dengan baik di berbagai ukuran (diagonal) layar. Misalnya di TV dengan ukuran layar besar > 20 inch, di PC laptop/desktop 10-20 inch, atau di tablet / smartphone < 10 inch.

RWD terkait resolusi layar seperti UHD (3840 x 2160), FHD (1360px X 768px), HD (1024px X 768px), ataupun nHD (360p× X 640px).

Tampilan website atau aplikasi berbasis web yang responsif akan meningkatkan aksesibilitas (accessibility), usabilitas (usability) dan kepuasan pengguna (user satisfaction). Disamping itu juga akan mengurangi biaya pengembangan (Reduced development costs) karena tidak perlu membuat kode terpisah untuk device yang berbeda, dan dapat meningkatkan level SEO (Search Engine Optimization) karena lebih user-friendly dan mudah diakses.

Untuk membuat tampilan website atau aplikasi web dengan RWD, pertama kita perlu menambahkan dulu tag <meta> pada bagian HTML <head>, berikut ini.

<meta name="viewport" content="width=device-width, initial-scale=1.0">

Setelah itu kita bisa membuat layout web menggunakan CSS dengan 3 cara:

  1. CSS Layout Float
  2. CSS Layout Flexbox
  3. CSS Layout Grid

CSS memiliki @media rule yang diperkenalkan pada CSS2. @media rule ini digunakan untuk membuat style yang berbeda pada setiap tipe media. Misalnya: membuat rule style untuk layar PC, untuk printers, untuk smartphone, untuk TV, dan sebagainya.

Contoh kode CSS Media Queries untuk membuat style warna background biru pada device layar kecil (< 480px):

@media screen and (min-width: 480px) {
body {
background-color: #0000ff;
}
}

Berikut ini kode HTML5 dengan CSS Layout Float.

<!DOCTYPE html>
<html lang="en">
  <head>
    <title>RWD with CSS float</title>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <style>
      * {
        box-sizing: border-box;
        margin: 0;
        padding: 0;
      }
      body {
        font-family: Arial, Helvetica, sans-serif;
      }

      /* Style the header */
      header {
        background-color: #666;
        padding: 10px;
        text-align: center;
        font-size: 35px;
        color: white;
      }

      /* Create two columns that floats next to each other */
      nav {
        float: left;
        width: 15%;
        height: 300px;
        background: #ccc;
        padding: 20px;
      }

      /* Style the list inside the menu */
      nav ul {
        list-style-type: none;
        padding: 10px;
      }

      article {
        float: left;
        padding: 20px;
        width: 85%;
        background-color: #f1f1f1;
        height: 300px;
      }

      /* Clear floats after the columns */
      section::after {
        content: "";
        display: table;
        clear: both;
      }

      /* Style the footer */
      footer {
        background-color: #777;
        padding: 10px;
        text-align: center;
        color: white;
      }

      /* Responsive layout on small screens
      makes two columns stack on top of each other instead of next to each other*/
      @media (max-width: 600px) {
        nav,
        article {
          width: 100%;
          height: auto;
        }
      }
    </style>
  </head>
  <body>
    <header>
      <p>R W D</p>
    </header>

    <section>
      <nav>
        <ul>
          <li><a href="#">HTML5</a></li>
          <li><a href="#">CSS3</a></li>
          <li><a href="#">JavaScript ES6</a></li>
        </ul>
      </nav>

      <article>
        <h1>Responsive Web Design (RWD)</h1>
        <p>
          This website is using CSS Layout Float. We create a header, two
          columns/boxes and a footer. On smaller screens, the columns will stack
          on top of each other.
        </p>
        <p>Resize the browser window to see the responsive effect.</p>
        <p>
          You can learn more about this in
          <a href="https://www.w3schools.com/html/html_responsive.asp"
            >HTML Responsive.</a
          >
        </p>
      </article>
    </section>

    <footer>
      <p>&copy; 2023</p>
    </footer>
  </body>
</html>

Berikut ini kode HTML5 dengan CSS Layout Flex.

<!DOCTYPE html>
<html lang="en">
  <head>
    <title>RWD with CSS Flexbox</title>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <style>
      * {
        box-sizing: border-box;
        margin: 0;
        padding: 0;
      }
      body {
        font-family: Arial, Helvetica, sans-serif;
      }

      /* Style the header */
      header {
        background-color: #666;
        padding: 10px;
        text-align: center;
        font-size: 35px;
        color: #fff;
      }

      /* Container for flexboxes */
      section {
        display: flex;
      }

      /* Style the navigation menu */
      nav {
        flex: 1;
        background: #ccc;
        padding: 20px;
        height: 300px;
      }

      /* Style the list inside the menu */
      nav ul {
        list-style-type: none;
        padding: 0;
      }

      /* Style the content */
      article {
        flex: 6;
        background-color: #f1f1f1;
        padding: 10px;
      }

      /* Style the footer */
      footer {
        background-color: #777;
        padding: 10px;
        text-align: center;
        color: white;
      }

      /* Responsive layout 
      makes the menu and the content (inside the section) sit on top of each other 
      instead of next to each other */
      @media (max-width: 600px) {
        section {
          flex-direction: column;
        }
      }
    </style>
  </head>
  <body>
    <header>
      <p>R W D</p>
    </header>

    <section>
      <nav>
        <ul>
          <li><a href="#">HTML5</a></li>
          <li><a href="#">CSS3</a></li>
          <li><a href="#">JavaScript ES6</a></li>
        </ul>
      </nav>

      <article>
        <h1>Responsive Web Design (RWD)</h1>
        <p>
          This website is using CSS Layout Flexbox. We create a header, two
          columns/boxes and a footer. On smaller screens, the columns will stack
          on top of each other.
        </p>
        <p>Resize the browser window to see the responsive effect.</p>
        <p>
          <strong>Note:</strong> Flexbox is not supported in Internet Explorer
          10 and earlier versions.
        </p>
        <p>
          You can learn more about this in
          <a href="https://www.w3schools.com/html/html_responsive.asp"
            >HTML Responsive.</a
          >
        </p>
      </article>
    </section>

    <footer>
      <p>&copy; 2023</p>
    </footer>
  </body>
</html>

Berikut ini kode HTML5 dengan CSS Layout Grid.

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>RWD with CSS Grid</title>
    <style>
      * {
        margin: 0;
        padding: 0;
      }
      body {
        font-family: Arial, Helvetica, sans-serif;
      }
      .wrapper {
        display: grid;
        grid-gap: 0.1em;
        grid-template-areas: "header" "sidebar" "content" "sidebar2" "footer";
      }
      header {
        grid-area: header;
        padding: 10px;
        background-color: #666;
        color: #fff;
        text-align: center;
        font-size: 35px;
      }
      nav {
        grid-area: sidebar;
        padding: 20px;
        background-color: #ccc;
        color: #444;
        width: 180px;
        height: 300px;
      }
      aside {
        grid-area: sidebar2;
        padding: 10px;
        background-color: #ccc;
        color: #444;
      }
      section {
        grid-area: content;
        padding: 10px;
      }
      footer {
        grid-area: footer;
        padding: 10px;
        background-color: #666;
        color: #fff;
        text-align: center;
      }

      @media (min-width: 600px) {
        .wrapper {
          grid-gap: 5px;
          grid-template-columns: 220px auto 200px;
          grid-template-areas: "header header  header" "sidebar content sidebar2" "footer  footer  footer";
        }
      }
    </style>
  </head>
  <body>
    <div class="wrapper">
      <header>R W D</header>
      <nav>
        <ul>
          <li><a href="#">HTML5</a></li>
          <li><a href="#">CSS3</a></li>
          <li><a href="#">JavaScript ES6</a></li>
        </ul>
      </nav>
      <aside>Right Sidebar</aside>
      <section>
        <h1>Responsive Web Design (RWD)</h1>
        <p>
          The CSS Grid Layout Module offers a grid-based layout system, with
          rows and columns, making it easier to design web pages without having
          to use floats and positioning.
        </p>
        <p>Resize the browser window to see the responsive effect.</p>
        <p>
          You can learn more about this in
          <a href="https://www.w3schools.com/html/html_responsive.asp"
            >HTML Responsive.</a
          >
        </p>
      </section>
      <footer>&copy; 2023</footer>
    </div>
  </body>
</html>

Silakan Anda coba ketiga teknik tersebut untuk membuat layout website atau aplikasi web menjadi responsif.

AJAX XHR vs Fetch API

Pada posting sebelumnya kita telah mencoba menggunakan AJAX (Asynchronous JavaScript and XML) dengan menggunakan object XHR (XMLHttpRequest), sebuah object JavaScript yang banyak digunakan dalam pengembangan website dinamis.

Pada artikel kali ini kita akan membandingkan teknologi pengembangan web yang menggunakan XHR dengan Fetch API. Keduanya berguna untuk membuat aplikasi web interaktif yang memungkinkan halaman web kita dapat memperbarui informasi secara asinkron tanpa harus memuat ulang seluruh halaman web.

Teknologi Ajax dengan menggunakan XHR sudah diperkenalkan sejak tahun 2006. Pada tahun 2015 diperkenalkan teknologi AJAX baru dengan menggunakan Fetch API. Fetch API dirancang untuk menggantikan teknologi XHR dalam pengambilan data dari server menggunakan JavaScript supaya lebih mudah.

Berikut ini contoh coding perbandingan AJAX XHR dan Fetch API:

<!DOCTYPE html>

<html lang=”en”>

  <head>

    <meta charset=”UTF-8″ />

    <meta name=”viewport” content=”width=device-width, initial-scale=1.0″ />

    <title>Belajar Dasar Ajax</title>

  </head>

  <body>

    <h1>Tutorial Ajax</h1>

    <button id=”button” onclick=”xhrloadContent()”>XHR Load Content</button>

    <button id=”button2″ onclick=”fetchloadContent()”>

      Fetch API Load Content

    </button>

    <div id=”hasil”></div>

    <script>

      const apiUrl = “https://jsonplaceholder.typicode.com/posts&#8221;;

      const xhr = new XMLHttpRequest();

      xhr.onreadystatechange = function () {

        if (this.readyState === 0) {

          console.log(“request not initialized: “, this.readyState);

        }

        if (this.readyState === 1) {

          console.log(“server connection established: “, this.readyState);

        }

        if (this.readyState === 2) {

          console.log(“request received: “, this.readyState);

        }

        if (this.readyState === 3) {

          console.log(“processing request: “, this.readyState);

        }

        if (this.readyState === 4) {

          console.log(

            “request finished and response is ready: “,

            this.readyState

          );

        }

      };

      xhr.open(“GET”, apiUrl, true);

      xhr.send();

      function xhrloadContent() {

        var xhr = new XMLHttpRequest();

        var url = “https://jsonplaceholder.typicode.com/posts&#8221;;

        xhr.onloadstart = function () {

          document.getElementById(“button”).innerHTML = “Loading…”;

        };

        xhr.onerror = function () {

          alert(“Gagal mengambil data”);

        };

        xhr.onloadend = function () {

          if (this.responseText !== “”) {

            var data = JSON.parse(this.responseText);

            var template = data.map((post) => {

              return `  <h3>${post.title}</h3>

                        <p>${post.body}</p>

                        <hr>

                        `;

            });

            document.getElementById(“hasil”).innerHTML = template.join(“<br>”);

            document.getElementById(“button”).innerHTML = “Done”;

            setTimeout(function () {

              document.getElementById(“button”).innerHTML = “Load Lagi”;

            }, 3000);

          }

        };

        xhr.open(“GET”, url, true);

        xhr.send();

      }

      function fetchloadContent() {

        var url = “https://jsonplaceholder.typicode.com/posts&#8221;;

        fetch(url)

          .then((response) => response.json())

          .then((data) => {

            console.log(“Success:”, data);

            var template = data.map((post) => {

              return `  <h3>${post.title}</h3>

                        <p>${post.body}</p>

                        <hr>

                        `;

            });

            document.getElementById(“hasil”).innerHTML = template.join(“<br>”);

          })

          .catch((error) => {

            console.error(“Error:”, error);

          });

        document.getElementById(“button2”).innerHTML = “Done”;

      }

    </script>

  </body>

</html>

Membuat Center Div

Ada kalanya dalam membuat sebuah halaman web kita membutuhkan bagian yang harus berada di tengah. Biasanya kita menggunakan CSS property “text-align:center”.

Disini akan diberikan 6 cara untuk membuat bagian yang harus berada di tengah itu dengan menggunakan tag div dan CSS.

Cara 1: Menggunakan class parent dan child dengan property “position: relative” dan “margin:auto”

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Centering divs</title>
    <style>
        * {
            box-sizing: border-box;
            margin: 0px;
            padding: 0px;
        }

        #parentContainer {
            width: 100%;
            height: 400px;
            background-color: #2196F3;
            position: relative;
        }

        #childContainer {
            width: 100px;
            height: 100px;
            background-color: #b5deff;
            position: absolute;
            top: 0;
            left: 0;
            bottom: 0;
            right: 0;
            margin: auto;
        }
    </style>
</head>

<body>
    <div id="parentContainer">Parent Container
        <div id="childContainer">Child Container</div>
    </div>
</body>

</html>

Cara 2: Menggunakan class parent dan child dengan property “margin: auto” saja

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Centering divs</title>
    <style>
        * {
            box-sizing: border-box;
            margin: 0px;
            padding: 0px;
        }

        .center {
            margin: auto;
            padding: 10px;
            width: 300px;
            border: 3px solid #2196F3;
            background-color: #b5deff;
            text-align: center;
        }
    </style>
</head>

<body>

    <h2>Center Align Elements</h2>
    <p>To horizontally center a block element (like div), use margin: auto;</p>

    <div class="center">
        <p>Hello World!</p>
    </div>

</body>

</html>

Cara 3: Menggunakan property “margin: auto” dengan content image

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Centering divs</title>
    <style>
        * {
            box-sizing: border-box;
            margin: 0px;
            padding: 0px;
        }

        .center {
            display: block;
            margin: auto;
            content: url("./gambartengah.jpg");
        }
    </style>
</head>

<body>

    <h2>Center Align Element</h2>
    <p>To horizontally center a block element (like div), use margin: auto;</p>

    <div class="center"></div>
</body>

</html>

Cara 4: Menggunakan property “position: absolute” dan “transform: translate(-50%, -50%)”

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Centering divs</title>
    <style>
        * {
            box-sizing: border-box;
            margin: 0px;
            padding: 0px;
        }

        .center {
            position: absolute;
            transform: translate(-50%, -50%);
            padding: 10px;
            border: 3px solid green;
            top: 50%;
            left: 50%;
        }
    </style>
</head>

<body>
   <h2>Center with position and transform</h2>

    <div class="center">
        <p>vertically and horizontally centered.</p>
    </div>

</body>

</html>

Cara 5: Menggunakan CSS Flexbox dengan property “display: flex” dan “justify-content: center” serta “align-items: center”

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Center Div 5</title>
    <style>
        * {
            box-sizing: border-box;
            margin: 0px;
            padding: 0px;
        }

        .center {
            display: flex;
            justify-content: center;
            align-items: center;
            height: 400px;
            border: 3px solid green;
        }
    </style>
</head>

<body>
    <h2>Flexbox Centering</h2>
    <div class="center">
        <p>I am vertically and horizontally centered.<br>
            <img src="./gambartengah.jpg" alt="Paris" /></p>
    </div>
</body>

</html>

Cara 6: Menggunakan CSS Grid dengan class parent child dan property “display: grid”, “justify-content: center” serta “align-content: center”

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Center Div 5</title>
    <style>
        * {
            box-sizing: border-box;
            margin: 0px;
            padding: 0px;
        }
        .parent {
            display: grid;
            justify-content: center;
            align-content: center;
            height: 600px;
            width: 100%;
            border: 1px solid black;
        }
        .child {
            height: 200px;
            width: 200px;
            background-color: #2196F3;
            text-align: center;
        }
    </style>
</head>

<body>
    <h2>Grid Centering</h2>

    <div class="parent">
        <div class="child">child</div>
    </div>
</body>

</html>

Selamat mencoba, semoga bermanfaat.

Happy Coding!

Membuat Multiple Select Option Checkbox

Pada tulisan kali ini kita akan mencoba membuat multiple select option dengan checkbox. Pada gambar di atas ada 2 bentuk select option. Yang pertama adalah multiple select option tanpa checkbox dan yang kedua adalah multiple select option dengan checkbox.

Untuk membuat multiple select option kita biasanya menggunakan HTML tag <select> dan <option> dengan memberikan atribut ‘multiple’ pada tag select. Berikut ini coding multiple select option yang biasa (tanpa checkbox).

<h2>Multiple Select Option</h2>
<form>
    <label>Pilihan: </label>
    Tekan tombol Ctrl untuk memilih beberapa pilihan<br />
    <select name="pilih[]" multiple style="height:70px;width:200px">
        <option value="0" disabled>Pilih Opsi</option>
        <option value='1'>Pilihan Pertama</option>
        <option value='2'>Pilihan Kedua</option>
        <option value='3'>Pilihan Ketiga</option>
    </select>
    <p><input type="submit" value="Submit"></p>
</form>

Untuk beberapa memilih opsi, kita harus tekan dan tahan tombol ‘Ctrl’ pada keyboard lalu klik opsi-opsi yang ada. Jika kita klik lagi satu opsi tanpa tekan tombol Ctrl maka pilihan yang sudah dipilih tadi akan hilang dan kita harus pilih lagi. Ini tentunya akan sedikit menyulitkan.

Nah, sekarang kita coba buat multiple select option dengan checkbox supaya kita tidak perlu menggunakan tombol ‘Ctrl’ untuk memilih opsinya sehingga opsi-opsi yang sudah dipilih tadi tidak hilang karena lupa tekan tombol ‘Ctrl’. Berikut ini coding multiple select option dengan checkbox. Pada coding tersebut kita menggunakan CSS untuk menempatkan posisi checkbox sedemikian rupa sehingga tampilannya seperti pada gambar diatas. Kita juga menggunakan javascript untuk membuat dropdown selectBox.

<style>
.multiselect{width:200px;}
.selectBox{position: relative;}
.selectBox select {width:100%;}
.overSelect {position: absolute;left: 0;right: 0;top: 0;bottom: 0;}
#checkboxes {display: none;border: 1px #a0a0a0 solid;}
#checkboxes label {display: block;}
#checkboxes label:hover {background-color: #1e90ff;}
</style>

<h2>Multiple Select Option Checkbox</h2>
<form>
    <div class="multiselect">
        <div class="selectBox" onclick="showCheckboxes()">
            <select>
                <option readonly>Pilih opsi</option>
            </select>
            <div class="overSelect"></div>
        </div>
        <div id="checkboxes">
            <label for="satu">
            <input type="checkbox" id="satu" name="pilih[]" value="1" />Pilihan Pertama</label>
            <label for="dua">
            <input type="checkbox" id="dua" name="pilih[]" value="2" />Pilihan Kedua</label>
            <label for="tiga">
            <input type="checkbox" id="tiga" name="pilih[]" value="3" />Pilihan Ketiga</label>
        </div>
    </div>
    <p><input type="submit" value="Submit"></p>
</form>

<script>
    var expanded = false;
    function showCheckboxes() {
        var checkboxes = document.getElementById("checkboxes");
        if (!expanded) {
            checkboxes.style.display = "block";
            expanded = true;
        } else {
            checkboxes.style.display = "none";
            expanded = false;
        }
    }
</script>

Selamat mencoba. Happy coding…

Membuat Dialog Box dengan HTML tag Dialog

Hai semua… kali ini saya akan memberikan cara membuat modal dialog box menggunakan tag HTML <dialog> dan javascript tanpa jquery.

Pada intinya tag dialog itu akan membuat kotak khusus sebagai subwindow atau bagian lain dari window kita. Biasanya dipakai untuk membuat pemberitahuan (alert) atau popup windows tanpa membuka window browser baru.

Contohnya kita ingin menampilkan dialog box berisi form yang bisa diisi dan diambil datanya.

<dialog id="dialogBox">
        <form method="dialog">
            <p><label>Warna favorit:
                    <select>
                        <option></option>
                        <option>Merah</option>
                        <option>Kuning</option>
                        <option>Hijau</option>
                    </select>
                </label></p>
            Nama: <input type="text" name="nama" id="nama" size="5" />
            <menu>
                <button value="cancel">Cancel</button>
                <button id="confirmBtn" value="default">Confirm</button>
            </menu>
        </form>
    </dialog>

    <menu>
        <button id="openForm">Open form</button>
    </menu>

    <output aria-live="polite"></output>

Ada 2 field dalam form ini yaitu combo box dan text box. Kemudian diberikan 2 tombol: Cancel dan Confirm di dalam form tersebut.

Lalu kita sediakan tombol untuk membuka dialog form tersebut.

Tag output disediakan untuk menampilkan form dialog box yang dibuka dengan tombol ‘Openform’. Attribut aria-live=”polite” pada tag output diberikan untuk membuat screen reader menunggu sampai user melakukan perubahan pada tag output.

Selanjutnya kita buat coding javascriptnya berikut ini.

        const updateButton = document.getElementById('openForm');
        const dialogBox = document.getElementById('dialogBox');
        const outputBox = document.querySelector('output');
        const selectEl = document.querySelector('select');
        const nama = document.getElementById('nama');
        const confirmBtn = document.getElementById('confirmBtn');

        // "Open form" button opens the <dialog> modally
        updateButton.addEventListener('click', function onOpen() {
            if (typeof dialogBox.showModal === "function") {
                dialogBox.showModal();
            } else {
                alert("The <dialog> API is not supported by this browser");
            }
        });
        // input sets the value of the submit button
        selectEl.addEventListener('change', function onSelect(e) {
            confirmBtn.value = selectEl.value;
        });
        // "Confirm" button of form triggers "close" on dialog because of [method="dialog"]
        dialogBox.addEventListener('close', function onClose() {
            outputBox.value = "Warna favorit " + nama.value + " adalah " + dialogBox.returnValue;
        });

Itulah cara untuk membuat modal dialog box dengan html tag <dialog> dan javascript sederhana. Selamat mencoba, semoga berhasil.

Mengamankan Data Input User

Pada artikel sebelumnya, saya telah menuliskan tentang cara Membuat Script Login yang Aman dengan PHP dan MySQL. Kali ini saya akan berikan sekali lagi cara mengamankan data yang di-input oleh user.

Jika kita ingin mendapatkan data dari user, tentu kita sediakan field input. Pada dasarnya user dapat memasukan apa saja dalam field input tersebut.

“Never trust user data”

Nah, supaya data yang diinput oleh user itu aman, kita perlu melakukan validasi terhadap data tersebut.
Caranya?

1. Pakai PHP strip_tags()
Contoh:
<?php
$user_input = "alert(‘AWAS!’);”;
echo strip_tags($user_input);
?>

2. Pakai trim(htmlspecialchars())
Contoh:
<?php
$user_input = "alert(‘AWAS’);”;
echo trim(htmlspecialchars($user_input));
}
?>

3. Pakai filter_input()
Contoh:
<?php
$user_input = "alert(‘AWAS’);”;
echo filter_input($user_input, FILTER_SANITIZE_STRIPPED);
?>

Untuk filter_input() tersedia beberapa pilihan filter.
Contoh:
filter_input($user_input, FILTER_SANITIZE_STRIPPED);
filter_input($user_input, FILTER_SANITIZE_STRING);
filter_input($user_input, FILTER_VALIDATE_EMAIL);
filter_input($user_input, FILTER_VALIDATE_INT);
filter_input($user_input, FILTER_VALIDATE_URL);

Anda bisa baca perbedaannya di sini https://www.php.net/manual/en/filter.filters.sanitize.php

Jadi supaya data yang di-input oleh user itu aman, sebenarnya kita cukup berikan filter_input() pada setiap field yang di-input oleh user. Pastikan setelah di-filter datanya sesuai yang kita mau ya…

Selamat mencoba. Semoga sukses.

Membuat Header dan Footer tetap di atas dan di bawah

Kita akan membuat header tetap berada di atas dan footer tetap berada di bawah jika posisi content di-scroll seperti pada gambar di atas. Walaupun content hanya berisi beberapa baris namun header dan footer tetap di posisinya.

Pada bagian div class fixed-header diberikan CSS properti top:0 untuk membuat header pada posisi atas layar dan pada bagian div class fixed-footer diberikan CSS properti bottom:0 untuk membuat footer pada posisi bawah layar. Untuk membuat posisi header dan footer tetap di posisinya, maka kita berikan CSS properti position: fixed; Walaupun halaman web ini di scroll namun posisi header tetap berada di atas dan footer tetap berada di bawah. Sebagai testing scroll halaman web diberikan CSS properti line-height: 100px; supaya halaman lebih panjang untuk scroll.

Berikut coding CSS dan HTML selengkapnya.

        body {
            margin: 0;
            padding: 0;
        }

        nav a {
            color: #fff;
            text-decoration: none;
            padding: 10px;
            display: inline-block;
        }

        nav a:hover {
            background-color: red;
        }

        .fixed-header,
        .fixed-footer {
            width: 100%;
            position: fixed;
            background: #333;
            padding: 5px;
            color: #fff;
        }

        .fixed-header {
            top: 0;
        }

        .fixed-footer {
            bottom: 0;
            text-align: center;
        }


        .content {
            width: 100%;
            padding-top: 60px;
            padding-bottom: 50px;
        }

        .content p {
            line-height: 100px;
            padding: 10px;
        }
    



    <div class="fixed-header">
        
            <a href="#">Home</a>
            <a href="#">About</a>
            <a href="#">Products</a>
            <a href="#">Contact Us</a>
        
    </div>
    <div class="content">
        <h1>Membuat Fixed Header dan Footer dengan CSS</h1>
        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam eu sem tempor, varius quam at, luctus dui.
            Mauris magna metus, dapibus nec turpis vel, semper malesuada ante. Vestibulum id metus ac nisl bibendum
            scelerisque non non purus. Suspendisse varius nibh non aliquet sagittis. In tincidunt orci sit amet
            elementum vestibulum. Vivamus fermentum in arcu in aliquam. Quisque aliquam porta odio in fringilla. Vivamus
            nisl leo, blandit at bibendum eu, tristique eget risus. Integer aliquet quam ut elit suscipit, id interdum
            neque porttitor. Integer faucibus ligula.
        </p>
        <p>Quis quam ut magna consequat faucibus. Pellentesque eget nisi a mi suscipit tincidunt. Ut tempus dictum
            risus. Pellentesque viverra sagittis quam at mattis. Suspendisse potenti. Aliquam sit amet gravida nibh,
            facilisis gravida odio. Phasellus auctor velit at lacus blandit, commodo iaculis justo viverra. Etiam vitae
            est arcu. Mauris vel congue dolor. Aliquam eget mi mi. Fusce quam tortor, commodo ac dui quis, bibendum
            viverra erat. Maecenas mattis lectus enim, quis tincidunt dui molestie euismod. Curabitur et diam tristique,
            accumsan nunc eu, hendrerit tellus.
        </p>
    </div>
    <div class="fixed-footer">
        Copyright &copy; 2021
    </div>



Selamat mencoba. Happy coding…

Membuat Display Card secara Vertical

Untuk menampilkan CSS Card secara horizontal kita dapat membuatnya dengan coding berikut ini.

<!doctype HTML>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>CSS Vertical Cards</title>
  <style> 
html, body {
  font-family: 'Open Sans', 'Helvetica Neue', sans-serif;
  margin:0;padding:0;
}
header {
  overflow: hidden;
  background-color:#1A237E;
  color:#ffffff;
  padding: 10px;
  text-align: center;
  font: bold 25px Roboto;
}
nav {
  background-color:#3F51B5;
  padding: 5px;
  text-align: center;
}
select {
  border: 0;
  font: 20px Roboto;
}
article {
  display: grid;
  grid-gap: 0px;
  grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
  grid-auto-rows: max-content;
  grid-auto-flow: row dense;
}
.card {
    box-shadow: 0 4px 8px 0 rgba(0,0,0,0.2);
    transition: 0.3s;
    width: 95%;
	margin:10px;
}
.card:hover {
    box-shadow: 0 8px 16px 0 rgba(0,0,0,0.2);
}
.container {
    padding: 2px 10px;
}
footer {
  position: relative;
  left: 0;
  bottom: 0;
  padding: 2px 0;
  height: 40px;
  width: 100%;
  background-color:#1A237E;
  color: white;
  text-align: center;
  font: 12px Arial;
}
@keyframes spin {to {stroke-dashoffset:-264;}}
.spinner circle {
  fill: none;
  stroke: yellow;
  stroke-width: 16;
  stroke-linecap: round;
  stroke-dasharray: 0, 0, 70, 194;
  stroke-dashoffset: 0;
  animation: spin 1s infinite linear;
}
</style>
</head>
<body>
  <header>CSS Vertical Cards</header>
  <nav>
    <select id="sources" onchange='document.getElementById("spinner").style.display="inline";'>
	<option value="cat1">Category 1</option>
	<option value="cat2">Category 2</option>
	<option value="cat3">Category 3</option>
	<option value="cat4">Category 4</option>
	<option value="cat5">Category 5</option>
    </select>
    <svg id="spinner" class="spinner" viewBox="0 0 100 100" width="20" height="20" style="display:none;">
     <circle cx="50" cy="50" r="42" transform="rotate(-90,50,50)"></circle></svg>
  </nav>
  <article>
	<div class="card">
	  <img src="https://cdn.mos.cms.futurecdn.net/8pa9E97uBFicnzfDGWcuFW-1200-80.jpg" alt="Amazon Echo Show review" style="width:100%">
	  <div class="container">
		<a href="https://www.techradar.com/reviews/amazon-echo-show-review">
		<h3>Amazon Echo Show review</h3></a>
		<p>This isn't Amazon's first entry into the world of smart screens – the company has two smart screen products currently on the market - the original Echo Show and the smaller Echo Spot. While the Spot is an incredibly cute, quirky little guy with charm in spade…..</p>
	</div>
	</div>		
	<div class="card">
	  <img src="https://cdn.mos.cms.futurecdn.net/kdjAsfBqajhQR2ZFTu7CAb-1200-80.jpg" alt="Your iPad Pro might have a bend but it’s not a defect" style="width:100%">
	  <div class="container">
	<a href="https://www.techradar.com/news/your-ipad-pro-might-have-a-bend-but-its-not-a-defect">
	<h3>Your iPad Pro might have a bend but it’s not a defect</h3></a>
	<p>Back in November we started hearing reports that some of Apple’s latest iPads – the iPad Pro 11 and iPad Pro 12.9 (2018) - were exhibiting slight bends, either straight out of the box or after normal use. Now, Apple has responded to these claims, admitting th…..</p>
	 </div>
	</div>				  
<div class="card">
	<img src="https://cdn.mos.cms.futurecdn.net/ugAWR3oUmPFtzrKs5ptJwP-1200-80.jpg" alt="PlayStation Classic drops to just $75 on Amazon" style="width:100%">
	<div class="container">
	<a href="https://www.techradar.com/news/playstation-classic-drops-to-just-dollar75-on-amazon">
	<h3>PlayStation Classic drops to just $75 on Amazon</h3></a>
	<p>Sony’s PlayStation Classic is an amazing device, but we found it doesn’t quite measure up to Nintendo’s NES and SNES nostalgia boxes. Namely, the PS1 revival machine’s games catalog left out some of heavy-hitters. But, thanks to a $25 off deal on Amazon right…..</p>
	</div>
	</div>		
	<div class="card">
	<img src="https://cdn.mos.cms.futurecdn.net/tpDMjdzhEQ4Fe2czRELHhH-1200-80.jpg" alt="HP Spectre Folio review" style="width:100%">
	<div class="container">
	<a href="https://www.techradar.com/reviews/hp-spectre-folio-review">
	<h3>HP Spectre Folio review</h3></a>
	<p>When HP unveiled the HP Spectre Folio earlier this year, it made some big claims about how the 2-in-1 laptop would reinvent the PC. That’s a pretty huge promise, especially as we’ve seen a number of innovative designs that have changed how we think about PCs.…..</p>
	 </div>
	</div>		
			  
	<div class="card">
	  <img src="https://cdn.mos.cms.futurecdn.net/fPJqvxAMVtc46AyzAKVPbX-1200-80.jpg" alt="TechRadar's Holiday Gift Guide 2018" style="width:100%">
	  <div class="container">
	        <a href="https://www.techradar.com/best/holiday-gift-guide-2018">
	        <h3>TechRadar's Holiday Gift Guide 2018</h3></a>
		<p>The TechRadar editorial team spends all year testing and writing about gadgets so that you, the consumer, know about the best gadgets to buy. And there's no more important time for us than Black Friday and Cyber Monday. It's when we see our tech buying advice…..</p>
	   </div>
	</div>		
			  
	<div class="card">
	  <img src="https://cdn.mos.cms.futurecdn.net/FtQZs2si8P9CozVhQ8W56c-1200-80.jpg" alt="10 ways to stay connected on the go without your smartphone" style="width:100%">
	  <div class="container">
	        <a href="https://www.techradar.com/news/10-ways-to-stay-connected-on-the-go-without-your-smartphone">
		<h3>10 ways to stay connected on the go without your smartphone</h3></a>
		<p>Ten years after the first iPhone burst onto the scene, defining the smartphone, more than a billion people across the world use a smartphone every day, and in the west roughly two-thirds of the population have committed to the ‘smart’ life. From breakfast to …..</p>
	     </div>
	 </div>		
    </article>
<footer><p>CSS Card Vertical © 2019</p></footer>
</body>
</html>

Selamat mencoba. Semoga berhasil.

Membuat Display Card secara Horizontal

CSSHorizontalCard

Untuk menampilkan CSS Card secara horizontal kita dapat membuatnya dengan coding berikut ini.
Pada script CSS kita gunakan ukuran tinggi dan lebar secara relative dengan satuan em (2em = 2 kali ukuran font saat ini) dan juga vh (1vh = 1% dari tinggi viewport).
Pada script CSS ini juga kita buat supaya tampilan text yang terlalu panjang ditampilkan gradient seolah-olah akan hilang/putus seperti pada card 5.

Berikut coding selengkapnya.

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>CSS Horizontal Cards</title>
	<style>
	html,body {
	  margin: 0; padding:0;
	  width: 100vw;
	  overflow-x: hidden;
	  background-color: #f0f0f0;
	  font: 14px 'Open Sans', sans-serif;
	  line-height: 1.4em;
	  color: #404646;
	}
	header {
	  overflow: hidden;
	  background-color:#1565C0;
	  color:#ffffff;
	  padding: 10px;
	  text-align: center;
	  font: bold 25px Roboto;
	}
	.container {
	  box-sizing: border-box;
	  min-height: 83vh;
	  width: 100%;
	  margin: auto;
	  display: flex;
	  flex-flow: row wrap;
	  align-content: flex-start;
	  padding: 0.2em;
	}
	.card {
	  margin: 0.5em 1.2em 0.5em 0.1em;
	  height: 14em;
	  max-width: 99%;
	  flex: 1 1 auto;
	  display: flex;
	  background-color: white;
	  box-shadow: 1px 3px 3px rgba(0, 10, 20, 0.06);
	  border-radius: 15px;
	}
	.card img {
	  height: 100%;
	  max-width: 10em;
	  -o-object-fit: cover;
		 object-fit: cover;
	  flex: 1 1 auto;
	  border-radius: 15px 0 0 15px;
	}
	.card-body {
	  width: 12em;
	  max-height: 100%;
	  flex: 1 1 auto;
	  display: flex;
	  flex-flow: column nowrap;
	  justify-content: flex-start;
	  padding: 1em;
	}
	.card-body button {
	  min-width: 8.3em;
	  flex: none;
	  align-self: flex-start;
	  margin-top: auto;
	  padding: 0.6em 1.2em;
	  font-size: 0.92em;
	  color: #404646;
	  background: none;
	  border: 0.5px solid #777;
	  border-radius: 5px;
	}
	.card-body button:hover {
	  border-color: #BBDEFB;
	  background:#BBDEFB;
	}
	.card-text {
	  position: relative;
	  flex: 1;
	  overflow: hidden;
	  text-overflow: ellipsis;
	  margin: 0 0 0.8em 0;
	  padding: 0;
	}
	.card-text h3, .card-text p {
	  margin-top: 0;
	}
	.card-text:after {
	  position: absolute;
	  bottom: 0;
	  content: "";
	  width: 100%;
	  height: 1em;
	  background: linear-gradient(rgba(255, 255, 255, 0), white);
	}
	a {
	  color: #d07777;
	  text-decoration: none;
	}
	a:hover {
	  text-decoration: underline;
	}
	footer {
	  position:relative;
	  left: 0;
	  bottom: 0;
	  height: 40px;
	  width: 100%;
	  background-color:#1565C0;
	  color: white;
	  text-align: center;
	  vertical-align: text-bottom;
	}
	</style>
</head>
<body>
	<header>CSS Horizontal Cards</header>
	<div class='container'>
		<div class='card'>
			<img src='https://images.pexels.com/photos/462235/pexels-photo-462235.jpeg?auto=compress&amp;cs=tinysrgb&amp;h=750&amp;w=1260'>
			<div class='card-body'>
			  <div class='card-text'>
				<h3>1. Lorem ipsum</h3>
				<p>
				  Also check out the
				  <a href='https://codepen.io/abcretrograde/pen/ZogNOZ' target='_blank'>Grid&nbsp;version</a>
				</p>
			  </div>
			  <button>More...</button>
			</div>
		</div>
		
		<div class='card'>
			<img src='https://images.pexels.com/photos/1065711/pexels-photo-1065711.jpeg?auto=compress&amp;cs=tinysrgb&amp;h=750&amp;w=1260'>
			<div class='card-body'>
			  <div class='card-text'>
				<h3>2. Lorem ipsum</h3>
				<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
			  </div>
			  <button>More...</button>
			</div>
		</div>
		
		<div class='card'>
			<img src='https://images.pexels.com/photos/139248/pexels-photo-139248.jpeg?auto=compress&amp;cs=tinysrgb&amp;h=750&amp;w=1260'>
			<div class='card-body'>
			<div class='card-text'>
				<h3>3. Lorem ipsum</h3>
				<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
			</div>
			<button>More...</button>
			</div>
		</div>
		
		<div class='card'>
			<img src='https://images.pexels.com/photos/6273/home-decoration-interior-decor.jpg?auto=compress&amp;cs=tinysrgb&amp;h=750&amp;w=1260'>
			<div class='card-body'>
			  <div class='card-text'>
				<h3>4. Lorem ipsum</h3>
				<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
			  </div>
			  <button>More...</button>
			</div>
		</div>
		
		<div class='card'>
			<img src='https://images.pexels.com/photos/924675/pexels-photo-924675.jpeg?auto=compress&amp;cs=tinysrgb&amp;h=750&amp;w=1260'/>
			<div class='card-body'>
			  <div class='card-text'>
				<h3>5. Lorem ipsum</h3>
				Lorem Ipsum is simply dummy text of the printing and typesetting industry. 
				Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, 
				when an unknown printer took a galley of type and scrambled it to make a type specimen book. 
				It has survived not only five centuries, but also the leap into electronic typesetting, 
				remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset 
				sheets containing Lorem Ipsum passages, and more recently with desktop publishing software 
				like Aldus PageMaker including versions of Lorem Ipsum.In porttitor porta mi pharetra tempor.</p>
			  </div>
			  <button>More...</button>
			</div>
		</div>
	</div>
	<div style="clear: both;"></div>
	<footer><p>CSS Horizontal Card - &copy; 2019</p></footer>
</body>
</html>

Selamat mencoba. Semoga bermanfaat.