แผนที่รูปภาพที่ตอบสนอง


145

ฉันมีแผนที่รูปภาพที่มีอยู่ในเค้าโครง HTML ที่ตอบสนองได้ดี ปรับขนาดภาพตามขนาดเบราว์เซอร์ แต่พิกัดภาพเป็นขนาดพิกเซลคงที่แน่นอน ตัวเลือกใดที่ฉันต้องปรับขนาดพิกัดแผนที่รูปภาพ


6
คำถามนี้ไม่เกี่ยวกับแผนที่ทางภูมิศาสตร์ แต่แท็ก <map> html
jdog

4
ลองใช้ปลั๊กอินแผนที่รูปภาพ มันทำงานร่วมกับ Javascript, Node และ jQuery
Travis Clarke

2
คุณสามารถใช้ภาพ SVG แทน ฉันขอแนะนำให้อ่านการใช้ SVG เป็นทางเลือกสำหรับ Imagemaps
Mawg พูดว่าการคืนสถานะโมนิก้า

1
ฟังดูเหมือนสิ่งที่เราต้องการคือความสามารถในการอัปโหลด JPEG หรือคล้ายกับแอพที่ให้คุณระบุตำแหน่งแผนที่บนภาพ (เช่นที่ dot-map dot net) - ในพื้นหลังสิ่งนี้จะสร้างไฟล์ SVG ที่โปร่งใสเป็นหลัก . จากนั้นเราต้องการให้แผนที่นำไปใช้กับ SVG และแสดง SVG ที่ด้านบนของ JPG ในเว็บเบราว์เซอร์ เมื่อเบราว์เซอร์ปรับขนาด JPG, SVG จะถูกปรับขนาดด้วยและ SVG จะถูกเรียกใช้เมื่อคลิกที่แผนที่รูปภาพ มีข้อเสนอแนะใด ๆ ในส่วนนี้หรือไม่?
youcantryreachingme

2
ใช่นั่นคือสิ่งที่ฉันต้องการในปี 2011
jdog

คำตอบ:


90

สำหรับแผนที่รูปภาพที่ตอบสนองคุณจะต้องใช้ปลั๊กอิน:

https://github.com/stowball/jQuery-rwdImageMaps (ไม่มีการบำรุงรักษาอีกต่อไป)

หรือ

https://github.com/davidjbradshaw/imagemap-resizer


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

http://www.howtocreate.co.uk/tutorials/html/imagemaps

และหน้านี้สำหรับการทดสอบว่าเบราว์เซอร์ใช้หรือไม่

http://home.comcast.net/~urbanjost/IMG/resizeimg3.html


5
สิ่งนี้ยังเกี่ยวข้องหรือไม่ กรุณาให้การปรับปรุงได้ไหม
มาลาคี

1
@Malachi ใช่สิ่งนี้ยังเกี่ยวข้อง
Tom

ขอบคุณทอมเราได้มีการอภิปรายเกี่ยวกับคำถามเกี่ยวกับ CodeReview ตอนนี้ฉันหวังว่าฉันจะจำคำถาม ....
มาลาคี

@ Tom ใช้งานได้กับหนึ่งภาพเท่านั้น .. ถ้าเราวางภาพอื่นแล้วมันไม่ทำงานสำหรับภาพที่สองและสาม ฯลฯ ... เพียงตรวจสอบ ..
2413

1
ฉันพบเครื่องมือตัวสร้างออนไลน์ที่ใช้ SVG ซึ่งเบราว์เซอร์หลักทั้งหมดเข้าใจimagemapper.noc.io
frthjf

43

คุณสามารถใช้ svg แทนแผนที่รูปภาพ ;)

มีการสอนเกี่ยวกับวิธีการทำเช่นนี้

  • นี่คือ jsfiddle พร้อมเอฟเฟกต์โฮเวอร์คำอธิบายและลิงก์: http://jsfiddle.net/eLbpmsaj/

.hover_group:hover {
  opacity: 1;
}
#projectsvg {
  position: relative;
  width: 100%;
  padding-bottom: 77%;
  vertical-align: middle;
  margin: 0;
  overflow: hidden;
}
#projectsvg svg {
  display: inline-block;
  position: absolute;
  top: 0;
  left: 0;
}
<figure id="projectsvg">
  <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 1920 1080" preserveAspectRatio="xMinYMin meet" >
<!-- set your background image -->
<image width="1920" height="1080" xlink:href="http://placehold.it/1920x1080" />
<g class="hover_group" opacity="0">
  <a xlink:href="https://example.com/link1.html">
    <text x="652" y="706.9" font-size="20">First zone</text>
    <rect x="572" y="324.1" opacity="0.2" fill="#FFFFFF" width="264.6" height="387.8"></rect>
  </a>
</g>
<g class="hover_group" opacity="0">
  <a xlink:href="https://example.com/link2.html">
    <text x="1230.7" y="952" font-size="20">Second zone</text>
    <rect x="1081.7" y="507" opacity="0.2" fill="#FFFFFF" width="390.2" height="450"></rect>
  </a>
</g>
  </svg>
</figure>


1
ลิงก์บทสอนเสีย ภาพจาก jsfiddle เช่นกัน
Cristiano Maia

ฉันส่งสัญญาณลิงก์การสอนเสียหายและอัปเดตข้อมูลโค้ด jsfiddle และรหัส ขอบคุณสำหรับหัวขึ้น
belgac

นี่เป็นทางออกที่น่าอัศจรรย์ ฉันใช้มันสำเร็จและใช้งานได้อย่างมีเสน่ห์ ขอบคุณ!
Jaume Mussons Abad

3
จนถึงทางออกที่ดีที่สุดในปี 2020 ลองใช้ตัวสร้างรหัสนี้เพื่อให้ง่ายสุด ๆ imagemapper.noc.io/#
Brett Donald

1
สิ่งนี้จะต้องเป็นทางออกที่ดีที่สุดในปี 2020
mythicalcoder

39

1
เพียงแค่และ FYI สำหรับ eveyrone ... ฉันพบว่ามันใช้งานได้ดี แต่ไม่ใช่ในหีบเพลง ฉันใช้ Bootstrap 3 และหากคุณไม่โหลดหน้าเว็บโดยเปิดหีบเพลงบนรูปภาพเมื่อคุณเปิดหีบเพลงแผนที่รูปภาพจะไม่อยู่ที่นั่นเว้นแต่ว่ามีการปรับขนาดหน้าต่างเบราว์เซอร์
jasonflaherty

1
@jasonflaherty คุณสามารถเรียกเหตุการณ์การปรับขนาดเพื่อบังคับแผนที่ให้แสดงได้หรือไม่ $(window).trigger('resize');
Steve Meisner

@SteveMeisner ฉันไม่ได้ลอง ... แต่จะไม่บังคับให้รีเฟรชเหรอ?
jasonflaherty

@ jasonflaherty ไม่! มันเป็นเพียงแค่ "ทริกเกอร์" เหตุการณ์การปรับขนาดในองค์ประกอบที่คุณผูกไว้ ( windowในกรณีนี้) โชคดี.
Steve Meisner

เพิ่งสร้างโมดูล Drupal ขั้นพื้นฐานที่ใช้งานง่าย แต่มีประโยชน์โดยใช้ปลั๊กอินนี้: drupal.org/project/responsive_imagemaps
Joshua Stewardson

19

ฉันวิ่งข้ามโซลูชันที่ไม่ได้ใช้แผนที่รูปภาพเลย แต่เป็นการยึดแท็กที่อยู่เหนือรูปภาพ ข้อเสียเปรียบเพียงอย่างเดียวคือฮอตสปอตจะต้องเป็นรูปสี่เหลี่ยม แต่ข้อดีคือโซลูชันนี้ไม่ได้พึ่งพาจาวาสคริปต์เพียง CSS มีเว็บไซต์ที่คุณสามารถใช้เพื่อสร้างรหัส HTML สำหรับแองเคอร์ได้: http://www.zaneray.com/responsive-image-map/

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


2
ยินดีที่ได้พบ! ขอบคุณที่ร่วมรายการนี้
jdog

1
ฉันไม่สามารถลงคะแนนใน naswer นี้ได้มากพอ !! การสอนที่ยอดเยี่ยม ครอบคลุมและง่ายต่อการทำภายใต้ หนึ่งควรอ่านมันทั้งหมด แต่ที่น่าสนใจโดยเฉพาะคือtutorials.jenkov.com/svg/scripting.html
Mawg พูดว่าการคืนสถานะโมนิก้า

นี่เป็นวิธีการแก้ปัญหาที่เรียบง่ายและดีมากหากพื้นที่ที่ต้องคลิกคือสี่เหลี่ยมผืนผ้า
2875289

มันยอดเยี่ยมมาก ทำงานให้ฉันด้วยเช่นกันกับไซต์ DNN ดังที่เจฟฟรีย์กล่าวว่าฉันเพิ่งลบ <img> และ html ที่สร้างขึ้นภายใน div ที่สัมพันธ์กัน ขอบคุณ!
Ted Krapf

18

ฉันพบวิธีที่ไม่มี JS เพื่อแก้ไขปัญหานี้หากคุณโอเคกับพื้นที่ที่ถูกตีเป็นรูปสี่เหลี่ยมผืนผ้า

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

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

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

<div style="position: relative;">
  <img src="background-image.png" style="width: 100%; height: auto;">
  <a href="/link1"><div style="position: absolute; left: 15%; top: 20%; width: 12%; height: 8%; background-color: rgba(0, 0, 0, .25);"></div></a>
  <a href="/link2"><div style="position: absolute; left: 52%; top: 38%; width: 14%; height: 20%; background-color: rgba(0, 0, 0, .25);"></div></a>
</div>

ใช้รหัสนี้กับผู้ตรวจสอบรหัสของคุณใน Chrome หรือเบราว์เซอร์ที่คุณเลือกและปรับเปอร์เซ็นต์ (คุณสามารถใช้เปอร์เซ็นต์ทศนิยมให้แม่นยำยิ่งขึ้น) จนกว่ากล่องจะถูกต้อง นอกจากนี้ยังเลือกbackground-colorของtransparentเมื่อคุณพร้อมที่จะใช้มันตั้งแต่คุณต้องการพื้นที่ตีของคุณจะมองไม่เห็น


นี่เป็นทางออกที่ยอดเยี่ยม! ขอบคุณ
xims

ทางออกที่ดี! UIkit ใช้เทคนิคเดียวกันกับเครื่องหมายของพวกเขา: getuikit.com/docs/marker
xela84

วิธีแก้ปัญหาที่ยอดเยี่ยมขอบคุณสำหรับการแบ่งปัน! ฉันใช้สิ่งนี้ในแอพมือถือและแก้ปัญหาหน้าจอที่แตกต่างกัน
JohnGIS

11

David Bradshaw เขียนห้องสมุดเล็ก ๆ ที่ช่วยแก้ปัญหานี้ มันสามารถใช้งานได้โดยมีหรือไม่มี jQuery

มีให้ที่นี่: https://github.com/davidjbradshaw/imagemap-resizer


ยืนยันว่าทำงานกับ Chrome / IE / FF เวอร์ชันล่าสุดตามความคิดเห็นนี้
James Paterson

1
ทำงานได้ดีสำหรับฉันส่วนติดต่อที่เรียบง่ายสุด ๆ
Brian

7

วิธีการต่อไปนี้ทำงานได้อย่างสมบูรณ์แบบสำหรับฉันดังนั้นนี่คือการใช้งานอย่างเต็มรูปแบบของฉัน:

<img id="my_image" style="display: none;" src="my.png" width="924" height="330" border="0" usemap="#map" />

<map name="map" id="map">
    <area shape="poly" coords="774,49,810,21,922,130,920,222,894,212,885,156,874,146" href="#mylink" />
    <area shape="poly" coords="649,20,791,157,805,160,809,217,851,214,847,135,709,1,666,3" href="#myotherlink" />
</map>

<script>
$(function(){
    var image_is_loaded = false;
    $("#my_image").on('load',function() {
        $(this).data('width', $(this).attr('width')).data('height', $(this).attr('height'));
        $($(this).attr('usemap')+" area").each(function(){
            $(this).data('coords', $(this).attr('coords'));
        });

        $(this).css('width', '100%').css('height','auto').show();

        image_is_loaded = true;
        $(window).trigger('resize');
    });


    function ratioCoords (coords, ratio) {
        coord_arr = coords.split(",");

        for(i=0; i < coord_arr.length; i++) {
            coord_arr[i] = Math.round(ratio * coord_arr[i]);
        }

        return coord_arr.join(',');
    }
    $(window).on('resize', function(){
        if (image_is_loaded) {
            var img = $("#my_image");
            var ratio = img.width()/img.data('width');

            $(img.attr('usemap')+" area").each(function(){
                console.log('1: '+$(this).attr('coords'));
                $(this).attr('coords', ratioCoords($(this).data('coords'), ratio));
            });
        }
    });
});
</script>

4

ใช้งานได้สำหรับฉัน (อย่าลืมเปลี่ยน 3 สิ่งในรหัส):

  • ก่อนหน้ากว้าง (ขนาดภาพดั้งเดิม)

  • map_ID (รหัสแผนที่ภาพของคุณ)

  • img_ID (id ของภาพของคุณ)

HTML:

<div style="width:100%;">
    <img id="img_ID" src="http://www.gravatar.com/avatar/0865e7bad648eab23c7d4a843144de48?s=128&d=identicon&r=PG" usemap="#map" border="0" width="100%" alt="" />
</div>
<map id="map_ID" name="map">
<area shape="poly" coords="48,10,80,10,65,42" href="javascript:;" alt="Bandcamp" title="Bandcamp" />
<area shape="poly" coords="30,50,62,50,46,82" href="javascript:;" alt="Facebook" title="Facebook" />
<area shape="poly" coords="66,50,98,50,82,82" href="javascript:;" alt="Soundcloud" title="Soundcloud" />
</map>

javascript:

window.onload = function () {
    var ImageMap = function (map, img) {
            var n,
                areas = map.getElementsByTagName('area'),
                len = areas.length,
                coords = [],
                previousWidth = 128;
            for (n = 0; n < len; n++) {
                coords[n] = areas[n].coords.split(',');
            }
            this.resize = function () {
                var n, m, clen,
                    x = img.offsetWidth / previousWidth;
                for (n = 0; n < len; n++) {
                    clen = coords[n].length;
                    for (m = 0; m < clen; m++) {
                        coords[n][m] *= x;
                    }
                    areas[n].coords = coords[n].join(',');
                }
                previousWidth = img.offsetWidth;
                return true;
            };
            window.onresize = this.resize;
        },
        imageMap = new ImageMap(document.getElementById('map_ID'), document.getElementById('img_ID'));
    imageMap.resize();
    return;
}

JSFiddle: http://jsfiddle.net/p7EyT/154/


3

ฉันเจอกับข้อกำหนดเดียวกันที่ฉันต้องการแสดงแผนที่รูปภาพที่ตอบสนองซึ่งสามารถปรับขนาดด้วยขนาดหน้าจอและสิ่งสำคัญคือฉันต้องการเน้นที่พิกัดนั้น

ดังนั้นฉันจึงลองห้องสมุดหลายแห่งที่สามารถปรับขนาดพิกัดตามขนาดหน้าจอและกิจกรรม และฉันได้ทางออกที่ดีที่สุด (jquery.imagemapster.min.js) ซึ่งทำงานได้ดีกับเบราว์เซอร์เกือบทั้งหมด นอกจากนี้ฉันได้รวมเข้ากับSummer Plginซึ่งสร้างแผนที่รูปภาพ

 var resizeTime = 100;
 var resizeDelay = 100;    

$('img').mapster({
        areas: [
            {
                key: 'tbl',
                fillColor: 'ff0000',
                staticState: true,
                stroke: true
            }
        ],
        mapKey: 'state'
    });

    // Resize the map to fit within the boundaries provided

    function resize(maxWidth, maxHeight) {
        var image = $('img'),
            imgWidth = image.width(),
            imgHeight = image.height(),
            newWidth = 0,
            newHeight = 0;

        if (imgWidth / maxWidth > imgHeight / maxHeight) {
            newWidth = maxWidth;
        } else {
            newHeight = maxHeight;
        }
        image.mapster('resize', newWidth, newHeight, resizeTime);
    }

    function onWindowResize() {

        var curWidth = $(window).width(),
            curHeight = $(window).height(),
            checking = false;
        if (checking) {
            return;
        }
        checking = true;
        window.setTimeout(function () {
            var newWidth = $(window).width(),
                newHeight = $(window).height();
            if (newWidth === curWidth &&
                newHeight === curHeight) {
                resize(newWidth, newHeight);
            }
            checking = false;
        }, resizeDelay);
    }

    $(window).bind('resize', onWindowResize);
img[usemap] {
        border: none;
        height: auto;
        max-width: 100%;
        width: auto;
    }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<script src="https://cdn.jsdelivr.net/npm/jquery-imagemapster@1.2.10/dist/jquery.imagemapster.min.js"></script>

<img src="https://discover.luxury/wp-content/uploads/2016/11/Cities-With-the-Most-Michelin-Star-Restaurants-1024x581.jpg" alt="" usemap="#map" />
<map name="map">
    <area shape="poly" coords="777, 219, 707, 309, 750, 395, 847, 431, 916, 378, 923, 295, 870, 220" href="#" alt="poly" title="Polygon" data-maphilight='' state="tbl"/>
    <area shape="circle" coords="548, 317, 72" href="#" alt="circle" title="Circle" data-maphilight='' state="tbl"/>
    <area shape="rect" coords="182, 283, 398, 385" href="#" alt="rect" title="Rectangle" data-maphilight='' state="tbl"/>
</map>

หวังว่าจะช่วยให้ใครบางคน


2

http://home.comcast.net/~urbanjost/semaphore.htmlเป็นหน้าแรกของการสนทนาและมีลิงก์ไปยังโซลูชันที่ใช้ JavaScript เพื่อแก้ไขปัญหา ฉันได้รับการแจ้งเตือนว่า HTML จะรองรับหน่วยเปอร์เซ็นต์ในอนาคต แต่ฉันไม่ได้เห็นความคืบหน้าใด ๆ ในเวลานี้ (อาจจะนานกว่าหนึ่งปีเพราะฉันได้ยินมาว่าการสนับสนุนกำลังจะมาถึง) ดังนั้นการแก้ไข อาจคุ้มค่าที่จะดูว่าคุณพอใจกับ JavaScript / ECMAScript หรือไม่



1

ขึ้นอยู่กับว่าคุณสามารถใช้ jQuery เพื่อปรับช่วงตามสัดส่วนที่ฉันคิด ทำไมคุณถึงใช้แผนที่รูปภาพด้วย? คุณไม่สามารถใช้การปรับขนาด div หรือองค์ประกอบอื่น ๆ ได้หรือไม่


ในขณะที่โซลูชันที่แน่นอนจะทำงานกับ div ที่ปรับขนาดได้แผนที่รูปภาพคือ "การจัดการเนื้อหา" และอนุญาตสำหรับภูมิภาคทุกประเภท ขอบคุณฉันจะตรวจสอบ jquery สำหรับสิ่งนี้
jdog

1

สำหรับผู้ที่ไม่ต้องการใช้ JavaScript ต่อไปนี้เป็นตัวอย่างการแบ่งภาพ:

http://codepen.io/anon/pen/cbzrK

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


2
ขอบคุณสำหรับฝันร้าย!
jerrygarciuh

1
ลิงก์รูปภาพทั้งหมดใช้งานไม่ได้
Tyler Forsythe

0

คล้ายกับคำตอบของ Orland ที่นี่: https://stackoverflow.com/a/32870380/462781

รวมกับรหัสของ Chris ที่นี่: https://stackoverflow.com/a/12121309/462781

หากพื้นที่เหมาะสมในตารางคุณสามารถวางซ้อนพื้นที่ด้วยภาพโปร่งใสโดยใช้ความกว้างเป็น% ซึ่งจะคงอัตราส่วนไว้

    .wrapperspace {
      width: 100%;
      display: inline-block;
      position: relative;
    }
    .mainspace {
      position: absolute;
      top: 0;
      bottom: 0;
      right: 0;
      left: 0;
    }
<div class="wrapperspace">
 <img style="float: left;" title="" src="background-image.png" width="100%" />
 <div class="mainspace">
     <div>
         <img src="space-top.png" style="margin-left:6%;width:15%;"/>
     </div>
     <div>
       <a href="http://www.example.com"><img src="space-company.png" style="margin-left:6%;width:15%;"></a>
     </div>
  <div>
   <a href="http://www.example.com"><img src="space-company.png" style="margin-left:6%;width:10%;"></a>
   <a href="http://www.example.com"><img src="space-company.png" style="width:20%;"></a>
  </div>
 </div>
</div>

คุณสามารถใช้มาร์จิ้นเป็น% นอกจากนี้ยังสามารถวางรูปภาพ "space" ไว้ติดกันภายใน div ระดับ 3


0

ด้วยเหตุผลบางอย่างการแก้ปัญหาเหล่านี้ไม่ได้ผลสำหรับฉัน ฉันประสบความสำเร็จมากที่สุดในการใช้การแปลงร่าง

transform: translateX(-5.8%) translateY(-5%) scale(0.884);

0

ความกว้างที่ตอบสนอง & & ความสูง

window.onload = function () {
        var ImageMap = function (map, img) {
                var n,
                    areas = map.getElementsByTagName('area'),
                    len = areas.length,
                    coords = [],
                    imgWidth = img.naturalWidth,
                    imgHeight = img.naturalHeight;
                for (n = 0; n < len; n++) {
                    coords[n] = areas[n].coords.split(',');
                }
            this.resize = function () {
                var n, m, clen,
                    x = img.offsetWidth / imgWidth,
                    y = img.offsetHeight / imgHeight;
                    imgWidth = img.offsetWidth;
                    imgHeight = img.offsetHeight;
                for (n = 0; n < len; n++) {
                    clen = coords[n].length;
                    for (m = 0; m < clen; m +=2) {
                        coords[n][m] *= x;
                        coords[n][m+1] *= y;
                    }
                    areas[n].coords = coords[n].join(',');
                }
                    return true;
                };
                window.onresize = this.resize;
            },
        imageMap = new ImageMap(document.getElementById('map_region'), document.getElementById('prepay_region'));
        imageMap.resize();
        return;
    }

คุณสามารถเพิ่มเนื้อหาเพิ่มเติมที่แสดงความแตกต่างระหว่างรหัสของคุณ กับคำตอบของ Niente0 ได้หรือไม่?
ไมเคิล - ที่ไหน Clay Shirky
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.